动态设置appender文件路径的最佳方法

时间:2009-02-21 01:27:20

标签: c# log4net

我试图找到一个比我聪明的人来验证我写的一些语法。我的想法是将RollingFileAppender的文件名配置为程序集的名称,以使其更适用于我的项目。

我见过this previous SO article,但它无法完全回答我的问题......

我曾经有过一段时间试图理解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文件设置来旋转文件吗?

非常感谢!

4 个答案:

答案 0 :(得分:91)

你正在努力做到这一点!在应用程序的配置文件中将log4net配置定义为XML,并使用%property{}来获益:

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

这是动态的 - 您只需在初始化log4net之前设置log4net属性“LogName 。因此,在配置log4net之前的任何时候,在代码中,设置此属性的所需值:

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

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:8)

2015年,我们这样做:

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

无需其他代码。

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

答案 3 :(得分:2)

日期对我有用 <file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />