最好的方式来dynamic设置appender文件path

我试图find比我更聪明的人来validation我写的一些语法。 我的想法是将我的RollingFileAppender的文件名configuration为程序集的名称,以使其更适合于我的项目。

我已经看过这篇以前的文章,但它不完全能够回答我的问题…

我有一段时间试图了解Log4net的内部组件,这就是我想到的(驻留在Global.asax文件 – Application_Start方法中):

// Bind to the root hierarchy of log4net log4net.Repository.Hierarchy.Hierarchy root = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy; if (root != null) { // Bind to the RollingFileAppender log4net.Appender.RollingFileAppender rfa = (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender"); if (rfa != null) { // Set the file name based on the assembly name string filePath = string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name); // Assign the value to the appender rfa.File = Server.MapPath(filePath); // Apply changes to the appender rfa.ActivateOptions(); } } 

谁能告诉我,'这是可怕的',或'这应该工作正常'? 此外,如果我dynamic设置文件,我仍然可以期待log4net行为根据log4net.config文件设置来旋转文件?

非常感激!

你这样做是很难的! 在应用程序的configuration文件中将log4netconfiguration定义为XML,并使用%property{}来获得优势:

 <appender name="YourAppender" type="log4net.Appender.RollingFileAppender"> <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" /> .... </appender> 

这是dynamic的 – 初始化log4net 之前,您只需设置log4net属性“ LogName ”。 因此,在您configurationlog4net之前的任何时间,请在您的代码中设置此属性的所需值:

 string LogName = GetType().Assembly.GetName().Name + ".log"; log4net.GlobalContext.Properties["LogName"] = LogName; 

当然,你可以使用任何属性名称。 我已经select了“LogName”作为一个简单的例子,但是如果你愿意,你可以为每个应用程序添加一个,只要你的代码知道什么是正确的属性名称和正确的值应该是什么。

在2015年,我们这样做:

 <file type="log4net.Util.PatternString"> <conversionPattern value="%appdomain.log" /> </file> 

没有其他的代码需要。

应用程序域是执行程序集的文件名。

这是在运行时设置或更改第一个appender的日志文件的方法:

 var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0]; appender.File = "C:\whatever.log"; appender.ActivateOptions(); 

我一直在用%property {}来做同样的事情,但是文件被创build为“(nul).log”。 以下是代码:

 log4net.GlobalContext.Properties["service"] = _servicename.ToString(); _flatFileLogger = LogManager.GetLogger("FlatFileLogger"); _flatFileLogger.Debug(logData.ToString()); 

我已经在XML文件中声明为

 <file type="log4net.Util.PatternString" value="C:\MY_Log\%property{Service}.log" />