log4netについて

一 Log4net介 
Log4net是基於.net開發的一款非常著名的記錄日誌件。他最早是2001年7月由NeoWorks Limited啓目,基本的框架源於另外的一個非常著名的姐妹件-log4j。Log4net記錄日誌的功能非常大。
點:它可以提供用程序運行的精確境,可供開發儘快找到用程序中的Bug;一旦在程序中加入了Log 出代,程序運行程中就能生成並出日誌信息而無需人工幹。另外,日誌信息可以出到不同的地方(控制檯,文件等)以以後研究之用
Log4net可從http://logging.apache.org/log4net/downloads.html網站下最新版本。

 二 Log4net核心
Log4net主要由五個部分
成,分別爲Logger,Appenders, Filters, Layouts Object Renders 

一)Logger(日誌)
1記錄日誌的分
Log4net以多方式出日誌。支持的日誌出常用的主要媒介有數據(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制檯,文件,事件日誌(可以用事件看器)件等多方式。 

2.日誌的級別
Log4net
支持多種級別的日誌。從高到低依次排列如下:
FATAL > ERROR > WARN > INFO > DEBUG
此外有ALL(允所有的日誌求)和OFF(拒所有的日誌求)特殊的級別如果沒有定LEVEL缺省DEBUG 

二)Appenders
Appenders決定日誌
出的方式。
Appenders
須實現log4net.Appenders.IAppender接口。 

Log4net目前支持的出方式包括:
1 AdoNetAppender將日誌
記錄到數據中。可以採用SQL和存儲過程兩方式。
2 AnsiColorTerminalAppender
在ANSI 窗口端寫下高亮度的日誌事件。
3 AspNetTraceAppender能用asp.net中Trace的方式
記錄的日誌。
4 BufferingForwardingAppender
出到子Appenders之前先存日誌事件。
5 ConsoleAppender將日誌
出到控制檯。
6 EventLogAppender將日誌寫到Windows Event Log
7 FileAppender將日誌寫到文件中。

8 LocalSyslogAppender將日誌寫到local syslog service (
用於UNIX境下).
9 MemoryAppender將日誌存到內存
衝區。
10 NetSendAppender 將日誌
出到Windows Messenger service.些日誌信息將在
戶終端的對話框中
示。
11 RemoteSyslogAppender
UDP絡協議將日誌寫到Remote syslog service。
12 RemotingAppender
.NET Remoting將日誌寫到程接收端。
13 RollingFileAppender將日誌以回
文件的形式寫到文件中。
14 SmtpAppender將日誌寫到
件中。
15 TraceAppender將日誌寫到.NET trace 系

16 UdpAppender將日誌connectionless UDP datagrams的形式送到
程宿主或以UdpClient的形式廣播。 

三) Filters
Appender
象將日誌以缺省的方式出流,然後Filter可以按照不同的準控制日誌的出。Filter可以再配置文件中配置。最簡單的形式是在appender中寫明一個Threshold.這樣只有級別大於或等於此Threshold的日誌才被記錄 

Filters須實現log4net.Filters.IFilter接口。 

四)Layouts
Layouts控制日誌
示的格式式。日誌的示格式如下: 

"%timestamp [%thread] %-5level %logger - %message%newline"
Timestamp:
表示程序已經開行的時間
位[毫秒]。
Thread:
行當前代程。
Level:日誌的
級別
Logger:日誌相
關請求的名稱。
Message: 日誌消息。
layout點的配置
%m(message):
出的日誌消息,如ILog.Debug(…)出的一條消息
%n(new line):

%d(datetime):
出當前句運行的
%r(run time):
出程序從運行到行到當前消耗的毫秒數
%t(thread id):
當前句所在的ID
%p(priority):
日誌的當前級別,即DEBUGINFOWARN…

%c(class):當前日誌象的名稱,例如:
模式字符串%-10c -%m%n
碼爲
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
則輸下面的形式: Exam.Log      
- Hello

%L句所在的行號
%F句所在的文件名
%-數字:表示該項的最小度,如果不用空格填充
例如,轉換模式%r [%t]%-5p %c - %m%n PatternLayout 將生成似於以下內容的出:
176 [main] INFO
org.foo.Bar - Located nearest gas station.

Layouts
可以控制日誌的式,比如以普通形式或以xml等形式出。 

五)Object Renderers
是很重要的一log4net將按照用出日誌消息。
Object Renders
須實現log4net.ObjectRenderer.IObjectRenerer接口。 

目中使用log4net

1:站點下的配置(參考附件內容)

********************************* 

Log4Net
1:引入log4net.dll
2
:建立一個配置文件
方法,是在Web.ConfigApp.Config
加入以下配置
 <configSections>

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

</configSections>
加入log4net配置內容的定,下面是一個範例:
<log4net>

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender" >

<param name="File" value="c:/test/log4/log4netTestError.log" />

<param name="AppendToFile" value="true" />

<param name="DatePattern" value="yyyyMMdd" />

<param name="RollingStyle" value="Date" />

<layout type="log4net.Layout.PatternLayout">

<param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5p  %m%n" />

</layout>

<filter type="log4net.Filter.LevelRangeFilter">

        <levelMin value="ERROR" />

        <levelMax value="FATAL" />

</filter>

</appender>

<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" >

        <param name="File" value="c:/test/log4/log4netTestDebug.log" />

        <param name="AppendToFile" value="true" />

        <param name="MaximumFileSize" value="2KB" />

        <param name="RollingStyle" value="Size" />

        <param name="StaticLogFileName" value="false" />

        <layout type="log4net.Layout.PatternLayout">

                <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %type %method %-5p  %m%n" />

        </layout>

        <filter type="log4net.Filter.LevelRangeFilter">

                <levelMin value="DEBUG" />

                <levelMax value="WARN" />

        </filter>

</appender>

<root>

        <level value="ALL" />

        <appender-ref ref="FileAppender" />

        <appender-ref ref="DebugFileAppender" />

        </root>

</log4net>

3新建Global.asax文件

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e)

    {

        // アプリケーションのスタートアップで実行するコードです

        log4net.Config.XmlConfigurator.Configure();

    }

    void Application_End(object sender, EventArgs e)

    {

        //  アプリケーションのシャットダウンで実行するコードです

    }

    void Application_Error(object sender, EventArgs e)

    {

        // ハンドルされていないエラーが発生したときに実行するコードです

    }

    void Session_Start(object sender, EventArgs e)

    {

        // 新規セッションを開始したときに実行するコードです

    }

    void Session_End(object sender, EventArgs e)

    {

        // セッションが終了したときに実行するコードです

    }

</script>

4新建Log4netTest.aspx文件,添加按鈕事件:

  <asp:Button ID="btnLog" runat="server" Text="日誌" OnClick="btnLog_Click" />

5Log4netTest.aspx.cs文件中

  [assembly: log4net.Config.XmlConfigurator(ConfigFile = "web.config", Watch = true)] 

public partial class Log4netTest : System.Web.UI.Page

{

log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    protected void btnLog_Click(object sender, EventArgs e)

    {

        logger.Error("gggggggggggggggggggggggggggggggggggggggg");

        logger.Debug("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");

    }

}

運行程序點擊按鈕,在web.config定義的目錄c:/test/log4下就會生成文件log4netTestError.log log4netTestDebug.log,查看就會有相應的信息輸出。

*****************************************************************

2:バッチ中的配置(參考附件內容)

********************************************************

Log4Net添加自定日誌信息

1前言
針對Log4Net中添加自定日誌信息。在寫日誌的候並不是只寫消息(Message,有些情況需要記錄自定的日誌信息等。下面將明在Log4Net中增加自定字段UserName(用名),Category(類別)兩個字段。
2建立數據庫
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (11NOT NULL ,
    [Date] [datetime] NOT NULL ,
    [Thread] [varchar] (255NOT NULL ,
    [Level] [varchar] (50NOT NULL ,
    [Logger] [varchar] (255NOT NULL ,
    [Message] [varchar] (4000NOT NULL ,
    [Exception] [varchar] (2000NULL ,
    [User] [varchar] (50NULL ,
    [Category] [varchar] (50)  NULL 

其中Date,Thread,Level,Logger,Message,Exceptionlog4net內置的信息。UserCategory是自定的字段。
3編寫配置文件
<configuration>
    
<configSections>
        
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    
</configSections>
    
<log4net>
        
<logger name="AA">
            
<level value="All" />
            
<appender-ref ref="ADONetAppender" />
        
</logger>
    
<!--<root>
            <level value="All" />
      <appender-ref ref="ADONetAppender" /> 
        </root>-->

        
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
            
<!--BufferSize
爲緩衝區大小-->
     
<param name="BufferSize" value="1" />
      
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      
<connectionString value="database=aa;server=(local);User ID=sa;Password=;" />
      
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[User],[Category]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category)" />
      
<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>
      
<parameter>
        
<parameterName value="@User" />
        
<dbType value="String" />
        
<size value="50" />
        
<layout type="Log4NetToDatabase.CustomLayout">
          
<conversionPattern value="%UserName" />
        
</layout>
      
</parameter>
      
<parameter>
        
<parameterName value="@Category" />
        
<dbType value="String" />
        
<size value="50" />
        
<layout type="Log4NetToDatabase.CustomLayout">
          
<conversionPattern value="%Category" />
        
</layout>
      
</parameter>
    
</appender>
  
</log4net>
</configuration>
  配置文件配置文件在用程序目中的App.config配置文件中寫。配置文件中的Log4NetToDatabase.CustomLayout自定義類的名稱,具體實現請關寫代。配置文件中如果將<root>點的注開則生兩條同的信息,因<root>點中有一個appender-ref點,它也引用了ADONetAppender附着器。該問題只要將<Root>點注,或將<root>點中的<appender-ref>點注就解決了。
4編寫後臺代碼
(1)編寫自定義PatternLayoutConverter
internal sealed class UserNamePatternConverter : PatternLayoutConverter 
{
    
override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
     {
        LogMessage logMessage = loggingEvent.MessageObject 
as LogMessage;
        
if (logMessage != null)
            
// UserName日誌信息
            writer.Write(logMessage.UserName);
   }
}
internal sealed class CategoryPatternConverter : PatternLayoutConverter
 {
  override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
 {
        LogMessage logMessage = loggingEvent.MessageObject 
as LogMessage;
        
if (logMessage != null)
            writer.Write(logMessage.Category);
    }
}
(2)編寫自定義日誌輸出類
public class LogMessage
{
        
private string m_UserName;
        
private string m_Category;
        
public LogMessage(){}
        
public LogMessage(string userName, string category)
        
{
            m_UserName = userName;
            m_Category = category;
        }
        
public string UserName
        
{
            
getreturn m_UserName; }
            
Set{m_UserName = value; }
        }
        
public string Category
        
{
            
Get{return m_Category; }
            
Set{ m_Category = value; }
        }
    }

(3)CustomLayout類繼承自log4net.Layout.PatternLayout並在構造函數中調用AddConverter()方法。該方法將佔用較多的系統內存,但它代碼簡單易於理解。具體如下:
public class CustomLayout : log4net.Layout.PatternLayout
    
{
        
public CustomLayout ()
        
{
            
this.AddConverter("UserName", typeof(UserNamePatternConverter));
            
this.AddConverter("Category", typeof(CategoryPatternConverter));
        }
 }
(4)加在配置文件並記錄日誌
   AssemblyInfo.cs文件中添加[assembly: XmlConfigurator()]它的作用同於log4net.Config.XmlConfigurator.Configure();用來取配置文件信息。
form1中添加下列代
private static int count = 0;

 
log4net.ILog log;
        
public Form1()
        
{// 
如果配置文件中存在名稱AAlogger
            log = LogManager.Exists("AA");        
    }
        
private void button1_Click(object sender, EventArgs e)
        
{
            ++count;
            LogMessage message = 
new LogMessage();
            message.UserName = "xds"+count.ToString();
            message.Category = count.ToString();
           
// 出日誌信息
            log.Error(message);
        }

**************************************************************************

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章