我正在尝试正确配置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”记录器,我也会收到相同的错误。因此,只需要弄清楚如何为该记录器创建appender。我曾尝试使用前面的代码为此记录器创建FileAppender
,但即使代码运行,我也会遇到同样的错误。
有人可以建议让我尝试让它发挥作用吗?
编辑 - 我应该澄清我真的希望所有日志消息都进入由测试应用程序创建的FileAppender。我想避免使用单独的文件(每个程序集一个)。