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 }