Log4net_配置


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

 

日志(Loggers)等級

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

用相同的參數調用 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:

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
)
mssqlserver
<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>
appender配置:

MS Access:

<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>
建立數據表同“MS SQL Server” appender配置:

 Oracle9i:

create table log (
   Datetime timestamp(3),
   Thread varchar2(255),
   Log_Level varchar2(255),
   Logger varchar2(255),
   Message varchar2(4000)
   );
建立數據表:
<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>
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 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配置:

實際上,你會發現,建立數據表都是差不多的,appender配置幾乎也一致。如果我們每種數據庫的表字段都保持一致,實際上,只需要改:connectionType、connectionString、commandText

<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)" />

  

AspNetTraceAppender:

這段配置可將日志信息輸出到頁面的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 :

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:

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:

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:

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:

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

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

<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>

  

<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>
View Code平時使用的配置如下

日志器可以采用多個追加器,在配置文件中,可以直接這樣使用:

 <root>
      <level value="ALL" />
      <appender-ref ref="ColoredConsoleAppender" />
      <appender-ref ref="UdpAppender" />
    </root>

  


免責聲明!

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



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