40

我正在尝试自定义 log4net 文件路径以使用我在log4net.GlobalContext.Properties字典中设置的属性。

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue";

通过它进行调试时,我可以看到该值设置正确。然后在我的配置中

<file type="log4net.Util.PatternString" 
      value="Logs\%appdomain_%property{LogPathModifier}.log" />

然而,这个输出在路径的末尾给了我“_(null).log”。是什么赋予了?

4

4 回答 4

58

我遇到了同样的行为,并通过在调用 XmlConfigurator 之前设置全局变量来解决它......这是我成功使用的内容:

log4net.config 详细信息:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" />
  ...
</appender>

Global.asax 详细信息:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax");
void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    // Record application startup
    log.Debug("Application startup");
}

希望这可以帮助...

于 2009-02-21T04:12:53.263 回答
16

将 type= 添加log4net.Util.PatternString到 File 元素中

于 2009-06-01T20:35:40.230 回答
4

问题(我认为)是您在设置名称并加载配置之前获取(GetLogger)记录器......

尝试像这样声明记录器:private static log4net.ILog _pLog 然后在 Application_Start 中执行:

void Application_Start(object sender, EventArgs e) 
{
    // Set logfile name and application name variables
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log";
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name;

    // Load log4net configuration
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config"));
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile);

    //Get the loger
    _pLog = log4net.LogManager.GetLogger("Global.asax");

    // Record application startup
    pLog .Debug("Application startup");
}

所以顺序是:

// Set logfile name and application name variables
// Load log4net configuration
// get the logger
// Record application startup
于 2009-06-04T14:47:18.293 回答
1

logger 是否通过应用程序中的 global 或 main 方法进行了初始化?可能是 GlobalContext 尚未初始化。

于 2009-02-18T17:54:39.583 回答