log4net无法正常工作


123

嘿,我的web.config中有此配置

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

但是log4net无法正常工作。我的项目编译正常,调试也没有错误。我告诉的行log.debug("somemessage")可以正常运行,但是我找不到mylog.log文件,所以它在哪里?


Answers:


298

这种事情的一个陷阱是XmlConfigurator通过在您的代码中放置以下行来确保将属性添加到程序集AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator]

否则,log4net永远不会激活。


5
该方法曾经在我的项目中可用,但由于某种原因停止了工作。我必须使用此方法stackoverflow.com/a/1479343/193634使其再次运行。
Rosdi Kasim 2013年

我只是再次尝试,它工作正常。您很可能没有AssemblyInfo想到就立即引用/加载包含的程序集。
Kirk Woll 2013年

对于使用ELMAH附加程序的用户,这是一种方法。我有'log4net.Config.XmlConfigurator.Configure();' 在global.asax.cs中,它对于文件附加器工作正常,但不适用于ELMAH附加器。
user3885927

我已经提了这个答案,发现我需要用`[assembly:log4net.Config.XmlConfigurator(Watch = true)]来调整它
David Savage,

49

我猜想log4net根本没有记录日志,或者文件没有​​以您期望的位置结束。

首先,你真的打电话吗

XmlConfigurator.Configure()

您代码中的任何地方?如果上面的xml代码段在应用程序配置文件中,则此调用即可解决问题。如果xml代码段位于其自己的文件中,则需要使用.Configure(string)重载,该重载采用文件的路径。没有此调用(或者显然不是Kirk Woll提到的程序集级别属性),那么log4net根本不会记录日志。

如果您相信所有操作都已完成,并且log4net应该正在记录日志,那么在进一步调试时,也许应该在日志文件中输入标准路径。这样就可以确定文件在哪里。


33

还有另一个小陷阱,请参阅此处:http : //logging.apache.org/log4net/release/manual/configuration.html#dot-config

[assembly: log4net.Config.XmlConfigurator]方法不适用于app.config。如果从app.config配置log4net,则必须使用该log4net.Config.XmlConfigurator.Configure()方法。


仅作记录,这两种方法都在控制台应用程序中为我工作。
rageit

我确认上面的解决方案-我必须调用log4net.Config.XmlConfigurator.Configure(); 。在我的代码(使用的app.config有log4net的有效工作,这得到有效的打印线是那些配置的执行()方法之后。
路易莎·罗格列酮

19

这是我的清单,用于证明log4net顽固不化:

  • 确保在构建时将log4net.config文件复制到bin \文件夹(在编译器中设置为“如果更新则复制”)
    • 处理已安装的代码时,请确保随身携带log4net.config(在编译器中设置为“ Content”)
  • 确保运行该进程的用户对要写入日志的文件夹具有写权限
  • 如有疑问,请授予c:\ temp \的混杂权限,并获取所有内容以登录到那里()
  • 启动Sysinternal / Dbgview.exe看看是否能告诉您任何信息

3
“确保在构建时将log4net.config文件复制到bin \文件夹(在编译器中设置为'如果更新则复制')”->保存我的一天!太感谢了!
阮阮虎2014年

8

对于ASP.NET MVC项目,添加

log4net.Config.XmlConfigurator.Configure();

前往Global.asax.cs也有帮助:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}

1
对此存在一个非常奇怪的问题,在生产环境中以及在我老板的计算机上,记录器都可以像这样正常工作,但是直到我得到Kirk的回答后,它才可以在我的计算机上工作。只是以为我会让人们知道他们是否有类似的问题(MVC项目btw)。
Shelby115

@ Shelby115,非常感谢!我试图将我的log4Net条目放入ELMAH。我在web.config中一切正确。我已经有'log4net.Config.XmlConfigurator.Configure();' 在我的global.asax.cs中,但无法正常工作。来到这个SO帖子,并根据Kirk的内容将行添加到assemblyInfo.cs中。它仍然没有用!阅读您的评论后,我从global.asax.cs中删除了之前的条目,它开始起作用。我为此花了几个小时,您的评论提供了很大帮助。再次感谢!
user3885927 2015年

global.asax.cs中的条目对于文件附加程序运行正常,但对于ELMAH附加程序却无法正常运行。Kirk的方式适用于ELMAH附加程序(我特别必须将其从global.asax.cs中删除)
user3885927 2015年

您可能还需要确保log4net对为日志文件配置的目录具有写权限。
Oladipo Olasemo 2015年

@ Shelby115 Dang,当您忘记解决方案并且您自己的评论解决了您的问题时,一定会喜欢它。进入已被您认可的答案的页面也是一个很好的指示。
Shelby115 '17

7

这些步骤最终使我的文件记录生效:

  • -Check AssemblyInfo.cs包含以下属性。 [程序集:log4net.Config.XmlConfigurator]。这将加载log4net。
  • 检查日志目录是否具有写权限。
  • 检查记录器是否指定了格式。这是通过检查配置中的每个元素是否都指定了布局元素来完成的。例如:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • 最后,尝试打开log4net内部日志记录以启用控制台日志记录并检查控制台。为此,请添加<add key="log4net.Internal.Debug" value="true"/>到中appSettings

<add key =“ log4net.Internal.Debug” value =“ true” />这有助于我排查问题。谢谢
Ravi Khambhati

目录的权限使我
着迷

6

我曾有经验,日志系统会在不引发异常的情况下静默失败。我认为这是有道理的,因为如果记录器正在记录错误,那么它如何记录无法执行记录的错误呢?

因此,如果未在磁盘上创建文件,请首先查看文件系统权限,以确保您的应用程序在其下运行的用户可以将新文件写入该磁盘位置。

为了进行测试,您可能需要在磁盘上手动创建应写入的文件,并为所有人开放写入权限。如果记录器开始对其进行写入,那么您就知道它基于权限而不是基于配置。


2

在我这边,我忘记标记正在编译应用程序时要复制的配置文件。

将配置文件复制到输出目录

只需右键单击log4net.config文件,选择属性,然后选择“复制到输出目录”作为“复制XXXX”


1

我尝试了以上所有方法,但没有任何效果。在app.config的 configSections部分中添加此行对我有用

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

确保VersionPublicKeyToken正确


0
<param name="File" value="mylog.log" />

说“将mylog.log写入实际文件夹”。这意味着,如果您的Web应用程序位于IIS下,则日志将被写入C:\ inetpub \ wwwroot \ appname \ mylog.log。

如果日志文件不存在,则可能是正在运行应用程序的帐户对该文件夹没有写权限。您可以从SysInternals运行Process Monitor,以查看是否以及在何处写入文件。

还要在调试模式下运行VS,以查看是否抛出了任何异常(Debug-> Exceptions-> CLR Exceptions,选中Thrown)。


0

就我而言,我忘记将log4Net.config文件属性设置为“ Content”,因此该文件未包含在部署中。因此请注意:

Compile action : Content

0

不幸的是,以上方法均无济于事。班级中的显式配置将额外记录到以前的设置建议中,这对我来说很有效。

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));

-7

又过了几个小时,我才知道为什么它对我不起作用...

我有:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

但是应该是:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

因此,请确保ILog位于第一行...。


1
这绝对不是原因。初始化ILog对象的时间并不重要,只要您在调用日志记录方法(即_log.Info;)之前执行该操作即可。_log.error等
Oladipo Olasemo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.