簡體   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