C#中使用Log4记录日志
具体步骤如下:
- 从网上下载log4net对应.net版本的dll
- 在C#项目中引用该dll
- 创建log4net对应的配置文件
- 在程序中使用
log4net的配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="Log4Name" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="F:\Log2015\StorageSystem\Log4Name\log.log" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留个数--> <param name="MaxSizeRollBackups" value="200" /> <!--单个日志文件大小--> <param name="MaximumFileSize" value="5MB" /> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:2008-08-31.log--> <DatePattern value="yyyy-MM-dd HH'时.log'"></DatePattern> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Size" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="记录时间:%date%n线程ID:[%thread] %n日志级别:%-5level%n记录位置:%location%n异常:%exception%n消息:%message%newline%n------------------------------------------%n" /> </layout> <filter type="log4net.Filter.LoggerMatchFilter"> <param name="LoggerToMatch" value="Log4Name" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> </appender> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="DEBUG" /> <appender-ref ref="Log4Name" /> </root> </log4net>
创建LogHelper如下:
public class LogHelper { private static ILog log=null; public static ILog Log { get { if (log == null) { //log4.config表示log4的配置文件 string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "log4.config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(fileName));//修改日志配置无需重启程序,自动加载 //Log4Name表示配置文件中的日志名称 log = LogManager.GetLogger("Log4Name"); } return log; } } }
使用方式如下:
LogHelper.Log.Error("出错了哇");
创建的日志如图:
配置文件里面内容比较多,可以查阅相关文档进行详细配置!
另外,有时候我们需要把不同级别的文件放到不同的目录,首先配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="AccesssService_Err" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="Errors\log.log" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留个数--> <param name="MaxSizeRollBackups" value="200" /> <!--单个日志文件大小--> <param name="MaximumFileSize" value="5MB" /> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:2008-08-31.log--> <DatePattern value="yyyy-MM-dd HH'时.log'"></DatePattern> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Size" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="记录时间:%date%n线程ID:[%thread] %n日志级别:%-5level%n记录位置:%location%n消息描述:%property{Message}%n异常:%exception%n消息:%message%newline%n------------------------------------------%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="WARN" /> <levelMax value="FATAL" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> </appender> <appender name="AccesssService_info" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="MyLogs\log.log" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留个数--> <param name="MaxSizeRollBackups" value="200" /> <!--单个日志文件大小--> <param name="MaximumFileSize" value="5MB" /> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:2008-08-31.log--> <DatePattern value="yyyy-MM-dd HH'时.log'"></DatePattern> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Size" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="记录时间:%date%n线程ID:[%thread] %n日志级别:%-5level%n记录位置:%location%n消息描述:%property{Message}%n异常:%exception%n消息:%message%newline%n------------------------------------------%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="DEBUG" /> <levelMax value="INFO" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> </appender> <logger name="gdLog4net" additivity="false"> <level value="DEBUG" /> <appender-ref ref="AccesssService_Err" /> <appender-ref ref="AccesssService_info" /> </logger> </log4net>
LogHelper代码如下:
public class LogHelper { private static ILog log = null; public static ILog Log { get { if (log == null) { //log4.config表示log4的配置文件 string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config", "log4.config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(fileName)); log = LogManager.GetLogger("gdLog4net"); } return log; } } }
1.主要是log实例化有变化。通过GetLogger方法获取xml配种中gdLog4net的Logger
2.xml中定义了logger,关于logger和root,可以参考文章:https://www.cnblogs.com/zhangchenliang/p/4546352.html 的后面部分内容,大概意思就是说root其实就是一个顶级的logger,所有其他logger都默认继承这个root。如果需要让logger阻断和root的联系,可以将logger的additivity设置为false。