40

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

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

log4net.Util.PatternStringtype=を File 要素に追加する

于 2009-06-01T20:35:40.230 に答える
4

問題(私が思うに)は、名前を設定して構成をロードする前にロガーを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
于 2009-06-04T14:47:18.293 に答える
1

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

于 2009-02-18T17:54:39.583 に答える