我正在使用Windows 7中的C#开发.NET Framework 4.0,并尝试从类库中进行日志记录,但它无法正常工作。我正在运行我的应用程序而没有错误,但我的日志文件也没有发生任何事情,也没有发生在我的控制台上。
所以,这是我的代码:
这是我的App.config
文件:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<add key="log4net.config" value="config.log4net"/>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newlineExtra Info: %property{testProperty}%newline%exception"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG"/>
<levelMax value="FATAL"/>
</filter>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="MyLogFile.txt"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="5"/>
<maximumFileSize value="10MB"/>
<staticLogFileName value="true"/>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="debug"/>
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="error"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline%exception"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<logger name="MyApplication">
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
</logger>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
这是我放入AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
这是我正在尝试记录的文件:
private static readonly ILog log = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Debug("Testing");
当我运行我的程序时没有任何反应。有人知道为什么吗?
答案 0 :(得分:21)
与this answer类似,app.config,log4net配置和AssemblyInfo.cs配置程序都需要放在主机应用程序中。
假设我将项目Console
作为我将运行的控制台项目,并Library
作为库项目。 Console
需要有一个带有上述log4net配置的app.config文件,而AssemblyInfo.cs将需要其中的XmlConfigurator代码。 Library
不需要其中任何一个,并且可以使用LogManager
调用。
Console > This is the project that you will run.
Properties
AssemblyInfo.cs > Place [assembly: log4net.Config.XmlConfigurator(Watch = true)] here.
app.config > Place log4net XML configuration here.
Program.cs > Start of application.
Library
Properties
AssemblyInfo.cs > Leave this file alone.
Foo.cs > Create the private readonly property.
SomeMethod() > log.Debug("Test");
答案 1 :(得分:3)
如果你看log4net documentation for assembly attributes,就会说:
“因此,如果使用配置属性,则必须调用log4net 允许它读取属性。对LogManager.GetLogger的简单调用将导致调用程序集上的属性 被阅读和处理。 因此,必须在应用程序启动期间尽早进行日志记录调用,并且 当然,在加载和调用任何外部程序集之前。“
当在类库(即外部程序集)中定义程序集属性时,它会变得棘手。您可以使用log4net.Config.XmlConfigurator.Configure(path)
吗?
答案 2 :(得分:3)
如果有人仍在查看此内容并添加到之前的答案中,您需要先在主机应用程序中实例化一个记录器,然后才能从类库中登录。