log4net簡介
log4net庫是Apache log4j框架在Microsoft.NET平台的實現,是一個幫助程序員將日志信息輸出到各種目標(控制台、文件、數據庫等)的工具。
log4net詳解
Appenders
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
使用過濾器可以過濾掉Appender輸出的內容
屬性 | 說明 |
---|---|
DenyAllFilter | 阻止所有的日志事件被記錄 |
LevelMatchFilter | 只有指定等級的日志事件才被記錄 |
LevelRangeFilter | 日志等級在指定范圍內的事件才被記錄 |
LoggerMatchFilter | 與Logger名稱匹配,才記錄 |
PropertyFilter | 消息匹配指定的屬性值時才被記錄 |
StringMathFilter | 消息匹配指定的字符串才被記錄 |
Layouts
Layout用於控制Appender的輸出格式,可以是線性的也可以是XML。
屬性 | 說明 |
---|---|
SimpleLayout | 簡單輸出格式,只輸出日志級別與消息內容。 |
RawTimeStampLayout | 用來格式化時間,在向數據庫輸出時會用到。 |
ExceptionLayout | 需要給Logger的方法傳入Exception對象作為參數才起作用,否則就什么也不輸出。輸出的時候會包含Message和Trace。 |
PatterLayout | 使用最多的一個Layout,能輸出的信息很多 |
Loggers
Logger是直接和應用程序交互的組件。Logger只是產生日志,然后由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。
日志的等級,它們由高到底分別為:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
在具體寫日志時,一般可以這樣理解日志等級:
- FATAL(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運行下去的錯誤。例如,數據庫無法連接,系統出現死循環。
- ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,數據字段為空,數據操作不可完成,操作出現異常等。
- WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引起系統錯誤的信息。例如,記錄內容為空,數據內容不正確等。
- INFO(一般信息):記錄系統運行中應該讓用戶知道的基本信息。例如,服務開始運行,功能已經開戶等。
- DEBUG (調試信息):記錄系統用於調試的一切信息,內容或者是一些關鍵數據內容的輸出。
log4net使用說明
引用log4net
在NuGet管理中直接搜索安裝即可。
編寫配置文件
個人常用的配置文件僅供參考。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!-- Level的級別,由高到低 -->
<!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL-->
<!-- 解釋:如果level是ERROR,則在cs文件里面調用log4net的info()方法,則不會寫入到日志文件中-->
<log4net>
<!--錯誤日志類-->
<logger name="logerror">
<!--日志類的名字-->
<level value="ALL" />
<!--定義記錄的日志級別-->
<appender-ref ref="ErrorAppender" />
<!--記錄到哪個介質中去-->
</logger>
<!--信息日志類-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!--錯誤日志附加介質-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!-- name屬性指定其名稱,type則是log4net.Appender命名空間的一個類的名稱,意思是,指定使用哪種介質-->
<param name="File" value="Log\\LogError\\" />
<!--日志輸出到exe程序這個相對目錄下-->
<param name="AppendToFile" value="true" />
<!--輸出的日志不會覆蓋以前的信息-->
<param name="MaxSizeRollBackups" value="100" />
<!--備份文件的個數-->
<param name="MaxFileSize" value="10240" />
<!--當個日志文件的最大大小-->
<param name="StaticLogFileName" value="false" />
<!--是否使用靜態文件名-->
<param name="DatePattern" value="yyyyMMdd".txt"" />
<!--日志文件名-->
<param name="RollingStyle" value="Date" />
<!--文件創建的方式,這里是以Date方式創建-->
<!--錯誤日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="時間:%date %n線程ID[%thread]
%n日志級別:%-5level %n記錄類:%logger %n擴展信息:%property
-%n異常:%exception %n錯誤描述:%n%message%newline%n"/>
</layout>
</appender>
<!--信息日志附加介質-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".txt"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="時間:%date %n線程ID[%thread]
%n日志級別:%-5level %n記錄類:%logger %n擴展信息:%property
-%n異常:%exception %n錯誤描述:%n%message%newline%n"/>
</layout>
</appender>
</log4net>
</configuration>
其中layout節點的配置說明:
- %m(message):輸出的日志消息;
- %n(newline):換行;
- %d(datetime):輸出當前語句運行的時刻;
- %r(runtime):輸出程序從運行到執行到當前語句時消耗的毫秒數;
- %t(threadid):當前語句所在的線程ID ;
- %p(priority): 日志的當前日志級別;
- %c(class):當前日志對象的名稱;
- %L:輸出語句所在的行號;
- %F:輸出語句所在的文件名;
- %-10:表示最小長度為10,如果不夠,則用空格填充
編寫擴展方法
using System;
namespace Common
{
public class LogHelper
{
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void WriteLog(string info, Exception ex)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, ex);
}
}
}
}
在應用程序的主入口點中讀取配置文件
using log4net.Config;
using System;
using System.IO;
using System.Windows.Forms;
namespace AppSettings
{
static class Program
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
InitLog4Net();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SettingsForm());
}
private static void InitLog4Net()
{
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
XmlConfigurator.ConfigureAndWatch(logCfg);
}
}
}
程序中調用
引用上面的LogHelper
try
{
//需要檢測異常的代碼
}
catch (Exception ex)
{
LogHelper.WriteLog("自定義的描述信息", ex);
}
日志輸出如下
文件結構
日志內容