日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。
Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包.
Log4net可以配置在application所在的.config文件中,也可以在单独配置在一个.config文件中。
传统的Asp.net程序都会有一个web.config,我们可以把log4net的配置写在web.config中。
- 在configuration节点下的configSections中添加对log4net的引用
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections>
- 添加具体的log4net日志信息
<log4net> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="loginfo"> <level value="INFO" /> <appender-ref ref="InfoAppender" /> </logger> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="ErrorLog.log" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaximumFileSize" value="1MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%c] %m%n" /> </layout> </appender> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="InfoLog.log" /> <param name="AppendToFile" value="true" /> <param name="MaxSizeRollBackups" value="100" /> <param name="MaximumFileSize" value="1MB" /> <param name="RollingStyle" value="Size" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%c] %m%n" /> </layout> </appender> </log4net>
备注:上面的代码分别定义了记录Info和Error的Appender,可以满足大部分需求
Sharepoint由于它的特殊性,用户是不能随便改config文件,sharepoint都是以farm的方式安装部署的,也就是说会有多台WFE,如果每台都去改config是及其不合理的。
Log4net的灵活在于你可以定义一个单独的config文件,也就是说我们无需去改web.config。
- 新建一个log4net.config文件,内容跟上面的一样
<log4net debug="true"> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorRollingLogFileAppender" /> </logger> <logger name="loginfo"> <level value="INFO" /> <appender-ref ref="RollingFileAppender" /> </logger> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file type="log4net.Util.PatternString" value="C:\\Log\\%date{yyyyMMdd}-log.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="20" /> <maximumFileSize value="5MB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <appender name="ErrorRollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file type="log4net.Util.PatternString" value="C:\\Log\\%date{yyyyMMdd}-error.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> </log4net>
备注:这里我们指定了日志的目录,如果没有指定,默认与application目录一致
- 定义LogHelper公用类
public class LogHelper { //log4net日志专用 public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); /// <summary> /// 普通的文件记录日志 /// </summary> /// <param name="info"></param> public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } /// <summary> /// 错误日志 /// </summary> /// <param name="info"></param> /// <param name="se"></param> public static void WriteLog(string info, Exception se) { if (logerror.IsErrorEnabled) { logerror.Error(info, se); } } }
- 关联配置文件
Log4net提供log4net.Config.XmlConifguratorAttribute自定义属性,我们可以通过它来关联配置文件
//监视默认的配置文件,AppName.exe.config [assembly: log4net.Config.XmlConfigurator(Watch = true)] //监视配置文件,AppName.exe.log4net [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)] //使用配置文件log4net.config,不监视改变。 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "C:\\Log4net\\log4net.config")]
根据实际情况选择合适的配置方式,前面讲了sharepoint的特殊性,不是很方便去更改web.config,所以我们选择第三种配置,即关联一个外部的.config文件。
在项目部署的时候,只要把log4net.config部署到指定的目录即可。完整的LogHelper代码如下
//使用配置文件log4net.config,不监视改变。 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "C:\\Log4net\\log4net.config")] namespace CommonService { public class LogHelper { //log4net日志专用 public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); /// <summary> /// 普通的文件记录日志 /// </summary> /// <param name="info"></param> public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } /// <summary> /// 错误日志 /// </summary> /// <param name="info"></param> /// <param name="se"></param> public static void WriteLog(string info, Exception se) { if (logerror.IsErrorEnabled) { logerror.Error(info, se); } } } }
- 使用Log功能
LogHelper.WriteLog("The Process completed."); LogHelper.WriteLog("Error testing", new Exception("just for testing"));
log4net的强大远不止这些,本文只是针对项目开发中惯用的配置来做讲解,尤其是如果配置在sharepoint中使用。