繁体   English   中英

为整个项目配置Log4Net

[英]Configure Log4Net for the full project

我有以下代码,可以很好地记录所有内容。 我是否必须将其添加到所有类的构造函数中?

无论如何,是否需要为整个项目进行配置? 我想我可以将日志传递给所有类,但是接缝就像一个混乱的解决方案。

class Program
{
    /// <summary>
    /// Application start
    /// <param name="settings"></param>
    /// <returns></returns>
    static int Main(string[] args)
    {
    string logFile = string.Format(@"{0}\Cloud\Cloud.Log", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
    log4net.GlobalContext.Properties["LogFileName"] = logFile;
    log4net.Config.XmlConfigurator.Configure();
    ILog log = log4net.LogManager.GetLogger(typeof(Program));
    log.Info("Console Applicatin Start");
    }
}

如何为完整解决方案配置Log4Net?

我认为这与问题无关,但这是我的App.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LogFileName}.txt"  />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="250KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

我通常使用包装器类。 就像是:

public class Logger
{
    private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Logger));

    static Logger()
    {
        log4net.Config.XmlConfigurator.Configure();
    }

    public void Error(string format, params object[] args)
    {
        _log.Error(string.Format(format, args));
    }

    //...
}

然后在需要的地方实例化该实例。 喜欢:

private Logger _log = new Logger();

并使用它像:

_log.Error("Something went wrong, Exception: {0}, More parameters: {1}",
    e.Message, "Another parameter");

log4net.Config.XmlConfigurator.Configure();

应该根据您的app.config配置log4net。

编辑

我以为我会发布我的log4net配置,以防您想尝试一种已被确认有效的配置。 它设置了一个文件记录器和一个控制台记录器(可用于查看开发环境中的记录):

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="ConsoleAppender" />
    <appender-ref ref="DebugFileLogger" />
  </root>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger: %message%newline" />
    </layout>
  </appender>
  <appender name="DebugFileLogger" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="Logs/DebugLog.log" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="20MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d%t %m%n" />
    </layout>
  </appender>
</log4net>

我最经常看到的解决方案是创建一个LogManager类,并在每个类中创建一个属性以获取记录器的实例,因此,这是每个类中获取记录器所需的唯一代码行:

private ILog _log;

public ILog Log
{
    get { return _log ?? (_log = LogManager.GetLogger(LogName.WebServices)); }
}

LogName.WebServices是一个Enum值,应使用更多值进行扩展,以便您可以过滤更多日志。

log4net的一大功能是能够根据记录器名称不同地配置过滤和处理功能:将记录器包装在包装器,单例或静态对象中的任何解决方案都将丢失,因为所有日志都将使用相同的记录器名称-并且立即查看日志条目来自哪个类的有用功能。

在要登录的类中,您需要的只是一个字段,例如:

private static ILog Log =        
             LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

它将记录器名称设置为其包含的类型的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM