How do I use a GlobalContext property in a log4net appender name?

后端 未结 4 1609
终归单人心
终归单人心 2020-12-01 00:37

I\'m trying to customise a log4net file path to use a property I have set in the log4net.GlobalContext.Properties dictionary.

log4net.GlobalCont         


        
相关标签:
4条回答
  • 2020-12-01 01:10

    The problem( I think) is that you GET(GetLogger) the logger before you set the name and load the config...

    Try to do declare the logger like: private static log4net.ILog _pLog and then in the Application_Start do:

    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");
    }
    

    So the sequence is:

    // Set logfile name and application name variables
    // Load log4net configuration
    // get the logger
    // Record application startup
    
    0 讨论(0)
  • 2020-12-01 01:12

    Add type=log4net.Util.PatternString into File element

    0 讨论(0)
  • 2020-12-01 01:26

    I ran into the same behavior and solved it by setting the global variable before calling the XmlConfigurator... Here is what I am successfully using:

    log4net.config details:

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

    Global.asax details:

    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");
    }
    

    Hope this helps...

    0 讨论(0)
  • 2020-12-01 01:35

    Has the logger been initialized through the global or main method in the application? It could be that the GlobalContext has not been initialize yet.

    0 讨论(0)
提交回复
热议问题