2017-08-30 125 views
0

编辑:我收回,我有我的代码中的错误,一旦我修好了,它的工作原理。代码现在更新为工作版本。 错误发生在ThreadContext.Properties[KEY_LOG_FOLDER] = loggerName;ThreadContext.Properties[KEY_LOG_FILE] = loggerName;。我不小心把"KEY_LOG_FOLDER""KEY_LOG_FILE"放在引号中,它们应该是其他地方定义的常量字符串。log4net有每个连接appender

我想每个连接都有一个滚动文件appender。连接动态进入并且不能在启动时确定。目前,我想以下几点:

XML:

<log4net> 
    <logger name="Connection.CommunicationLogger"> 
    <appender-ref ref="ConnectionCommunicationFileAppender"/> 
    <level value="ALL"/> 
    </logger> 

    <appender name="ConnectionCommunicationFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="C:\logs\%property{LogFolder}\%property{LogName}.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="100KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date: %message%newline" /> 
    </layout> 
    </appender> 
</log4net> 

代码:

public FileLogger(string loggerName) 
{ 
    string logsDir = ConfigurationManager.AppSettings["LogRootDirectory"]; 
    System.IO.Directory.CreateDirectory(logsDir + "\\" + loggerName); 

    ILoggerRepository loggerRepository = LogManager.CreateRepository(loggerName + REPOSITORY); 

    ThreadContext.Properties[KEY_LOG_FOLDER] = loggerName; 
    ThreadContext.Properties[KEY_LOG_FILE] = loggerName; 

    log4net.Config.XmlConfigurator.Configure(loggerRepository); 
    logger = LogManager.GetLogger(loggerName + REPOSITORY, "Connection.CommunicationLogger"); 
} 

然而,这似乎并没有当这一切都执行迅速开展工作。

我应该以编程方式为每个连接创建appender,否则这将是不好的做法?

回答

2

我相信文件名只会设置一次,所以不会每次登录。如果你想要不同的文件名,一个选项可以动态地为每个文件创建不同的记录器,就像你在你的问题中提出的那样。