log4net生成多个日志文件
使用Log4Net日志组件时,经常会碰到这样一种场景,我想把错误的日志记录在Error.log文件中,而把操作的日志放在Operation.log文件中
经过几番尝试,终于实现了,在此把Log4Net的简单使用记录下来:
首先新建一个空Web应用程序,使用Nuget添加对log4net的引用:
将准备好的log4net.config配置文件放到程序根目录(注释在文件中):
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <appSettings> </appSettings> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <logger name="OperationLog"> <level value="INFO"/> <appender-ref ref="OperationLogAppender" /> </logger> <logger name="ErrorLog"> <level value="INFO"/> <appender-ref ref="ErrorLogAppender" /> </logger> <!--定义输出到文件中--> <appender name="OperationLogAppender" type="log4net.Appender.RollingFileAppender"> <!--输出日志文件的路径--> <file value="Log\Operation.log" /> <!--输出日志时自动向后追加--> <appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全,但实际使用时,本地测试正常,部署后有不能写日志的情况--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="false" /> <!--日志以大小作为备份样式,还有一种方式是Date(日期)--> <rollingStyle value="size" /> <countDirection value="-1" /> <!--单个日志的最大容量,(可用的单位:KB|MB|GB)不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1MB" /> <!--日志最大个数,都是最新的--> <maxSizeRollBackups value="10" /> <datePattern value='"."yyyy-MM-dd".log"' /> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明 <footer value="**************************************************************" />--> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass - info--> <conversionPattern value="%newline%d{yyyy/MM/dd,HH:mm:ss.fff},[%-5level] Message:%message%newline" /> </layout> </appender> <!--定义输出到文件中--> <appender name="ErrorLogAppender" type="log4net.Appender.RollingFileAppender"> <!--输出日志文件的路径--> <file value="Log\Error.log" /> <!--输出日志时自动向后追加--> <appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全,但实际使用时,本地测试正常,部署后有不能写日志的情况--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="false" /> <!--日志以大小作为备份样式,还有一种方式是Date(日期)--> <rollingStyle value="size" /> <countDirection value="-1" /> <!--单个日志的最大容量,(可用的单位:KB|MB|GB)不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1MB" /> <!--日志最大个数,都是最新的--> <maxSizeRollBackups value="10" /> <datePattern value='"."yyyy-MM-dd".log"' /> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明 <footer value="**************************************************************" />--> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass - info--> <conversionPattern value="%newline%d{yyyy/MM/dd,HH:mm:ss.fff},[%-5level] %logger Message:%message%newline" /> </layout> <!-- 日志等级过滤 可以适用于这种场景,root下记录所有的日志,而Error以上级别的日志再记录到另外一个日志文件中,方便查错 <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> <levelMax value="FATAL" /> </filter>--> </appender> <root> <level value="ALL"/> </root> </log4net> </configuration>
接下来我们要告诉应用程序的log4net日志组件使用上面的定义好的log4net.config配置文件,方式是在global.asax.cs代码里面加入以下代码(这是Web应用程序的使用方式,Winform不同):
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("log4net.config")));
最后在HomeController中使用日志:
public ActionResult Index() { log4net.ILog opLog = log4net.LogManager.GetLogger("OperationLog"); //记录一条操作日志 opLog.Info("这是一条操作日志"); log4net.ILog errorLog = log4net.LogManager.GetLogger("ErrorLog"); //记录错误日志 errorLog.Info("这是一条错误日志"); errorLog.Info("这是另一条错误日志---------------------------------"); return View(); }
F5运行应用程序,查看Log目录下的日志文件可以看到操作日志写了一条,
错误日志写了两条: