最好的方式来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" />