Log4net简介
Log4net简介
Log4net 是Apache组织开发的著名的开源日志记录组件,可以以插件的形式应用在应用系统中。利用Log4net可以方便的将日志信息记录到文件,Windows事件日志和数据库中(MS SQL SERVER,ORACLE等)。并且我们还可以控制要记载的日志级别,可以记载的日志级别包括:
1、FATAL (致命错误)
2、ERROR(一般错误)
3、WARN(警告)
4、INFO(一般信息)
5、DEBUG(调试信息)
log4net有4中主要组件,分别是Logger(记录器),Repository(库),Appender(附着器),Layout(布局)
Logger 提供了多种方式来记录一个日志信息,可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被Log4net框架作为命名实体来维护。
Log4net框架定义了一个叫做LogManager的类,用来管理所有的Logger对象。它有一个静态的GetLogger()静态方法,用我们提供的名字参数来检索已经存在的logger对象,如果框架不存在该Logger对象,它也会为我们创建一个Logger对象。
级别 |
允许的方法 |
Boolean属性 |
优先级别 |
OFF |
最高 |
||
FATAL |
VoidFatal(object message) |
Bool IsFatalEnabled |
|
ERROR |
Void Error(object message) |
Bool IsErrorEnabled |
|
WARN |
Void Warn(object message) |
Bool IsWarnEnabled |
|
INFO |
Void Info(object message) |
Bool IsInfoEnabled |
|
DEBUG |
Void Debug(object message) |
Bool IsDebugEnabled |
|
ALL |
最低 |
在Log4net框架里,通过设置配置文件,每个日志对象都被分配了一个日志优先级
例如,当创建一个日志对象,并且把它的级别设置为<level value="INFO"/> 框架会设置日志的每个Boolean属性,当你调用相应的日志方法时候,框架会检查相应的Boolean属性,决定该方法能不能被执行。
1 Logger.Info("Hello World");
2 Logger.DEBUG("Hello World");
3 Logger.WARN("Hello World");
对于第一种方法,能够得到输出
对于第二种方法,不能得到输出,Debug的优先级低于Info
对于第三种,能够得到输出。
Appender
设定日志输出的目的地,负责向存储介质中追加日志,在配置文件中配置,通常有
AdoNetAppender
EventLogAppender
RollingFileAppender
Layout 日志消息记录的格式,在配置文件中进行配置
%m (message) 输出日志的消息
%n (new line) 换行
%d (datetime) 输出当前语句的运行时间
%r(run time) 输出程序从运行到执行再到当前语句的所耗费毫秒数
%t (thread id)当前语句的线程id
%p 日志的当前优先级别
%c 当前日志对象的名称
%L 输出语句所在的行号
%F 输出语句所在文件名
%-数字 表示该项的最小长度。
使用步骤:
1,项目中添加Log4net.dll引用
2,在web.config中进行配置:
1 <configSections>
2 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
3 </configSections>
4 <log4net>
5 <!-- <root>
6 <level value="ALL"/>
7 <appender-ref ref="rootFile"/>
8 </root>-->
9 <logger name="AppLogger1">
10 <level value="INFO"/>
11 <appender-ref ref="LogFileAppender"/>
12 </logger>
13 <logger name="AppLogger2">
14 <level value="DEBUG"/>
15 <appender-ref ref="rollingFile"/>
16 </logger>
17 <appender name="LogFileAppender" type="Log4net.Appender.FileAppender">
18 <param name="File" value="App.log"/>
19 <param name="AppendToFile" value="true"/>
20 <layout type="log4net.Layout.PatternLayout">
21 <param name="Header" value="--start-- "/>
22 <param name="Footer" value="--end-- "/>
23 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] %X(auth) - %m%n"/>
24 </layout>
25 <filter type="log4net.Filter.LevelRangeFilter">
26 <param name="LevelMin" value="DEBUG"/>
27 <param name="LevelMax" value="FATAL"/>
28 </filter>
29 </appender>
30 <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
31 <param name="File" type="" value="log/"/>
32 <param name="AppendToFile" value="true"/>
33 <param name="RollingStyle" value="Date"/>
34 <param name="DatePattern" value="yyyy-MM-dd"/>
35 <param name ="StaticLogFileName" value="false"/>
36 <layout type="log4net.Layout.PatternLayout,log4net">
37 <param name="ConversionPattern" value="%d [%t] %-5p %c %L %F - %m%n"/>
38 <param name="Header" value="--start-- "/>
39 <param name="Footer" value="--end-- "/>
40 </layout>
41 </appender>
42 </log4net>
Log4net下有root,logger,appender标签
root标签,所有的logger都从root继承,root本身也是一个logger,root的设置在所有的Logger中都起作用,当在root和Logger中重复设定相同 的appender时,同一日志信息将被记录两次。
logger标签,每个logger标签代表一个logger,appender-ref表示该logger产生的日志消息传递给哪个appender,一个logger可以把相同的消息传递给多个appender记录。
appender标签,每个appender表示一个日志的存储位置,name不能和type一样。
3、在Global.ascx中的Application_Start方法加入:
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 log4net.Config.XmlConfigurator.Configure(); }
4、调用代码:
log4net.ILog log = log4net.LogManager.GetLogger("AppLogger2");
log.Error("Hello World");
以上面的配置,举个SQL SERVER例子:
结果集:
--start-- 2012-05-20 21:06:31,406 [5] ERROR AppLogger2 0 - ExecuteNonQuery 要求已打开且可用的 Connection。连接的当前状态为已关闭。 2012-05-20 21:06:45,296 [6] ERROR AppLogger2 0 - ExecuteNonQuery 要求已打开且可用的 Connection。连接的当前状态为已关闭。 --end--
1 log4net.ILog log = log4net.LogManager.GetLogger("AppLogger2");
2 try
3 {
4 string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
5 using (SqlConnection con = new SqlConnection(connectionString))
6 {
7 SqlCommand cmd = new SqlCommand("DELETE FROM Categories WHERE CategoryID= 10 ", con);
8 cmd.ExecuteNonQuery();
9 }
10 }
11 catch (Exception ex)
12 {
13 log.Error(ex.Message);
14 return;
15 }