我正在使用c#,visual studio 2008,.net framework 3.5,windows 7的控制台应用程序.我已经创建了一个log4net库并计划在我的解决方案的几个项目中使用它.
这就是我的log4net库类的样子:
public class LibraryLogClass1
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static void Method3(string message)
{
log.Debug(message);
}
}
在我的主控台项目中,我有这个:
class Program
{
static void Main(string[] args)
{
LibraryLog3.LibraryLogClass1.Method3("test3");
}
}
我在我的控制台项目的AssemblyInfo.cs中添加了这一行:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
这是我的控制台项目中的App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG"/>
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file value="C:\test3.txt"/>
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c %m%n" />
</layout>
</appender>
</log4net>
</configuration>
当我运行程序时,不会创建文件.
我怎么解决这个问题?
谢谢
解决方法:
如果你看一下log4net documentation for assembly attributes就说:
“因此,如果使用配置属性,则必须调用log4net
允许它读取属性.对LogManager.GetLogger的简单调用将导致调用程序集上的属性
被阅读和处理.因此,必须在应用程序启动期间尽早进行日志记录调用,并且
当然,在加载和调用任何外部程序集之前.“
在您的情况下,您对Method3的调用是加载库程序集,因此静态字段正在尝试从库日志类加载属性,其中未定义属性.
在我的主程序开始时我通常会有类似的东西:
LogManager.GetLogger("Initialise log4net from the current assembly attributes");