log4net配置及使用


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&quot;.txt&quot;" />
			<!--日志文件名-->
			<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&quot;.txt&quot;" />
			<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);
    }

日志輸出如下

文件結構

日志內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM