log4net 在 dll 中无法工作

6

我目前在特定的dll中遇到了使用log4net无法正常工作的问题。我当前在其他被测试应用程序调用的dll中使用log4net,并且在这些dlls和测试应用程序中记录日志都没有问题。但是,在这个特定的dll中,我遇到了麻烦。下面是这个出问题的dll中的代码片段。

//This is from ABC.dll
public class SessionFactory
{
    protected static ISessionFactory sessionFactory;
    private static readonly ILog log = LogManager.GetLogger(typeof(SessionFactory));

    private static void Init()
    {
        try
        {
            //Read the configuration from hibernate.xml.cfg or app.config
            Configuration normalConfig = new Configuration().Configure();
            ConfigureNhibernateValidator(normalConfig);

            log.Debug("Initializing session factory");

            sessionFactory = Fluently.Configure(normalConfig)
              .Mappings(m =>
                  m.FluentMappings
                  .AddFromAssemblyOf<OrderHeaderMap>()
                  .Conventions.AddFromAssemblyOf<PascalCaseColumnNameConvention>())
               .ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu")
              .BuildSessionFactory();

            log.Debug("Finished initializing the session factory");
        }
        catch(Exception ex)
        {
            //Code not shown
        }
    }
}

在我的测试应用中,我正在调用:
log4net.Config.XmlConfigurator.Configure();

这是我的App.config文件中log4net的配置:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <!-- ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="SpeedTest"/>
    </root>

    <!-- This is a default logger that nhibernate uses to push out all the SQL statements to-->
    <logger name="NHibernate.SQL" additivity="false">
      <level value="DEBUG"/>
      <appender-ref ref="NHibernateConsoleLog"/>
      <appender-ref ref="NHibernateFileLog"/>
    </logger>

    <!-- This is a default logger that nhibernate uses to push out all the debugging type information to-->
    <logger name="NHibernate" additivity="false">
      <level value="DEBUG"/>
      <appender-ref ref="NHibernateFileLog"/>
    </logger>

    <appender name="NHibernateConsoleLog" type="log4net.Appender.TraceAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
    </appender>

    <appender name="NHibernateFileLog" type="log4net.Appender.RollingFileAppender">
      <file value="Logs/nhibernate.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
      </layout>
    </appender>

    <appender name="SpeedTest" type="log4net.Appender.RollingFileAppender">
      <file value="Logs/SpeedTest.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
      </layout>
    </appender>
  </log4net>

</configuration>

我的测试应用程序中使用SpeedTest appender记录日志工作正常,但以上代码片段中的日志记录不起作用。我在初始化记录器之前设置了断点,似乎已经触发了。如果需要,我可以发布log4net调试输出,但我没看到什么有用信息。您有任何建议吗?为什么以上代码片段中的日志记录没有被记录下来呢?


你在IDE或部署后遇到了问题吗?不知为何,无论我在项目中设置多少次log4net的CopyLocal=true,它都会持续被设置为false。因此,在部署之前所有都正常运行,但一旦部署,我就必须确保log4net.dll存在于bin目录中。 - Dave Ziegler
我实际上还没有在IDE(vs2k10 SP1)之外尝试过这个。这一切都是在我积极调试的时候失败的。 - Cole W
我刚刚注意到我正在使用<root><priority value="DEBUG"/>,而你使用的是<root><level value="DEBUG"/>,但我不知道它们之间有什么区别。在那个配置XML中,附加器是否被正确链接在一起了? - Dave Ziegler
这里的文档(http://logging.apache.org/log4net/release/manual/configuration.html)说应该是级别。我还是尝试了一下,但结果仍然相同。 - Cole W
我使用了完全相同的配置启动了一个控制台应用程序,调用了XmlConfigurator.Configure(),输出结果是:nhibernate.txt 0KB,SpeedTest.txt 1KB,所以我不确定那个配置部分是否有什么严重的问题。抱歉,我想我的log4net设置非常基本,并且以前从未做过这样的事情。希望你能解决这个问题!-编辑:当我第一次编译它时,我的控制台应用程序抱怨log4net缺少System.Web的依赖项,你可能有依赖项问题吗? - Dave Ziegler
System.Web已包含在我的项目中。虽然它在除了这个类之外的所有其他地方都正常工作,但我真的不认为这是一个依赖性问题。 - Cole W
3个回答

6

看起来这个问题是由于我在TFS中一段时间前更改了所有外部依赖项(其中之一是log4net)的目录导致的。我所做的只是在我的Visual Studio项目中删除所有引用,然后从我的新依赖文件夹重新添加它们,之后一切都按预期工作了。感谢所有在这里提供帮助的人。


干得好,很高兴你能够让它运行起来。 - Dave Ziegler

3
我猜测当你调用configure时,它没有从配置文件中读取配置。
如果你在应用程序中添加以下几行代码,你会看到什么(可以在控制台、IDE输出窗口或调试器中查看):
var log4netConfig = ConfigurationManager.GetSection("log4net");
var log4netConfigIsNull = log4netConfig == null;
Console.WriteLine(log4netConfigIsNull);

看起来配置文件中的配置项是否可用?

[编辑:回复您的评论]

如果现在将另一行调试代码添加到您的应用程序中:

Console.WriteLine(log.IsDebugEnabled);

你得到了什么输出?记录器是否认为自己已配置为调试日志记录?(我特别关注此行为在 SessionFactory.Init 中或之后的情况。)

我在我的帖子中添加了代码片段,并在我的测试应用程序中添加了相同的代码,但两者都是错误的(它在我的app.config文件中找到了log4net条目)。不过,就像我之前说的,在我的测试应用程序中,如果我使用log.Debug("Test")记录一些内容,它会出现在我的日志文件中,但如果我调用SessionFactory.Init(),则日志记录语句不会显示。 - Cole W
我认为你说得对,Rob。当我将log.IsDebugEnabled设置为false时,出现了一个奇怪的问题。我发现当我将我的日志实例添加到监视窗口并尝试查看该属性时,它显示:“log.IsDebugEnabled引发了类型为'System.ArgumentException'的异常”。 - Cole W
1
嗯 - 我不太确定该怎么处理这个问题,但似乎记录器本身并不认为它已配置好。你能否在监视窗口中深入了解记录器,并查看它认为已配置的附加程序? - Rob Levine
我终于想通了。请看下面的解决方案。这有点奇怪。再次感谢所有帮助我的人。 - Cole W
没问题 - 很高兴你找到了答案。 - Rob Levine

0

最初的想法可能是您的日志记录代码没有被触发,可能是由于在第一个log4net调用之前抛出了异常。您能否将日志条目放入finally块中,以测试记录器是否正常工作?


我已经进行了调试。它肯定会触发日志记录语句。 - Cole W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接