Log4net 日誌

Log4net 日誌使用介紹
802

概述

Log4net 有三個主要組件:loggers,appenders 和 layouts這三個組件一塊兒工做使得開發者可以根據信息類型和等級(Level)記錄信息,以及在運行時控制信息的格式化和信息的寫入位置(如控制檯,文件,內存,數據庫等)。過濾器(filter)幫助這些組件,控制追加器(appender)的行爲和把對象轉換成字符串的對象渲染。數據庫

若是對log4net的基本使用並非很清楚,能夠參考個人另外一遍介紹:Log4net入門使用apache

日誌(Loggers)

日誌請求是經過調用一個日誌實例的打印方法(log4net.ILog)完成。這些打印方法是 Debug、Info、Warn、Error  Fatal緩存

根據定義,打印方法決定日誌請求的等級。例如,若是 log 是一個日誌器的實例,那麼,語句 log.Info("..") 是等級爲 INFO 的日誌請求。服務器

若是它的等級大於等於它日誌器的等級,那麼日誌請求就被認爲已啓用。不然,請求被認爲禁用。沒有分配等級的日誌器將從層次上繼承。規則以下:網絡

Basic Selection Rulesession

A log request of level L in a logger with (either assigned or inherited, whichever is appropriate) level K, is enabled if L >= K.app

該規則是 log4net 的核心。它假設等級是有序的。對於標準等級,具備 DEBUG < INFO < WARN < ERROR < FATAL。asp.net

用相同的參數調用 log4net.LogManager.GetLogger 方法老是返回引用一個徹底相同 logger 對象。以下所示:

ILog x = LogManager.GetLogger("wombat");
ILog y = LogManager.GetLogger("wombat");

x 和 y 徹底引用一個相同的 logger 對象。

所以,有可能配置一個日誌器,而後在代碼中的任何地方均可以檢索到相同的實例。在生物學上,父母老是先於它們的孩子,而 log4net 日誌器能夠以任何順序建立和配置。具體地說,一個「父」日誌器將發現和連接到它的後代,即便它在它的後代以後才實例化。

log4net 環境的配置一般是在應用程序初始化。優先的方法是讀取一個配置文件。

追加器(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的形式廣播。

AdoNetAppender

將日誌記錄到數據庫中。詳情參考 log4net.Appender. AdoNetAppender SDK文檔

MS SQL Server

創建數據表:

複製代碼
複製代碼
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)
複製代碼
複製代碼

appender配置:

複製代碼
複製代碼
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>
複製代碼
複製代碼

MS Access

創建數據表同「MS SQL Server」

appender配置:

複製代碼
複製代碼
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
    <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\log\access.mdb;User Id=;Password=;" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="1024" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
</appender>
複製代碼
複製代碼

 Oracle9i

創建數據表:

複製代碼
複製代碼
create table log (
   Datetime timestamp(3),
   Thread varchar2(255),
   Log_Level varchar2(255),
   Logger varchar2(255),
   Message varchar2(4000)
   );  
複製代碼
複製代碼

appender配置:

複製代碼
複製代碼
<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />
    <bufferSize value="128" />
    <parameter>
        <parameterName value=":log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value=":thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value=":log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value=":logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value=":message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
</appender>
                
複製代碼
複製代碼

SQLite

創建數據表:

複製代碼
複製代碼
CREATE TABLE Log (
    LogId        INTEGER PRIMARY KEY,
    Date        DATETIME NOT NULL,
    Level        VARCHAR(50) NOT NULL,
    Logger        VARCHAR(255) NOT NULL,
    Message        TEXT DEFAULT NULL
);
複製代碼
複製代碼

appender配置:

複製代碼
複製代碼
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="Finisar.SQLite.SQLiteConnection, SQLite.NET, Version=0.21.1869.3794, Culture=neutral, PublicKeyToken=c273bd375e695f9c" />
    <connectionString value="Data Source=c:\\inetpub\\wwwroot\\logs\\log4net.db;Version=3;" />
    <commandText value="INSERT INTO Log (Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" />
    <parameter>
        <parameterName value="@Date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@Level" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@Logger" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
</appender>
複製代碼
複製代碼

實際上,你會發現,創建數據表都是差很少的,appender配置幾乎也一致。若是咱們每種數據庫的表字段都保持一致,實際上,只須要改:connectionType、connectionString、commandText

postgres

      <connectionType value="Npgsql.NpgsqlConnection, Npgsql" />
      <connectionString value="Server=localhost;Port=5432;Database=pp_log;User Id=postgres;Password=123;" />
      <commandText value="INSERT INTO log (date,thread,level,logger,message,exception) VALUES (:log_date, :thread, :log_level,:logger, :message, :exception)" />

IBM DB2

複製代碼
複製代碼
    <connectionType value="IBM.Data.DB2.DB2Connection,IBM.Data.DB2, Version=8.1.2.1" />
    <connectionString value="server=192.168.0.0;database=dbuser;user Id=username;password=password;persist security info=true" />
    <commandText value="INSERT INTO myschema.Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date,@thread,@log_level,@logger,@message,@exception)" />
複製代碼
複製代碼

AspNetTraceAppender

詳情參考 log4net.Appender.AspNetTraceAppender SDK 文檔。 

這段配置可將日誌信息輸出到頁面的Trace上下文環境。若是日誌的級別低於WARN,會以System.Web.TraceContext.Write方法輸出;若是級別爲WARN或WARN以上則會以System.Web.TraceContext.Warn方法輸出,下圖中的日誌信息的不一樣顏色能夠說明這一點。 效果圖以下:

複製代碼
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼

BufferingForwardingAppender 

詳情參考 log4net.Appender.BufferingForwardingAppender SDK 文檔

BufferingForwardingAppender的主要做用是將輸出到指定類型(這裏是LogFileAppender)的Appender的日誌信息進行緩存。bufferSize屬性指定了緩存的數量,若是value爲5,那麼將在信息量達到6條的時候,把這些日誌批量輸出。appender-ref屬性指定了緩存的Appender類型,同root節點同樣,這裏能夠指定多個

複製代碼
複製代碼
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
    <bufferSize value="5"/>
    <lossy value="true" />
    <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="WARN"/>
    </evaluator>
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="AspNetTraceAppender" />
</appender>
複製代碼
複製代碼

ColoredConsoleAppender

詳情參考log4net.Appender.ColoredConsoleAppender SDK 文檔

ColoredConsoleAppender將日誌信息輸出到控制檯。默認狀況下,日誌信息被髮送到控制檯標準輸出流。下面這個示例演示瞭如何高亮顯示Error信息。

複製代碼
複製代碼
    <!-- 控制檯前臺顯示日誌 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="Info" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>
複製代碼
複製代碼

效果如圖:

ConsoleAppender

詳情參考 log4net.Appender.ConsoleAppender SDK 文檔

ConsoleAppender將日誌信息輸出到控制檯標準輸出流。

複製代碼
複製代碼
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <target value="Console.Error" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼
複製代碼

EventLogAppender

詳情參考 log4net.Appender.EventLogAppender SDK 文檔 

EventLogAppender將日誌寫入本地機器的應用程序事件日誌中。默認狀況下,該日誌的源(Source)是AppDomain.FriendlyName,也能夠手動指定其它名稱。

複製代碼
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>
</appender>
複製代碼

FileAppender

詳情參考 log4net.Appender.File Appender SDK 文檔 

FileAppender將日誌信息輸出到指定的日誌文件。

複製代碼
複製代碼
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
    <param name="File" value="WebUtilClient.log" />
    <param name="AppendToFile" value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>
</appender>
複製代碼
複製代碼

File指定了文件名稱,可使用相對路徑,此時日誌文件的位置取決於項目的類型(如控制檯、Windows Forms、ASP.NET等);也可使用絕對路徑;甚至可使用環境變量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到仍是覆蓋掉已有的日誌文件。
還能夠添加以下屬性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以容許多個進程能夠寫入同一個文件。

ForwardingAppender 

詳情參考 log4net.Appender.ForwardingAppender SDK 文檔 
ForwardingAppender能夠用來爲一個Appender指定一組約束。看下面這個示例:

<appender name="ForwardingAppender" type="log4net.Appender.ForwardingAppender" >
    <threshold value="WARN"/>
    <appender-ref ref="ConsoleAppender" />
</appender>

在這個示例中,爲ConsoleAppender添加了約束,Threshold爲WARN。這意味着對於一條日誌信息,若是直接使用ConsoleAppender,那麼不論它是什麼級別,總會進行輸出,而若是使用這個ForwardingAppender,則只有那些WARN或WARN以上的日誌纔會發送到ConsoleAppender。

MemoryAppender

詳情參考 log4net.Appender.MemoryAppender SDK 文檔 
彷佛不該該使用配置文件來配置MemoryAppender,但若是你非要這麼作,看看這個示例(未驗證):

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
    <onlyFixPartialEventData value="true" />
</appender>

NetSendAppender 

詳情參考 log4net.Appender.NetSendAppender SDK 文檔

NetSendAppender向特定用戶的屏幕發送消息(未驗證)。

複製代碼
複製代碼
<appender name="NetSendAppender" type="log4net.Appender.NetSendAppender">
    <threshold value="ERROR" />
    <server value="Anders" />
    <recipient value="xym" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼
複製代碼

OutputDebugStringAppender 

詳情參考 log4net.Appender.OutputDebugStringAppender SDK 文檔。 

下面這個例子描述瞭如何配置該Appender以向OutputDebugString API寫入日誌(未驗證)。 

複製代碼
<appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender" >
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼

RemotingAppender

詳情參考 log4net.Appender.RemotingAppender SDK 文檔
RemotingAppender向特定的Sink發送日誌信息(未驗證):

複製代碼
複製代碼
<appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" >
    <sink value="tcp://localhost:8085/LoggingSink" />
    <lossy value="false" />
    <bufferSize value="95" />
    <onlyFixPartialEventData value="true" />
</appender>
複製代碼
複製代碼

RollingFileAppender

詳情參考 log4net.Appender.RollingFileAppender SDK 文檔

RollingFileAppender以FileAppender爲基礎,與後者有着相同的配置選項。

下面這個例子演示瞭如何配置RollingFileAppender以寫入log.txt文件。寫入的文件名老是爲log.txt(StaticLogFileName參數指定爲true);根據文件大小(RollingStyle)來生成新的文件;最多保存有10個文件(MaxSizeRollBackups屬性,並且一旦寫滿10個文件,就再也不寫入日誌了),每一個文件最大爲10KB。這些文件名稱爲log.txt.1, log.txt.2…等。

複製代碼
複製代碼
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="log\Log.txt" />
    <param name="AppendToFile" value="true" />
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="5MB" />
    <param name="RollingStyle" value="Size" />
    <param name="StaticLogFileName" value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>
</appender>
複製代碼
複製代碼

固然 ,這種方法也是我平時使用最多的一種方式,平時使用的配置以下:

複製代碼
複製代碼
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日誌路徑-->
      <param name= "File" value= "D:\App_Log\Servicelog\TestLog\"/>
      <!--是不是向文件中追加日誌-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天數-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日誌文件名是不是固定不變的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日誌文件名格式爲:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.read.log&quot;"/>
      <!--日誌根據日期滾動-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
      </layout>
    </appender>
複製代碼
複製代碼

SmtpAppender 詳情

詳情參考 log4net.Appender.SmtpAppender SDK 文檔

SmtpAppender經過Smtp郵件服務器發送日誌信息:

複製代碼
複製代碼
       <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
            <authentication value="Basic" />
            <to value="anderscui@tom.com" />
            <from value="anderscui@163.com" />
            <username value="anderscui" />
            <password value="password" />
            <subject value="test logging message" />
            <smtpHost value="smtp.163.com" />
            <bufferSize value="512" />
            <lossy value="true" />
            <evaluator type="log4net.Core.LevelEvaluator">
                <threshold value="WARN"/>
            </evaluator>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
            </layout>
        </appender>
複製代碼
複製代碼

將其中的to、from、username、password、subject、smtpHost配置正確纔可能發送成功。bufferSize可將多條信息打包在一個郵件中,上面配置了512,指的是將512條日記一塊兒打包後發送。evaluator能夠對日誌進行過濾。

SmtpPickupDirAppender

詳情參考 log4net.Appender.SmtpPickupDirAppender SDK 文檔
配置與SmtpAppender相似,但要把SmtpHost換爲PickupDir(未驗證)。

複製代碼
複製代碼
<appender name="SmtpPickupDirAppender" type="log4net.Appender.SmtpPickupDirAppender">
    <to value="to@domain.com" />
    <from value="from@domain.com" />
    <subject value="test logging message" />
    <pickupDir value="C:\SmtpPickup" />
    <bufferSize value="512" />
    <lossy value="true" />
    <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="WARN"/>
    </evaluator>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
    </layout>
</appender>
複製代碼
複製代碼

TraceAppender

詳情參考 log4net.Appender.TraceAppender SDK 文檔
TraceAppender將日誌信息寫入System.Diagnostics.Trace系統(出如今輸出窗口)。

複製代碼
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼

UdpAppender

詳情參考 log4net.Appender.UdpAppender SDK 文檔

下例演示瞭如何配置UdpAppender(未驗證):

複製代碼
複製代碼
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
    <localPort value="8080" />
    <remoteAddress value="224.0.0.1" />
    <remotePort value="8080" />
    <layout type="log4net.Layout.PatternLayout, log4net">
        <conversionPattern value="%-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
複製代碼
複製代碼

日誌器能夠採用多個追加器,在配置文件中,能夠直接這樣使用:

複製代碼
   <root>
      <level value="ALL" />
      <appender-ref ref="ColoredConsoleAppender" />
      <appender-ref ref="UdpAppender" />
    </root>
複製代碼

 上面分別使用了「輸出控制檯」及「UdpAppender」追加方式。

篩選(Filters)

追加器能夠篩選被傳遞給它們的事件。在配置中指定過濾器,容許更好地控制經過不一樣的追加器記錄的事件。

控制的最簡單形式是在追加器中指定閾值。

更復雜的和自定義事件過濾可使用每一個追加器中定義的過濾器鏈來完成。過濾器必須實現 log4net.Filter.IFilter 接口。

下表列出 log4net 中定義的過濾器:

類型 描述
log4net.Filter.DenyAllFilter 丟棄全部日誌事件。
log4net.Filter.LevelMatchFilter 準確匹配事件等級。
log4net.Filter.LevelRangeFilter 匹配一個範圍的等級。
log4net.Filter.LoggerMatchFilter 匹配一個日誌器名字的開始。
log4net.Filter.PropertyFilter 匹配指定屬性名稱的子字符串。
log4net.Filter.StringMatchFilter 匹配事件消息的子字符串。

過濾器能夠被配置爲根據匹配接受或拒絕事件。

佈局(Layouts)

不少時候,用戶不只但願自定義輸出目的地,還要定義輸出格式。這是經過與追加器相關的佈局(layout)來實現的。佈局負責根據用戶意願格式化日誌請求,而一個追加器負責發送已格式化的輸出到目的地。 PatternLayout,是標準的 log4net 的一部分,讓用戶根據轉換模式指定數據格式,相似於 C 語言 printf。

例如,帶轉換模式的 PatternLayout "%timestamp [%thread] %-5level %logger - %message%newline" 將會輸出:

176 [main] INFO  Com.Foo.Bar - Located nearest gas station.

第一個域是流逝毫秒時間;第二個域是日誌請求的線程;第三個域日誌語句等級,如 INFO、WARN、ERROR 等;第四個域是與日誌請求相關的日誌器的名稱。「-」後面的文本是具體消息。

下表是 log4net 中定義的佈局:

類型

描述

log4net.Layout.ExceptionLayout

Renders the exception text from the logging event.

log4net.Layout.PatternLayout

Formats the logging event according to a flexible set of formatting flags.

log4net.Layout.RawTimeStampLayout

Extracts the timestamp from the logging event.

log4net.Layout.RawUtcTimeStampLayout

Extracts the timestamp from the logging event in Universal Time.

log4net.Layout.SimpleLayout

Formats the logging event very simply: [level] - [message]

log4net.Layout.XmlLayout

Formats the logging event as an XML element.

log4net.Layout.XmlLayoutSchemaLog4j

Formats the logging event as an XML element that complies with the log4j event dtd.

 因爲PatternLayout佈局很是重要,下面具體再介紹:

下表是能夠識別的轉換模式名稱:

轉換模式名稱

效果

a

等價於 appdomain

appdomain

用於輸出當產生日誌事件時的 AppDomain 名稱。

aspnet-cache

指定 %aspnet-cache 時輸出全部 cache 項;指定 %aspnet-cache{key} 時只輸出 key 指定的項。

該模式對 Compact Framework or Client Profile 不可用。

aspnet-context

指定 %aspnet-context 時輸出全部 context 項;指定 %aspnet-context 時只輸出 key 指定的項。

該模式對 Compact Framework or Client Profile 不可用。

aspnet-request

指定 %aspnet-request 時輸出全部請求參數的項;指定 %aspnet-request{key} 時只輸出 key 指定的項。

該模式對 Compact Framework or Client Profile 不可用。

aspnet-session

指定 %aspnet-session 時輸出全部 session 項;指定 %aspnet-session{key} 時只輸出 key 指定的項。

該模式對 Compact Framework or Client Profile 不可用。

c

等價於 logger

C

等價於 type

class

等價於 type

d

等價於 date

date

以 local time zone 輸出日誌事件的日期。若輸出 universal time 日期要使用 %utcdate 模式。日期格式也能夠在模式後用大括號指定,例如,%date{HH:mm:ss,fff} 或 %date{dd MMM yyyy HH:mm:ss,fff}。若沒有指定日期格式,則將採用 ISO8601(Iso8601DateFormatter)。日期格式指示器跟 ToString 方法個式化日期時採用時間模式具備相同的語法。

推薦使用 log4net 日期格式化器,能獲得更好的輸出。經過指定字符串「ABSOLUTE」,「DATE」和「ISO8601」中的一個,分別表示AbsoluteTimeDateFormatterDateTimeDateFormatter 和  Iso8601DateFormatter。例如,%date{ISO8601} 或%date{ABSOLUTE}

這寫專用的日期格式化要比 ToString 更好。

exception

Used to output the exception passed in with the log message.

If an exception object is stored in the logging event it will be rendered into the pattern output with a trailing newline. If there is no exception then nothing will be output and no trailing newline will be appended. It is typical to put a newline before the exception and to have the exception as the last data in the pattern.

F

等價於 file

file

輸出發生日誌請求的文件名。

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

See the note below on the availability of caller location information.

identity

輸出當前活躍用戶的用戶名(Principal.Identity.Name)。

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

l

等價於 location

L

等價於 line

location

Used to output location information of the caller which generated the logging event.

位置信息(location information)依賴 CLI 的實現,但一般是由調用方法的完整限定名(fully qualified name)組成,後面跟調用者源文件名和行號。

位置信息頗有用。然而,它的產生至關慢。除非執行速度不是問題,不然要避免使用。

See the note below on the availability of caller location information.

level

輸出日誌事件的級別。

line

輸出發生日誌請求時的行號。

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

See the note below on the availability of caller location information.

logger

輸出日誌事件的日誌器。The logger conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the logger name will be printed. By default the logger name is printed in full.

例如,若日誌器名爲 "a.b.c",模式爲 %logger{2},將輸出 "b.c".

m

等價於 message

M

等價於 method

message

輸出與日誌事件相關聯的應用程序提供的信息,也就是你敲入的信息。

mdc

The MDC (old name for the ThreadContext.Properties) is now part of the combined event properties. This pattern is supported for compatibility but is equivalent to property.

method

輸出發生日誌請求時的方法名。

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

See the note below on the availability of caller location information.

n

等價於 newline

newline

輸出換行。換行是平臺依賴的,各個平臺可能不一樣。

This conversion pattern offers the same performance as using non-portable line separator strings such as "\n", or "\r\n". Thus, it is the preferred way of specifying a line separator.

ndc

輸出與生產日誌事件線程有關的 NDC(nested diagnostic context)。

p

等價於 level

P

等價於 property

properties

等價於 property

property

Used to output the an event specific property. The key to lookup must be specified within braces and directly following the pattern specifier, e.g. %property{user} would include the value from the property that is keyed by the string 'user'. Each property value that is to be included in the log must be specified separately. Properties are added to events by loggers or appenders. By default the log4net:HostName property is set to the name of machine on which the event was originally logged.

If no key is specified, e.g. %property then all the keys and their values are printed in a comma separated list.

The properties of an event are combined from a number of different contexts. These are listed below in the order in which they are searched.

the event properties
The event has  Properties  that can be set. These properties are specific to this event only.
the thread properties
The  Properties  that are set on the current thread. These properties are shared by all events logged on this thread.
the global properties
The  Properties  that are set globally. These properties are shared by all the threads in the AppDomain.

r

等價於 timestamp

stacktrace

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. For example, %stacktrace{level}. If no stack trace level specifier is given then 1 is assumed

Output uses the format: type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1

This pattern is not available for Compact Framework assemblies.

stacktracedetail

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. For example, %stacktracedetail{level}. If no stack trace level specifier is given then 1 is assumed

Output uses the format: type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)

This pattern is not available for Compact Framework assemblies.

t

等價於 thread

timestamp

Used to output the number of milliseconds elapsed since the start of the application until the creation of the logging event.

thread

輸出產生日誌事件的線程名稱。若是沒有可用的線程名稱,則使用數字。

type

Used to output the fully qualified type name of the caller issuing the logging request. This conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the class name will be printed. By default the class name is output in fully qualified form.

For example, for the class name "log4net.Layout.PatternLayout", the pattern %type{1} will output "PatternLayout".

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

See the note below on the availability of caller location information.

u

等價於 identity

username

輸出當前活躍用戶的 WindowsIdentity。

警告:產生調用位置信息至關慢。除非執行速度不是問題,不然要避免使用它。

utcdate

Used to output the date of the logging event in universal time. The date conversion specifier may be followed by adate format specifier enclosed between braces. For example, %utcdate{HH:mm:ss,fff} or %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is given then ISO8601 format is assumed (Iso8601DateFormatter).

The date format specifier admits the same syntax as the time pattern string of the ToString.

For better results it is recommended to use the log4net date formatters. These can be specified using one of the strings "ABSOLUTE", "DATE" and "ISO8601" for specifying AbsoluteTimeDateFormatter,DateTimeDateFormatter and respectively Iso8601DateFormatter. For example, %utcdate{ISO8601} or%utcdate{ABSOLUTE}.

These dedicated date formatters perform significantly better than ToString.

w

等價於 username

x

等價於 ndc

X

等價於 mdc

%

連續兩個百分號 %% 會輸出一個百分號。

 

格式修飾符

左邊對齊

最小寬度

最大寬度

備註

%20logger

false

20

若日誌器的名稱小於 20 個字符,則左邊補空格。

%-20logger

true

20

若日誌器的名稱小於 20 個字符,則右邊補空格。

%.30logger

NA

30

若日誌器的名稱大於 30 個字符,則截取。

%20.30logger

false

20

30

若日誌器的名稱小於 20 個字符,則左邊補空格。可是,若日誌器名稱的長度大於 30 個字符,則截取。

%-20.30logger

true

20

30

若日誌器的名稱小於 20 個字符,則右邊補空格。可是,若日誌器名稱的長度大於 30 個字符,則截取。

相對應的XML格式以下:

複製代碼
複製代碼
 <parameter>  
        <parameterName value="AppDomain"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%appdomain"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="AspnetCache"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%aspnet-cache"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="AspnetContext"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%aspnet-context"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="AspnetRequest"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%aspnet-request"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="AspnetSession"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%aspnet-session"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Logger"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%logger"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Date"/>  
        <dbType value="DateTime"/>  
        <layout type="log4net.Layout.RawTimeStampLayout"/>  
      </parameter>  
      <parameter>  
        <parameterName value="Identity"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%identity"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Level"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%level"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Location"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%location"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Exception"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.ExceptionLayout">  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Message"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%message"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="Thread"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%thread"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="NDC"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%ndc"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="StackTraceDetail"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%stacktracedetail{10}"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="UserName"/>  
        <dbType value="String"/>  
        <layout type="log4net.Layout.PatternLayout">  
          <conversionPattern value="%username"/>  
        </layout>  
      </parameter>  
      <parameter>  
        <parameterName value="UTCDate"/>  
        <dbType value="DateTime"/>  
        <layout type="log4net.Layout.RawUtcTimeStampLayout"/>  
      </parameter>  
    </appender>  
複製代碼
複製代碼

對象渲染(Object Renderers)

一樣重要的是,log4net 會根據用戶指定的標準呈現日誌消息的內容。例如,若是你常常須要記錄 Oranges,它是你項目中使用的一個對象類型,那麼,你能夠註冊一個 OrangeRenderer,這樣不管什麼時候須要記錄 Orange 就能夠調用。

對象渲染按照類的層次結構。例如,假設橙子是水果,若是你註冊一個 FruitRenderer,全部的水果,包括橙子,將按 FruitRenderer 渲染,除非你已經註冊一個橙子的 OrangeRenderer。 
對象渲染器必須實現 log4net.ObjectRenderer.IObjectRenderer 接口。 
注意,DebugFormat、InfoFormat、WarnFormat、ErrorFormat 和 FatalFormat 方法不使用 ObjectRenderers

使用部分心得

一、在輸出到數據庫裏,一些數據庫相關的DLL仍是須要引用的。好比:輸出到postgres 數據庫,運行時當前目錄下要有Npgsql.dll。

二、若是日誌量很是的大,將數據直接輸出到文本或者是數據庫裏,都會致使一個問題:減慢應用程序。若是太詳細,它可能會致使滾動失敗,插入數據庫失敗,致使整個運用程序掛掉。爲了解決這個問題,個人解決方案是:

經過使用UdpAppender模式,將日誌傳輸到指定的IP地址和端口下,日誌監控中心進行監控操做,將接收到的日誌進行分析,存入數據庫裏。

UdpAppender:

複製代碼
複製代碼
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
      <remoteAddress value="192.168.100.107" />
      <remotePort value="8080" />
      <layout type="log4net.Layout.PatternLayout" value="%-5level$$%logger$$%message$$%username$$%date{yyyyMMdd HH:mm:ss fff}$$" />
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="ColoredConsoleAppender" />
      <appender-ref ref="UdpAppender" />
    </root>

    <logger name="*">
      <level value="ALL" />
      <appender-ref ref="UdpAppender" />
    </logger>
  </log4net>
</configuration>
複製代碼
複製代碼

配置了"%-5level$$%logger$$%message$$%username$$%date{yyyyMMdd HH:mm:ss fff}$$",以$$分隔。

監控日誌中心:

複製代碼
複製代碼
using System;
using System.Net;
using System.Net.Sockets;

namespace UdpAppender
{
    class Program
    {
        static void Main(string[] args)
        {
            IPAddress address = IPAddress.Parse("192.168.100.107");
            IPEndPoint remoteEndPoint = new IPEndPoint(address, 0);
            UdpClient udpClient;
            byte[] buffer;
            string loggingEvent;

            try
            {
                udpClient = new UdpClient(8080);

                while (true)
                {
                    buffer = udpClient.Receive(ref remoteEndPoint);
                    loggingEvent = System.Text.Encoding.Default.GetString(buffer);
                    Console.WriteLine(loggingEvent);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}
複製代碼
複製代碼

監控獲得的數據效果:

這樣,就成功的將應用程序的壓力,轉移到日誌監控中心了。固然,咱們還可使用現成的第三方日誌分析服務器,將日誌監控中內心的日誌,中轉處理後,交給第三方日誌分析服務器處理。

 

原文地址:http://logging.apache.org/log4net/release/config-examples.html

參考:

http://www.cnblogs.com/anderslly/archive/2007/03/09/log4netconfigsamples.html

http://www.cnblogs.com/liuning8023/p/4591910.html

 

 

出處:https://www.cnblogs.com/Leo_wl/p/4706337.html

相關文章
相關標籤/搜索