web-dev-qa-db-ja.com

log4netアペンダー名でGlobalContextプロパティを使用するにはどうすればよいですか?

log4net.GlobalContext.Properties辞書で設定したプロパティを使用するようにlog4netファイルパスをカスタマイズしようとしています。

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

デバッグすると、この値が正しく設定されていることがわかります。そして私の構成で

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

ただし、この出力では、パスの最後に「_(null).log」が表示されます。何ができますか?

40
Long Pham

私は同じ動作に遭遇し、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");
}

お役に立てれば...

57
Dscoduc

Type = log4net.Util.PatternStringをFile要素に追加します

16
David-Z

問題(私は思う)は名前を設定して設定をロードする前にロガーをGET(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
4
Daniel

ロガーはアプリケーションのグローバルメソッドまたはメインメソッドを介して初期化されましたか? GlobalContextがまだ初期化されていない可能性があります。

1
Dillie-O