目錄
Log4net
NuGet安裝
配置檔案
代碼加載
調用
輸出
其他說明
Appender
Filters
日志等級
layout節點配置說明
Log4net
Log4net是一個.Net版的開源日志架構,它的功能很強大,可以将日志分為不同的等級,以不同的格式輸出到不同的存儲媒體中,比如:資料庫、txt檔案、記憶體緩沖區、郵件、控制台、ANSI終端、遠端接收端等等。
NuGet安裝
配置檔案
建立配置檔案log4net.config, 在檔案屬性–>複制到輸出目錄->選擇始終複制(将檔案複制到執行目錄下,以便代碼加載)
示例(輸出到控制台和檔案):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--聲明一個名為“log4net“的自定義配置節-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!--Appenders用來定義日志的輸出方式,即日志要寫到那種媒體上去-->
<!--控制台Trace Appender --> <!--ConsoleAppender:将日志輸出到應用程式控制台-->
<appender name="TraceConsoleAppender" type="log4net.Appender.ConsoleAppender">
<!--Layout用于控制Appender的輸出格式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date:%-5level - %message%newline" />
</layout>
</appender>
<!--控制台Error Appender -->
<appender name="ErrorConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date:%-5level - %message%newline" />
</layout>
</appender>
<!--檔案Trace Appender --> <!--RollingFileAppender:将日志以復原檔案的形式寫到檔案中-->
<appender name="TraceLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志檔案路徑(相對路徑), 按照日期形式輸出時,直接連接配接元素DatePattern的value形成檔案路徑-->
<file value="Logs\TraceLogs\Log_"/>
<!--是否追加到檔案-->
<appendToFile value="true"/>
<!--最多産生的日志檔案數,超過則隻保留最新的n個。設定值value="-1"為不限檔案數-->
<param name="MaxSizeRollBackups" value="50" />
<!--是否隻寫到一個檔案中-->
<StaticLogFileName value="false" />
<!--按照何種方式産生多個日志檔案(日期[Date],檔案大小[Size],混合[Composite])-->
<rollingstyle value="Date"/>
<datePattern value="yyyyMMdd'.txt'"/>
<!--使用過濾器可以過濾掉Appender輸出的内容, LevelRangeFilter:日志等級在指定範圍内的事件才被記錄, 架構提供多種過濾器-->
<filter type="log4net.Filter.LevelRangeFilter">
<LevelMin value="DEBUG"/>
<LevelMax value="WARN"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<!--日志起始-->
<header value="--------------- TRACE LOG START ----------------------- " />
<!--日志結尾-->
<Footer value="---------------- TRACE LOG CLOSE ----------------------- " />
<!-- 輸出格式: 發生日志事件的本地時間 :日志等級 - 輸出的消息 換行-->
<ConversionPattern value="%date:%-5level - %message%newline" />
</layout>
</appender>
<!--檔案Error Appender -->
<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\ErrorLogs\Log_" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<header value="--------------- ERROR LOG START ----------------------- " />
<Footer value="--------------- ERROR LOG CLOSE ----------------------- " />
<ConversionPattern value="%date:%-5level - %message%newline" />
</layout>
</appender>
<!--Logger是直接和應用程式互動的元件。Logger隻是産生日志,然後由它引用的Appender記錄到指定的媒介,并由Layout控制輸出格式-->
<logger name="TraceLog">
<!--log日志級别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
<!--高于等級設定值的方法都能寫入日志。例如當我們設成Info時,logger.Debug就會被忽略而不寫入檔案,但是FATAL,ERROR,WARN,INFO會被寫入,因為他們等級高于INFO。-->
<level value="ALL"/>
<!--引用上文定義的appender-->
<appender-ref ref="TraceLogFileAppender"/>
<appender-ref ref="TraceConsoleAppender"/>
</logger>
<logger name="ErrorLog">
<level value="WARN"/>
<appender-ref ref="ErrorConsoleAppender"/>
<appender-ref ref="ErrorLogFileAppender"/>
</logger>
</log4net>
</configuration>
代碼加載
using System;
using log4net;
//使用配置檔案log4net.config, Watch=true : 監視配置檔案,當配置檔案發生變化的時候,就會重新加載。
[assembly:log4net.Config.XmlConfigurator(ConfigFile ="log4net.config",Watch =true)]
namespace LoginManagement.Common
{
public class LogHelper
{
//獲得配置檔案中相應的Logger,其中"TraceLog/ErrorLog"便是我們自定義的日志對象<logger>的name的值。
private static ILog m_TraceLog = LogManager.GetLogger("TraceLog");
private static ILog m_ErrorLog = LogManager.GetLogger("ErrorLog");
// ************************************************************************************************************
// 函數名:TraceIn
// 輸入參數:
// className: 類名稱
// func: 函數名
// info: 參數資訊
// 輸出參數:無
// 傳回值:無
// 說明:輸出函數輸入資訊
// ************************************************************************************************************
public static void TraceIn(string className, string func, string info)
{
string msg = string.Format("{0}.{1} <- {2}",className,func,info);
if (m_TraceLog.IsInfoEnabled)
{
m_TraceLog?.Info(msg);
}
}
// ************************************************************************************************************
// 函數名:TraceOut
// 輸入參數:
// className: 類名稱
// func: 函數名
// info: 傳回值和輸出參數
// 輸出參數:無
// 傳回值:無
// 說明:輸出函數傳回資訊
// ************************************************************************************************************
public static void TraceOut(string className, string func, string info)
{
string msg = string.Format("{0}.{1} -> {2}", className, func, info);
if (m_TraceLog.IsInfoEnabled)
{
m_TraceLog?.Info(msg);
}
}
// ************************************************************************************************************
// 函數名:LogError
// 輸入參數:
// className: 類名稱
// func: 函數名
// info: 報錯資訊
// 輸出參數:無
// 傳回值:位元組數組
// 說明:輸出錯誤資訊
// ************************************************************************************************************
public static void LogError(string className, string func, string info)
{
string msg = string.Format("{0}.{1} -> {2}", className, func, info);
if (m_ErrorLog.IsErrorEnabled)
{
m_ErrorLog?.Error(msg);
}
}
// ************************************************************************************************************
// 函數名:LogErrorException
// 輸入參數:
// className: 類名稱
// func: 函數名
// info: 報錯資訊
// 輸出參數:無
// 傳回值:位元組數組
// 說明:輸出錯誤資訊&異常
// ************************************************************************************************************
public static void LogErrorException(string className, string func, string info, Exception ex)
{
string msg = string.Format("{0}.{1} -> {2}", className, func, info);
if (m_ErrorLog.IsErrorEnabled)
{
m_ErrorLog?.Error(msg,ex);
}
}
}
}
調用
using System.Reflection;
private void DoLogin(object o)
{
try
{
LogHelper.TraceIn(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, string.Format("object o:{0}", o));
if (string.IsNullOrEmpty(LoginModel.UserName))
{
LoginModel.ErrorMessage = "使用者名不能為空";
LogHelper.LogError(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, "登入失敗,使用者名不能為空");
return;
}
// ...
}
catch (Exception ex)
{
LogHelper.LogErrorException(MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, "登入異常" , ex);
}
}
輸出
根據log4net.config配置的檔案路徑,生成對應的log檔案夾和檔案
其他說明
Appenders
- AdoNetAppender 将日志記錄到資料庫中。可以采用SQL和存儲過程兩種方式。
- AnsiColorTerminalAppender 将日志高亮輸出到ANSI終端。
- AspNetTraceAppender 能用asp.net中Trace的方式檢視記錄的日志。
- BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。
- ConsoleAppender 将日志輸出到應用程式控制台。
- EventLogAppender 将日志寫到Windows Event Log。
- FileAppender 将日志輸出到檔案。
- ForwardingAppender 發送日志事件到子Appenders。
- LocalSyslogAppender 将日志寫到local syslog service (僅用于UNIX環境下)。
- MemoryAppender 将日志存到記憶體緩沖區。
- NetSendAppender 将日志輸出到Windows Messenger service.這些日志資訊将在使用者終端的對話框中顯示。
- OutputDebugStringAppender 将日志輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,将忽略消息。
- RemoteSyslogAppender 通過UDP網絡協定将日志寫到Remote syslog service。
- RemotingAppender 通過.NET Remoting将日志寫到遠端接收端。
- RollingFileAppender 将日志以復原檔案的形式寫到檔案中。
- SmtpAppender 将日志寫到郵件中。
- SmtpPickupDirAppender 将消息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。
- TelnetAppender 用戶端通過Telnet來接受日志事件。
- TraceAppender 将日志寫到.NET trace 系統。
- UdpAppender 将日志以無連接配接UDP資料報的形式送到遠端宿主或用UdpClient的形式廣播。
Filters
- DenyAllFilter 阻止所有的日志事件被記錄
- LevelMatchFilter 隻有指定等級的日志事件才被記錄
- LevelRangeFilter 日志等級在指定範圍内的事件才被記錄
- LoggerMatchFilter 與Logger名稱比對,才記錄
- PropertyFilter 消息比對指定的屬性值時才被記錄
- StringMathFilter 消息比對指定的字元串才被記錄
日志等級
- FATAL(緻命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運作下去的錯誤。例如,資料庫無法連接配接,系統出現死循環。
- ERROR(一般錯誤):記錄系統中出現的導緻系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,資料字段為空,資料操作不可完成,操作出現異常等。
- WARN(警告):記錄系統中不影響系統繼續運作,但不符合系統運作正常條件,有可能引起系統錯誤的資訊。例如,記錄内容為空,資料内容不正确等。
- INFO(一般資訊):記錄系統運作中應該讓使用者知道的基本資訊。例如,服務開始運作,功能已經開戶等。
- DEBUG (調試資訊):記錄系統用于調試的一切資訊,内容或者是一些關鍵資料内容的輸出。
layout節點配置說明
- %m(message):輸出的日志消息;
- %n(newline):換行;
- %d(datetime):輸出目前語句運作的時刻;
- %r(runtime):輸出程式從運作到執行到目前語句時消耗的毫秒數;
- %t(threadid):目前語句所在的線程ID ;
- %p(priority): 日志的目前日志級别;
- %c(class):目前日志對象的名稱;
- %L:輸出語句所在的行号;
- %F:輸出語句所在的檔案名;
- %-10:表示最小長度為10,如果不夠,則用空格填充
參考:
[1] 非常完善的Log4net詳細說明_芒果兒-CSDN部落格_log4net
[2] log4net配置及使用 - 故人與貓 - 部落格園 (cnblogs.com)