【问题标题】:Using log4net as a class library?使用 log4net 作为类库?
【发布时间】:2014-12-28 02:34:46
【问题描述】:

我正在使用带有 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>

当我运行程序时,没有创建文件。

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 您希望文件的名称是什么?您希望它位于何处?您是否在整个项目目录(包括子目录)中查看了日志文件以查看它是否被命名为您没想到的名称?对log.Debug 的调用是否有可能引发异常,您的程序在不让您看到的情况下被压扁?
  • @JimMischel 嗨,吉姆。如您所见,我在 App.config 中添加了这一行:。因此,我查看了该路径,但该文件不存在。我查看了项目目录和子目录,但那里什么都没有............如果确实 log.Debug 引发了异常,我该如何查找它?

标签: c# log4net app-config


【解决方案1】:

如果您查看log4net documentation for assembly attributes,它会说:

"因此,如果您使用配置属性,您必须调用 log4net 允许它读取属性。对 LogManager.GetLogger 的简单调用将导致 调用程序集 上的属性 被读取和处理。 因此,必须在应用程序启动期间尽早进行日志调用,并且 肯定是在加载和调用任何外部程序集之前。"

在您的情况下,您对 Method3 的调用正在加载库程序集,因此静态字段正在尝试从库日志类中加载属性,其中未定义属性。

我通常在我的主程序开始时有这样的东西:

LogManager.GetLogger("Initialise log4net from the current assembly attributes");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多