可以动态更改日志文件路径(定期)

时间:2012-01-03 15:14:26

标签: log4net

我一直在尝试使用log4net,因为它似乎不支持我的项目所需的特定日志记录功能。 简而言之,我希望能够在代码中控制日志文件路径。此路径将不断变化。特定用例是一组文件系统观察程序,每个实例都需要一个单独的日志文件。

可以这样做吗?

我希望能够在代码中指定一个控制日志记录目标的变量。

例如:

var log4NetLogger1 = new Log4NetLogger("LogFileAppender1");

log4NetLogger1.InformationEvent("Log message 1");

var log4NetLogger2 = new Log4NetLogger("LogFileAppender2");

log4NetLogger2.InformationEvent("Log message 2");

在上面的例子中,我将一个字符串传递给log4net包装器,它与配置中的appender名称相匹配。我们的想法是log4net包装器通过GetLogger修改正在使用的appender来更改日志记录目标。

_log = log4net.LogManager.GetLogger(appenderName);

结果是创建了两个不同的日志文件,但是日志消息都写入了这两个文件。似乎log4net配置的某些方面是全局的,我无法以这种方式动态更改日志路径。

配置文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

  <log4net>

    <root>
      <appender-ref ref="LogFileAppender1"/>
      <appender-ref ref="LogFileAppender2"/>
    </root>

    <appender name="LogFileAppender1" type="log4net.Appender.RollingFileAppender">
      <threshold value="INFO"/>
      <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog1.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
      </layout>
    </appender>

    <appender name="LogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <threshold value="INFO"/>
      <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog2.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
      </layout>
    </appender>

  </log4net>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

完整包装类:

using System;
using log4net;

namespace Log4NetRunner
{
    public enum LoggingLevel
    {
        Information,
        Warning,
        Error
    }

    public class Log4NetLogger
    {
        private readonly ILog _log;

        public Log4NetLogger(Type type)
        {
            if (_log == null)
            {
                _log = log4net.LogManager.GetLogger(type);
            }
        }

        public Log4NetLogger(string appenderName)
        {
            if (_log == null)
            {

                _log = log4net.LogManager.GetLogger(appenderName);
            }
        }

        public void FatalErrorEvent(string messageText)
        {
            SendLog(messageText, LoggingLevel.Error);
        }

        public void WarningEvent(string messageText)
        {
            SendLog(messageText, LoggingLevel.Warning);
        }

        public void InformationEvent(string messageText)
        {
            SendLog(messageText, LoggingLevel.Information);
        }

        private void SendLog(string messageText, LoggingLevel logLevel)
        {
            ILog logger = _log;

            switch (logLevel)
            {
                case LoggingLevel.Error:
                    logger.Error(messageText);
                    break;
                case LoggingLevel.Warning:
                    logger.Warn(messageText);
                    break;
                case LoggingLevel.Information:
                    logger.Info(messageText);
                    break;
                default:
                    logger.Error("Unknown Logging level: " + messageText);
                    break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

是的,你只需要使用配置的记录器部分。

http://www.beefycode.com/post/Log4Net-Tutorial-pt-5-Using-Logger-Objects.aspx

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

  <log4net>

    <root>
      <!--<appender-ref ref="LogFileAppender1"/>
      <appender-ref ref="LogFileAppender2"/>-->
    </root>

    <logger name="Logger1">
      <level value="ALL" />
      <appender-ref ref="LogFileAppender1" />
    </logger>

    <logger name="Logger2">
      <level value="ALL" />
      <appender-ref ref="LogFileAppender2" />
    </logger>

    <appender name="LogFileAppender1" type="log4net.Appender.RollingFileAppender">
      <threshold value="INFO"/>
      <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog1.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
      </layout>
    </appender>

    <appender name="LogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <threshold value="INFO"/>
      <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog2.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
      </layout>
    </appender>

  </log4net>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>