一、log4net简介

Log4net是Apache下一个开放源码的项目,我们可以控制日志信息的输出目的地。
Log4net中定义了多种日志信息输出模式。
在做项目的时候最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难找到,于是我们需要大量的日志数据来精确的跟踪程序的运行状态。
Log4net可以帮我们来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台、文本文件、Windows日志事件查看器、数据库、邮件等位置,以便我们快速跟踪程序bug。

二、log4net结构
log4net主要分为5个核心组件:Logger、APPender、Filter、Layout、Object Render。

1、Logger:
   主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。
2、APPender:
   这里我们简单称之为“附着器”,意思就是说日志的输出必须依赖于它,更确切的说以文本形式输出,还是控制台格式输出都必须要依靠它来控制。log4net定义了多种附着器:
(1)AdoNetAppender:将日志记录到数据库中,可以采用SQL和存储过程两种方式。
(2)FileAppender:将日志写到文件中。
(3)MemoryAppender:将日志存到内存缓冲区。
(4)ConsoleAppender:将日志输出到控制台。
(5)EventLogAppender:将日志写到Windows Event Log中。
(6)ANSIColorTerminalAppender:在ANSI窗口终端写下高亮度的日志事件。
(7)ASPNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
(8)BufferingForwardingAppender:在输出到Appenders之前先缓存日志事件。
(9)RollingFileAppender:将日志以回滚文件的形式写到文件中。
(10)SmtpAppender:将日志写到邮件中。
3、Filter:
  Appender是将日志以缺省值的方式输出,意思就是按照默认值的方式输出。而Filter意思是过滤器,使用Filter可以将日志以不同的格式来输出。
4、Layout:
  这个用于控制日志输出显示格式。
5、Object Render
  用于按照用户自定义标准来输出日志。

三、Log4net参数:针对Layout设置日志输出的格式
1.%m(message):输出的日志消息
2.%n(new line):换行
3.%d(datetime):输出当前语句运行的时刻
4.%r(runtime):输出程序从运行到当前语句时消耗的毫秒数
5.%t(thread id):当前语句所在线程的ID
6.%p(priority):日志的当前优先级
7.%c(Class):当前日志对象的名称
8.%f(file):输出语句所在的文件名
9.%l(line):输出语句所在的行号
10.%数字:表示该项的最小宽度,如果不够,则用空格填充。

例如:"[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"
[时间]:2016-10-28 10:21:38,634
[级别]:INFO
[内容]:>>>>>>>>>>>

四、Log4net日志分类

Log4net 分为如下几个级别:
FATAL 毁灭级别
ERROR 错误级别
WARA  警告级别
INFO  消息级别
DEBUG 调试级别
这几种日志级别高低:FATAL>ERROR>WARA>INFO>DEBUG。
只有日志输出级别大于或等于配置的级别才能输出日志信息。
比如我的日志配置级别为INFO,那么只有log.info(),log.warm(),log.Error(),log.Fatal()才能输出日志信息,Debug方式就不能输出。
Log4net中还有两种特殊的配置级别:ALL -允许所有的日志级别输出,OFF - 拒绝所有的日志级别输出。

五、在配置中启用和关闭日志
在config文件中可以很方便地关闭和启用日志,就是在<root>进行配置,如下就是一个例子:

 <root>
<!--设置日志输出级别-->
<level value="INFO"></level>
<!--以文件的形式记录日志-->
<appender-ref ref="RollingLogFileAppender"></appender-ref>
<!--以控制台的形式记录日志-->
<appender-ref ref="ConsoleAppender"></appender-ref>
<!--以数据库的形式记录日志-->
<appender-ref ref="AdoNetAppender"></appender-ref>
</root>

在上面的例子中可以看出,如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name,如果想要取消,删除或者注释掉这行就可以了。

六、log4net使用

1、引用log4net.dll文件

使用log4net必须引入log4net.dll文件,两种下载log4net.dll的方式:

(1)、在Nuget中下载log4net

点击"安装"进行安装

(2)、在官网下载

官网网址:http://logging.apache.org/log4net/

下载DLL文件,解压之后根据.NET FRAMEWORK的版本,选择对应的DLL文件,文件路径:C:\Users\Lenovo\Desktop\log4net-2.0.7-bin-newkey\log4net-2.0.7\bin\net\4.5\release。

引用->添加引用,将下载的log4net.dll文件添加进来。

2、在config文件中的配置

首先要添加config文件,在类库项目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。或者新添加一个"应用程序配置文件",将配置信息添加在新的配置文件中,在本示例中,将配置信息添加在新的应用程序配置文件中。新的配置文件命名为:log4net.config。

注意:要将log4net.config的属性“复制到输出目录”设置为“始终复制”。在log4net上右键选择文件属性,修改属性

要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

 <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>

除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式。

在使用日志的类的命名空间前加上XmlConfiguratorAttribute标记

不加这个标记的话则log无法生效,如果类较多则比较麻烦,此时可以把这个配置放在AssemblyInfo.cs中,针对整个程序集生效。

(3)、示例程序

配置文件:

 <?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--把日志信息输出到文件里-->
<!-- 日志文件部分log输出格式的设定 -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志文件名开头-->
<file value="Logs/Log_"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<!--是否追加到文件,默认为true,通常无需设置-->
<appendToFile value="true"/>
<!--设置动态文件名-->
<StaticLogFileName value="false"/>
<!--变换的形式为日期,这种情况下每天只有一个日志-->
<!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义-->
<!--<rollingStyle value="Date"/>-->
<!--变换的形式为日志大小-->
<!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义-->
<RollingStyle value="Composite"/>
<!--日期的格式 (yyyyMMdd),每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<datePattern value="yyyy_MM_dd&quot;.log&quot;"/>
<!--每天记录的日志文件个数,与maximumFileSize配合使用-->
<MaxSizeRollBackups value=""/>
<!--每个日志文件的最大大小;可用的单位:KB|MB|GB;不要使用小数,否则会一直写入当前日志-->
<maximumFileSize value="8MB"/>
<!--日志格式-->
<layout type="log4net.Layout.PatternLayout">
<header value="------------------------------------------------------------"/>
<ConversionPattern value="★★★★★★%newline%date [%thread] %-5level %logger [%ndc] - %newline%message%newline" />
</layout>
</appender>
<!--记录日志到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--缓存:当日志达到一定的数量,在往数据库里面保存,减少数据库压力-->
<bufferSize value=""/>
<!--引用的动态链接库-->
<connectionType value="System.Data.SqlClient.SqlConnection,System.Data,Version=1.0.3300.0,Culture=neutral,PublicKeyToKen=b77a5c561934e089"/>
<!--数据库连接字符串-->
<connectionString value="Data Source=JIANGXIAOLIANG;Initial Catalog=NightCat;Integrated Security=True"/>
<!--插入数据库表的SQL语句-->
<commandText value="INSERT INTO [dbo].[Sys_Log]([Date],[Thread] ,[Leval],[Logger],[Message],[Exception]) VALUES (@Date ,@Thread,@Leval ,@Logger ,@Message,@Exception)"/>
<!--参数-->
<parameter>
<parameterName value="@Date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@Thread"/>
<dbType value="String"/>
<size value=""></size>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Leval"/>
<dbType value="String"/>
<size value=""></size>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%leval"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Logger"/>
<dbType value="String"/>
<size value=""></size>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Message"/>
<dbType value="String"/>
<size value=""></size>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Exception"/>
<dbType value="String"/>
<size value=""></size>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
</appender>
<!--把日志信息输出到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<!--日志在日志文件中的布局格式-->
<layout type="log4net.Layout.PatternLayout">
<header value="------------------------------------------------------------"/>
<ConversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n" />
</layout>
</appender>
<root>
<!--设置日志输出级别-->
<level value="INFO"></level>
<!--以文件的形式记录日志-->
<appender-ref ref="RollingLogFileAppender"></appender-ref>
<!--以控制台的形式记录日志-->
<appender-ref ref="ConsoleAppender"></appender-ref>
<!--以数据库的形式记录日志-->
<appender-ref ref="AdoNetAppender"></appender-ref>
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

在程序中使用log4net记录日志:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net; namespace Log4netDemo
{
class Program
{
static void Main(string[] args)
{
//创建文件对象
ILog log = LogManager.GetLogger("log4netDemo");
//开启配置
log4net.Config.XmlConfigurator.Configure();
log.Debug("我是Debug");
log.Info("我是Info");
log.Error("我是Error"); Console.ReadKey();
}
}
}

输出结果(以控制台为例):

在config文件中设置的日志输出级别是INFO,而Debug的级别小于INFO,所以只输出Info和Error。

在WebForm中也可以使用Log4net,如果是web项目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();

记录日志框架:log4net使用的更多相关文章

  1. asp.net中日志框架Log4Net的使用

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...

  2. ASP.NET MVC 使用 Log4net 记录日志

    Log4net 介绍 Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版.我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式.它可以根据需要 ...

  3. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  4. Log4net日志组件使用

    一.简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日 ...

  5. 杂项-Log:log4net

    ylbtech-杂项-Log:log4net log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等) ...

  6. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  7. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

    本文目录1. Net下日志记录2. NLog的使用    2.1 添加nuget引用NLog.Web.AspNetCore    2.2 配置文件设置    2.3 依赖配置及调用    2.4 日志 ...

  9. [Asp.net 5] Logging-其他日志系统的实现

    Microsoft.Framework.Logging.NLog 使用Nlog扩展日志系统:按照我们上节说的,对于扩展的日志系统都要实现俩个接口ILogger.ILoggerProvider.所以在当 ...

随机推荐

  1. C# MediaPlayer的详细用法

    AxWindowsMediaPlayer的详细用法 作者:龙昊雪 AxWindowsMediaPlayer的详细用法收藏 function StorePage(){d=document;t=d.sel ...

  2. 房产地图google map的初步应用点滴.3)(转)

    房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) go ...

  3. 配置tomcat全局c3p0连接池

    由于项目中多个应用访问同一个数据库,并部署在同一个tomcat下面,所以没必要每个应用都配置连接池信息,这样可能导致数据库的资源分布不均,所以这种情况完全可以配置一个tomcat的全局连接池,所涉及应 ...

  4. android中调用系统的发送短信、发送邮件、打电话功能

    1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:");  Intent sendIntent = new Intent(Intent.ACT ...

  5. Linux中断 - softirq

    一.前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那 ...

  6. Hive学习之函数DDL和Show、Describe语句

    创建/删除函数 创建暂时函数 以下的语句创建由class_name实现的暂时函数,该函数被创建后仅仅能够在当前会话中使用.会话结束后函数失效. 实现函数的类能够是Hive类路径中的随意类.能够使用Ad ...

  7. js数组基本知识

    1.数组的引出 用数组解决王大爷养乌龟的问题: var weights=[3,5,1,3.4,2,50]; var all_weight=0; var avg_weight=0; for (i=0;i ...

  8. NET使用NPOI组件将数据导出Excel-通用方法 【推荐】

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

  9. Model層資料驗證

    概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.Co ...

  10. Java简单验证码的识别

    1. 需求 因为项目需要,需要多次登录某网站抓取信息.所以学习了验证码的一些小知识.文章参考http://blog.csdn.net/problc/article/details/5794460的部分 ...