1

我在尝试正确配置 log4net 时遇到了最糟糕的情况。首先,我需要提供一些关于我到目前为止(并且成功地)使用它的背景。

我的应用程序有一个 log4net 配置文件,它定义了它应该记录所有数据的 FileAppender。我所有的程序集都有一个ILog成员变量,并将其设置为LogManager.GetLogger( typeof( myclass)),其中myclass是正在记录的类。

一切都像这样工作得很好。

现在我还有一个使用方式略有不同的程序集。它可以被实例化多次,要求是每个实例都记录到自己的文件中。我能够让它以编程方式工作,并放弃 logging.xml 文件。

        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
        hierarchy.Root.Level = log4net.Core.Level.All;            
        hierarchy.Configured = true;

        string module_path = MyCompany.Shared.Utils.FileSystem.GetModulePath();
        string folder = module_path + "\\logs\\";
        string path = String.Format("{0}{1}-log.txt", folder, name);

        _log = LogManager.GetLogger( name);

        var fa = new log4net.Appender.FileAppender() { Name = name, File = path, AppendToFile = true};
        var layout = new PatternLayout { ConversionPattern = "%date{{yyyy-MM-dd-HH_mm_ss.fff}} [%thread] %-5level %logger - %message%newline" };
        layout.ActivateOptions();
        fa.Layout = layout;
        fa.ActivateOptions();

        ((Logger)_log.Logger).AddAppender( fa);

这也很好用。现在问题来了:上面的程序集使用了另一个也使用 log4net 的程序集。但是,该程序集预计已经配置了一个记录器以供使用,显然我以编程方式设置 log4net 的方式是阻止它工作。

我启用了内部 log4net 调试,并且我看到的错误消息非常明确地说明了该错误,但我不确定如何(最好)解决问题:

log4net: Logger: No appenders could be found for logger [test_logger] repository [log4net-default-repository]
log4net: Logger: Please initialize the log4net system properly.
log4net: Logger:    Current AppDomain context information: 
log4net: Logger:       BaseDirectory   : C:\Sample\bin\Debug\
log4net: Logger:       FriendlyName    : SampleTestApp.vshost.exe
log4net: Logger:       DynamicDirectory: 
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]

我假设创建了记录器,因为即使我明确使用LoggerFactory创建“test_logger”记录器,我也会遇到相同的错误。因此,只需弄清楚如何为该记录器创建附加程序。我尝试使用以前的代码FileAppender为此记录器创建一个,但即使代码运行,我也会收到相同的错误。

任何人都可以为我建议一些事情来尝试让它发挥作用吗?

编辑——我应该澄清一下,我真的希望所有日志消息都进入由测试应用程序创建的 FileAppender。我想避免有单独的文件(每个程序集一个)。

4

0 回答 0