我试图找到比我聪明的人来验证我写的一些语法.我的想法是将RollingFileAppender的文件名配置为程序集的名称,以使其更适用于我的项目.
我已经看过这篇以前的SO文章,但它并不完全能够回答我的问题......
我有一段时间试图理解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(); } }
任何人都可以告诉我,"这很可怕",或者"这应该可以正常工作"?另外,如果我动态设置文件,我仍然可以期望log4net行为根据log4net.config文件设置旋转文件吗?
非常感激!
你正在努力做到这一点!在应用程序的配置文件中将log4net配置定义为XML并使用%property{}
以获得优势:
....
这是动态的 - 您只需在初始化log4net 之前设置log4net属性" LogName
" .因此,在配置log4net之前的任何时候,在代码中,设置此属性的所需值:
string LogName = GetType().Assembly.GetName().Name + ".log"; log4net.GlobalContext.Properties["LogName"] = LogName;
当然,您可以使用任何属性名称.我选择了"LogName"作为一个简单的例子,但是如果你想要的话,每个应用程序都可以有一个,只要你的代码知道正确的属性名称是什么以及正确的值应该是什么.
在2015年,我们这样做:
无需其他代码.
App域是执行程序集的文件名.
以下是在运行时设置或更改第一个appender的日志文件的方法:
var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0]; appender.File = "C:\whatever.log"; appender.ActivateOptions();