[英]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.