欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用日志組件log4net

 更新時間:2022年06月06日 16:17:14   作者:springsnow  
這篇文章介紹了C#日志組件log4net的使用方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、概述

log4net庫是Apache log4j框架在Microsoft .NET平臺的實現(xiàn),是一個幫助程序員將日志信息輸出到各種目標(控制臺、文件、數(shù)據(jù)庫等)的工具。

1、下載與版本

Apache log4net ™,最新版本log4net 2.0.8

2、Log4net的結(jié)構(gòu)

log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(布局)。

3、日志的級別

如果沒有定義LEVEL的值,則缺省為DEBUG。

  • OFF 級別最高
  • FATAL
  • RROR
  • WARN
  • INFO
  • DEBUG 缺省
  • ALL 級別最低

比如:定義一個日志對象,設置級別為INFO,表示比INFO級別高(或相等)的日志將被記錄。即log.Info(“XX”)將記錄,log.Debug(“**”)不記錄

二、建立log4net配置文件

config/log4net.config文件:

<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingFileAppender" />
    <appender-ref ref="ColoredConsoleAppender" />
  </root>
  <logger name="MessageHandler">
    <level value="ERROR" />
    <appender-ref ref="SmtpAppender" />
  </logger>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log\pamsdc" />
    <threshold value="INFO" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="100"></maxSizeRollBackups>
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]" />
      <footer value="[Footer]" />
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
    </layout>
  </appender>
  <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
      <level value="WARN" />
      <foreColor value="White" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]" />
      <footer value="[Footer]" />
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
    </layout>
  </appender>
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
    <to value="" />
    <from value="GPEHZ-MIS@GoldPeak" />
    <subject value="PAMS DC 致命錯誤" />
    <smtpHost value="192.50.6.248" />
    <bufferSize value="32" />
    <lossy value="true" />
    <Authentication value="Basic"/>
    <Username value="GPEHZ-MIS@GoldPeak"/>
    <Password value=""/>
    <evaluator type="log4net.Core.LevelEvaluator,log4net">
      <threshold value="ERROR" />
    </evaluator>
    <layout type="log4net.Layout.PatternLayout,log4net">
      <conversionPattern value="日期:%date 線程:[%thread] 級別: %-5level 類:%logger [%ndc] < %property{auth}> - 消息:%message%newline" />
    </layout>
  </appender>
</log4net>

1、配置文件

配置信息一般放在單獨的配置文件中,也可以放在在程序的配置文件里,如app.config 或web.config. 或者任意文件中。 
log4net框架會在相對于AppDomain.CurrentDomain.BaseDirectory 屬性定義的目錄路徑下查找配置文件。

框架在配置文件里要查找的唯一標識是標簽。一個完整的配置文件的例子如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler,
            log4net-net-1.0" />
  </configSections>

  <log4net>
    ..
  </log4net>
</configuration>

2、Logger

Logger是應用程序需要交互的主要組件,它用來產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預先經(jīng)過Layout的格式化處理后才會輸出。 
Logger提供了多種方式來記錄一個日志消息,你可以在你的應用程序里創(chuàng)建多個Logger,每個實例化的Logger對象都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger對象,你不必將它在不同的類或?qū)ο箝g傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。

log4net框架使用繼承體系,在框架的體系里所有的日志對象都是根日志(root logger)的后代。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那么我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性 。這種缺省的繼承方式也可以通過顯式地設定標簽的additivity屬性為false而改變。 
Log4net框架定義了一個ILog接口,所有的logger類都必須實現(xiàn)這個接口。如果你想實現(xiàn)一個自定義的logger,你必須首先實現(xiàn)這個接口。

Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger對象。它有一個GetLogger()靜態(tài)方法,用我們提供的名字參數(shù)來檢索已經(jīng)存在的Logger對象。如果框架里不存在該Logger對象,它也會為我們創(chuàng)建一個Logger對象。代碼如下所示: 

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

通常來說,我們會以類(class)的類型(type)為參數(shù)來調(diào)用GetLogger(),以便跟蹤我們正在進行日志記錄的類。

3、Appender

一個好的日志框架應該能夠產(chǎn)生多目的地的輸出。比如說輸出到控制臺或保存到一個日志文件。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的組件來定義輸出介質(zhì)。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個Appender組件附加到一個日志對象上。 Log4net框架提供了幾個Appender組件。

關(guān)于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊中找到。有了這些現(xiàn)成的Appender組件,一般來說你沒有必要再自己編寫了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton類繼承。

log4net的各種Appender配置示例

http://logging.apache.org/log4net/release/config-examples.html

輸出方式主要包括:

  • AdoNetAppender:將日志記錄到數(shù)據(jù)庫中??梢圆捎肧QL和存儲過程兩種方式
  • AspNetTraceAppender:能用ASP.NET中跟蹤的方式查看記錄的日志。
  • BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
  • ColoredConsoleAppender:在終端的窗口寫下高亮度的日志事件。
  • ConsoleAppender:將日志輸出到控制臺。
  • EventLogAppender:將日志寫到Windows操作系統(tǒng)的日志中去。
  • FileAppender:將日志寫到文件中。
  • ForwardingAppender:用來為一個Appender指定一組約束。
  • MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
  • NetSendAppender:將日志輸出到Windows Messenger service,這些日志信息將在用戶終端的對話框中顯示。
  • OutputDebugStringAppender:配置該Appender以向OutputDebugString API寫入日志。
  • RemotingAppender:通過.NET Remoting將日志寫到遠程接收端。
  • RollingFileAppender:將日志以回滾文件的形式寫到文件中。
  • SmtpAppender:將日志寫到郵件中。
  • SmtpPickupDirAppender:配置與SmtpAppender類似,但要把SmtpHost換為PickupDir。
  • TraceAppender:將日志寫到.NET trace 系統(tǒng)。
  • UdpAppender:將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。

4、PatternLayout中的轉(zhuǎn)換模式

  • %F/%file:輸出語句所在的文件名
  • %U/%identity:用戶名
  • %l/%location:調(diào)用者位置
  • %L/%line:輸出語句所在的行號
  • %M/%method:方法
  • %C(class),%class,%type::類名
  • %w/%username:Windows Identity
  • %a/%appdomain:域
  • %t/%thread:當前語句所在的線程ID
  • %c(category), %logger::當前日志對象的名稱
  • %p(priority),%level:日志的當前優(yōu)先級別,即DEBUG、INFO、WARN…等
  • %m/%message:輸出的日志消息,如ILog.Debug(…)輸出的一條消息
  • %exception:異常
  • %d,%date:輸出當前語句運行的時刻,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出2015-03-10 14:53:28;也可以%d{ISO8601}輸出2015-03-10 14:51:12,220, %d{DATE}輸出‘10 Mar 2015 14:51:51,318’, %d{ABSOLUTE}輸出14:54:07,943,%d{HH:mm:ss,fff}, %d{dd MM yyyy HH:mm:ss,fff},yyyy年份,MM月份,dd日期,HH小時小時24制,hh小時12小時制,mm分鐘,ss秒,fff毫秒(f為秒的精確位數(shù),幾個f代表精確到小數(shù)點后幾位)
  • %r/%timestamp:輸出程序從運行到執(zhí)行到當前語句時消耗的毫秒數(shù)
  • %X/%mdc:輸出(mapped diagnostic context)mdc上下文內(nèi)容
  • %x/%ndc: 輸出(nested diagnostic context)ndc上下文內(nèi)容
  • %p/%Proerties{user}:呈現(xiàn)指定屬性
  • %n(newline):換行
  • %-數(shù)字:表示該項的最小長度,如果不夠,則用空格填充 。%-10,表示最小長度為10,如果不夠,則用空格右側(cè)填充;%.10,表示最大長度為10;可以與%m等其他格式組合使用,示例%10m,%-10m,%10.10m,%-10.10m
  • %%:輸出%

例如,轉(zhuǎn)換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類似于以下內(nèi)容的輸出: 
176 [main] INFO org.foo.Bar - Located nearest gas station.

三、定義配置文件

當我們創(chuàng)建了上面的配置文件后,我們接下來需要把它和我們的應用聯(lián)系起來。缺省的,每個獨立的可執(zhí)行程序集都會定義它自己的配置。

log4net框架使用 log4net.Config.XmlConfiguratorAttribute在程序集的級別上定義配置文件。

  • ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴展名。
  • ConfigFileExtension:如果我們對被編譯程序的程序集使用了不同的文件擴展名,那么我們需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。
  • Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在運行時監(jiān)視文件的改變。如果這個屬性為true,那么FileSystemWatcher將會被用來監(jiān)視文件的改變,重命名,刪除等事件。

1、在Winfrom中,在AssemblyInfo.cs中添加如下代碼:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]//關(guān)聯(lián)log4net.config文件
//或者
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//關(guān)鍵到xxx.exe.log4net或xxx.dll.log4net,并監(jiān)測變化。

2、在asp.net中,在Global.asax文件中的Application_Start方法中增加:

log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
//或者
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath(@”Config.log4net.config”)))

四、調(diào)用log4net寫日志

1、創(chuàng)建或獲取日志對象

日志對象會使用在配置文件里定義的Logger的Name屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據(jù)繼承結(jié)構(gòu)獲取祖先節(jié)點的屬性,最終的,會從根root日志獲取屬性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger"); 
//或
Log4net.ILog log = Log4net.LogManager.GetLogger(typeof(_Default));
//或
Log4net.ILog log = Log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

2、輸出日志信息

if (log.IsDebugEnabled)
    log.Debug("message"); 
if (log.IsInfoEnabled) 
   log.Info("message); 

log.Logger.Repostory.Shutdown()//關(guān)閉日志

五、更改Appender設置

1、獲取root的Appender

log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();
log4net.Appender.AppenderCollection ac = h.Root.Appenders;

2、獲取指定Logger的Appender:不包括繼承的Appender

log4net.ILog logger = log4net.LogManager.GetLogger(typeof(_Defaut));
log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logger.Logger).Appenders;

3、更改Appender設置

for (int i = 0; i < ac.Count; i++)
{
    log4net.Appender.RollingFileAppender rfa = ac[i] as log4net.Appender.RollingFileAppender;
    if (rfa != null)
    {
        rfa.File = "xxx.log";//程序運行時動態(tài)的設定log日志的文件名
        rfa.Writer = new System.IO.StreamWriter(rfa.File, rfa.AppendToFile, rfa.Encoding);
    }
 }

六、自定義appender

日志保存于內(nèi)存中,到一定閾值之后才將數(shù)據(jù)post到服務器,同時可配置服務端接受數(shù)據(jù)的地址

1、定義myMemAppender類

public class MyMemAppender : AppenderSkeleton
{
    private ArrayList eventQueue;

    public string RemoteAddress { get; set; }
    public int QueueSize { get; set; }

    public MyMemAppender() : base()
    {
        eventQueue = new ArrayList();
    }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        lock (eventQueue.SyncRoot)
        {
            eventQueue.Add(loggingEvent);
            if (eventQueue.Count >= QueueSize)
            {
                lock (eventQueue.SyncRoot)
                {
                    SaveToServer();
                    eventQueue.Clear();
                }
            }
        }
    }

    private void SaveToServer()
    {
        lock (eventQueue.SyncRoot)
        {
            List logList = new List();
            foreach (log4net.Core.LoggingEvent evt in eventQueue)
            {
                try
                {
                    LogModel m = Newtonsoft.Json.JsonConvert.DeserializeObject(evt.RenderedMessage);//或者evt.MessageObject as LogModel
                    logList.Add(m);
                }
                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                    continue;
                }
            }
            //將logList序列化上傳至remoteAddress
        }
    }

    virtual public LoggingEvent[] GetEvents()
    {
        lock (eventQueue.SyncRoot)
        {
            return (LoggingEvent[])eventQueue.ToArray(typeof(LoggingEvent));
        }
    }
}

2、注冊Appender

(1)root根目錄下追加

配置文件方式:

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<appender name="myMemAppender" type="LogSystem.Common.MyMemAppender">
    <param name="QueueSize" value="10"/>
    <param name="RemoteAddress" value="http://localhost/PostLogData.aspx"/>
</appender>
<root>
   <level value="ALL"/>
   <appender-ref ref="myMemAppender" />
</root>
</log4net>

代碼方式:

MyMemAppender appender = new MyMemAppender();
appender.QueueSize = 5;
appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx";
log4net.Config.BasicConfigurator.Configure(appender);
ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

(2)指定Logger名下追加Appender:

MyMemAppender appender = new MyMemAppender();
appender.Name = "MyMemAppender";
appender.QueueSize = 5;
appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx";

Logger logger1 = (Logger)LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger1.Level = Level.Info;
IAppender appendered = logger1.GetAppender("MyMemAppender");
if (appendered != null) logger1.RemoveAppender("MyMemAppender");
logger1.AddAppender(appendered);
appender.ActivateOptions();

到此這篇關(guān)于C#使用日志組件log4net的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Unity?UGUI?按鈕綁定事件的?4?種方式匯總

    Unity?UGUI?按鈕綁定事件的?4?種方式匯總

    UGUI?可視化創(chuàng)建以及關(guān)聯(lián)事件很方便,?動態(tài)創(chuàng)建可以利用創(chuàng)建好的?Prefab?進行實例化,?只是在關(guān)聯(lián)事件上有些復雜,這篇文章主要介紹了Unity?UGUI?按鈕綁定事件的?4?種方式,需要的朋友可以參考下
    2022-01-01
  • C#操作session的類實例

    C#操作session的類實例

    這篇文章主要介紹了C#操作session的類,實例分析了C#針對session的添加、讀取及刪除等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用

    Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用

    這篇文章主要為大家介紹了Unity?UGUI的VerticalLayoutGroup垂直布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))

    使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))

    本文主要介紹了Java中使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改的方法與步驟。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • c# 接口interface基礎(chǔ)入門小例子

    c# 接口interface基礎(chǔ)入門小例子

    用于描述類的功能,類似于契約,指示了類將:執(zhí)行的工作,形參類型,返回結(jié)果類型,但本身沒有執(zhí)行的代碼
    2013-04-04
  • C#多線程中的互斥鎖Mutex

    C#多線程中的互斥鎖Mutex

    這篇文章介紹了C#多線程中的互斥鎖Mutex,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)

    解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)

    這篇文章主要介紹了C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),是C#入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • Unity Shader實現(xiàn)水墨效果

    Unity Shader實現(xiàn)水墨效果

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)水墨效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Unity3D開發(fā)教程:憤怒的小鳥

    Unity3D開發(fā)教程:憤怒的小鳥

    這篇文章詳細的講解了如何從0開發(fā)出一個Unity3D的小游戲憤怒的小鳥,本文包含大量的圖片與文字描述,也含有大量的源代碼,可以讓你快速入手,希望本篇文章對你有所幫助
    2021-06-06
  • 利用C#守護Python進程的方法

    利用C#守護Python進程的方法

    這篇文章主要給大家介紹了關(guān)于如何利用C#守護Python進程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-10-10

最新評論