由于打算在近期的项目量使用log4net,于是上网搜了一堆相关文档,自己动手写示例时却发现运行结果总是与网上的不尽相同,主要在如下二点:
1.配置文件的读取
在项目的AssemblyInfo.cs文件里添加以下的语句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",Watch=true/false)]
filename的值是配置文件的路径,Watch的值表示是否实时反映配置文件的修改。
或者动态加载
DOMConfigurator.[Configure/ConfigureAndWatch](new FileInfo("filename"));
Configure/ConfigureAndWatch的区别在于是否实时反映配置文件的修改。
在2.0及以后推荐将"DOMConfigurator"改为"XmlConfigurator",但是2.0及以后的Web项目是没有"AssemblyInfo.cs"文件的,总不能在每个需要使用log4net的类中都加上面那二行代码。针对这种情况,网上也有二种解决办法:(1)新建类库继承log4,用 [assembly]方式加载配置,Web项目再引用类库;(2)在Global文件中动态加载配置。个人认为log4net提供的方法已经鸲用了,没有必要再去继承,推荐使用第(2)种。
2.多种Appender的使用
网上有类似这样的配置
log4net.config
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="XxxxApplication.log.txt" />
<param name="datePattern" value="MM-dd HH:mm" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" type="" value="log" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
*.cs
Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
log.Debug("message");
上面的执行结果是二种Appender定义的日志文件中都出现了一行日志。
应该在配置文件应该为每一种介质都用<logger>标签定义一个名字。
修改后的文件如下:
log4net.config(不需要在web.config中作任何关于log4net的配置)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<root>
<level value="INFO" />
</root>
<logger name="AA">
<appender-ref ref="LogRollingFile" />
</logger>
<logger name="BB">
<appender-ref ref="LogFile" />
</logger>
<logger name="CC">
<appender-ref ref="LogFile1" />
</logger>
<appender name="LogFile" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] /r"/>
</layout>
</appender>
<appender name="LogFile1" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file1.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] /r"/>
</layout>
</appender>
<appender name="LogRollingFile" type="log4net.Appender.RollingFileAppender" >
<param name="File" type="" value="log" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
<param name="Header" value="----------------------header--------------------------/r/n" />
<param name="Footer" value="----------------------footer--------------------------/r/n" />
</layout>
</appender>
</log4net>
</configuration>
Global.asax
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
System.IO.FileInfo infoF = new System.IO.FileInfo("配置文件的实际路径");
log4net.Config.XmlConfigurator.ConfigureAndWatch(infoF);//使用ConfigureAndWatch
}
*.cs
protected void FileAppender_Click(object sender, EventArgs e)
{
log4net.ILog logger = log4net.LogManager.GetLogger("BB");
logger.Info("...LogFile...");
}
protected void FileAppender1_Click(object sender, EventArgs e)
{
log4net.ILog logger = log4net.LogManager.GetLogger("CC");
logger.Info("...LogFile...");
}
protected void RollingFileAppender_Click(object sender, EventArgs e)
{
log4net.ILog logger = log4net.LogManager.GetLogger("AA");
logger.Info("...LogRollingFile...");
}