最近在好好整理些小组件的使用,本文就Log4Net的使用做一个简单的说明。
准备工作
首先下载log4net相关资源:http://logging.apache.org/log4net/download.html
本文中还使用了NUnit。
log4net的组成
log4net主要由Logger、Appender、Repository、Layout
1)Logger
Logger是log4net主要部分,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:
LogManager.GetLogger(LogName)
在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。
2)Appender
Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。
3)Repository
Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。
4)Layout
Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。
log4net消息的级别
级别 | 对应方法 |
OFF | |
Fatal | void Fatal(…) |
Error | void Error(…) |
Warn | void Warn(…) |
Info | void Info(…) |
Debug | void Debug(…) |
All |
消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。
配置
log4net的配置可以通过放在新的文件中或者放在程序的配置文件中。而log4net会通过AppDomain.CurrentDomain.BaseDirectory目录下的查找配置文件。<log4net>是log4net查找的标识。先来看我们应用程序的一个配置:
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="LogAllToFile" type="log4net.Appender.FileAppender"> <file value="G:\学习资料\Log4Net\Log4NetDemo\Log4NetDemo\bin\Debug\DemoLog.log"/> <appendToFile value="true"/> <!--<layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d [%t] %-5l - %m%n%n"/> </layout>--> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" /> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="log/system_log_"/> <param name="AppendToFile" value="true"/> <param name="MaxSizeRollBackups" value="100"/> <param name="MaximumFileSize" value="1KB"/> <param name="StaticLogFileName" value="false"/> <param name="DatePattern" value="yyyyMMdd".log""/> <param name="RollingStyle" value="Date"/> <!--<layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout>--> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" /> </layout> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <!--BufferSize为缓冲区大小--> <param name="BufferSize" value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="database=HJRightPlat;server=(local);User ID=sa;Password=123456;" /> <commandText value="INSERT INTO Sys_Log ([Date],[Thread],[Log_Level],[Logger],[Message],[Exception],[User],[Category],[URL],[Client_IP]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category,@URL,@ClientIp)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%SysMessage" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> <parameter> <parameterName value="@User" /> <dbType value="String" /> <size value="50" /> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%UserName" /> </layout> </parameter> <parameter> <parameterName value="@Category" /> <dbType value="String" /> <size value="50" /> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%Category" /> </layout> </parameter> <parameter> <parameterName value="@URL" /> <dbType value="String" /> <size value="50" /> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%SysURL" /> </layout> </parameter> <parameter> <parameterName value="@ClientIp" /> <dbType value="String" /> <size value="50" /> <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"> <conversionPattern value="%ClientIP" /> </layout> </parameter> </appender> <root> <priority value="ALL"/> <!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF--> <appender-ref ref="LogAllToFile"/> <appender-ref ref="ConsoleAppender"/> <appender-ref ref="RollingLogFileAppender"/> <appender-ref ref="ADONetAppender"/> </root> </log4net>
在上面的配置中我们使用了ADONetAppender、LogAllToFile、ConsoleAppender、RollingLogFileAppender四种appender,其中ADONetAppderder中我们使用了些扩展,在后面会详细进行说明。下面说说各个配置节点:
1)Root:在Root中我们可以来指定消息级别,在上面种我们指定为“ALL”,同时我们也可以指定Appender的引用对象。
2)Appender:我们通过Appender配置节点来指定对应的各种方式的Appender,Appender节点可以是多种的。
应用
首先来看我们定义了一个系统消息的实体:
public class SysLogMessage { /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 分类 /// </summary> public string Category { get; set; } /// <summary> /// 访问的Web地址 /// </summary> public string URL { get; set; } /// <summary> /// 客户端IP /// </summary> public string Client_IP { get; set; } /// <summary> /// 消息记录 /// </summary> public string Message { get; set; } }
用单件模式定义了一个消息的管理类:
public class SysLogManager { #region Thread-safe, lazy Singleton SysLogManager() { this.InitLogManager(); } public static SysLogManager Instance { get { return Nested.LogManager; } } private class Nested { static Nested() { } internal static readonly SysLogManager LogManager = new SysLogManager(); } private void InitLogManager() { XmlConfigurator.Configure(BaseDataCache.log4netConfig); _Log = LogManager.GetLogger(LogName); } #endregion #region Help Methods And Fileds ILog _Log; string LogName = "HJRightLog"; #endregion public void Erro(SysLogMessage msg) { _Log.Error(msg); } public void Erro(SysLogMessage msg, Exception e) { _Log.Error(msg, e); } public void Info(SysLogMessage msg) { _Log.Info(msg); } public void Info(SysLogMessage msg, Exception e) { _Log.Info(msg, e); } public void Debug(SysLogMessage msg) { _Log.Debug(msg); } public void Debug(SysLogMessage msg, Exception e) { _Log.Debug(msg, e); } public void Warn(SysLogMessage msg) { _Log.Warn(msg); } public void Warn(SysLogMessage msg, Exception e) { _Log.Warn(msg, e); } }
看看测试代码:
[Test] public void TestLogErro() { _logM.Erro(new SysLogMessage{ Message="测试", UserName="Henllyee", Category="Debug", URL="http://henllyee.cnblogs.com" }); }
结果:
ConsleAppender:
RollingLogFileAppender:
AdoNetAppender:
总结
本文中概括地介绍了下log4net的使用,在下篇的文章中将会详细说明下多个常用的Appender。