亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

Log4Net 日志配置[附帶源碼下載]

2020-01-24 01:49:40
字體:
來源:轉載
供稿:網友

前述

  園子里有許多人對log4net這款開源的日志記錄控件有很多介紹。在這里個人再做一次總結,希望對以后有所幫助,需要的時候可以直接使用,減少查閱資料的時間。利用log4net可以方便地將日志信息記錄到文件、控制臺、Windows事件日志和數據庫,并且我們還可以記載控制要記載的日志級別,可以記載的日志類別包括:FATAL(致命錯誤)、ERROR(一般錯誤)、WARN(警告)、INFO(一般信息)、DEBUG(調試信息)。log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(布局).

準備工作:

1.下載log4net.dll 下載地址[http://logging.apache.org/log4net/download_log4net.cgi]

下載文件:log4net-1.2.13-bin-newkey.zip。 解壓選擇對應的net版本找到log4net.dll。

2.在項目中引用log4net.dll。

實例代碼

準備工作完成后我們來看下實例代碼 ,首先在項目中創建一個文件夾LogConfig。把有關log4net的一些配置文件和類都放在這個文件夾里面。

WEB網站為例,在項目LogConfig文件夾中創建Log4Net.config配置文件。

<?xml version="1.0" encoding="utf-8"?><configuration> <configSections>  <!--添加自定義節點:log4net type:解析類名,程序集名(log4net.dll)-->  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net>  <!--定義輸出到文件中-->  <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">   <!--定義文件存放位置-->   <file value="C:/log4net/"/>   <!--是否追加到文件,默認為true,通常無需設置-->   <appendToFile value="true"/>   <RollingStyle value="Date"/>   <!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->   <DatePattern value="INFO_yyyyMMdd".log"" />   <!--日志文件名是否為靜態-->   <StaticLogFileName value="false"/>   <!--多線程時采用最小鎖定-->   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />   <!--布局(向用戶顯示最后經過格式化的輸出信息)-->   <layout type="log4net.Layout.PatternLayout">    <!--      %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息       %n(new line):換行       %d(datetime):輸出當前語句運行的時刻       %r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數       %t(thread id):當前語句所在的線程ID       %p(priority): 日志的當前優先級別,即DEBUG、INFO、WARN…等       %c(class):當前日志對象的名稱,例如:      %L:輸出語句所在的行號       %F:輸出語句所在的文件名       %-數字:表示該項的最小長度,如果不夠,則用空格填充     -->    <Header value="[Header]
"/>    <Footer value="[Footer]
"/>    <!--正文-->    <ConversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" />   </layout>  </appender>  <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">   <file value="C:/log4net/"/>   <appendToFile value="true"/>   <RollingStyle value="Date"/>   <DatePattern value="ERROR_yyyyMMdd".log"" />   <StaticLogFileName value="false"/>   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />   <layout type="log4net.Layout.PatternLayout">    <Header value="[Header]
"/>    <Footer value="[Footer]
"/>    <!--正文-->    <ConversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" />   </layout>  </appender>  <root>   <level value="DEBUG"/>   <appender-ref ref="Log4Net_ERROR" />   <level value="INFO"/>   <appender-ref ref="Log4Net_INFO" />  </root> </log4net></configuration>

配置文件寫完后我們在來寫一個Helper類。同樣在項目中創建一個名為LogHelper.cs的類文件。

using log4net;using System;using System.Collections.Concurrent;using System.Collections.Generic;//指定log4net使用的config文件來讀取配置信息[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig/Log4Net.config", Watch = true)]namespace Project.Log4.Net.LogConfig{  /// <summary>  /// 日志幫助類  /// </summary>  public class LogHelper  {    private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();    /// <summary>    /// 獲取記錄器    /// </summary>    /// <param name="source"></param>    /// <returns></returns>    private static ILog GetLogger(Type source)    {      if (_loggers.ContainsKey(source))      {        return _loggers[source];      }      else      {        ILog logger = LogManager.GetLogger(source);        _loggers.TryAdd(source, logger);        return logger;      }    }    /* Log a message object */    /// <summary>    /// 調試信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Debug(object source, string message)    {      Debug(source.GetType(), message);    }    /// <summary>    /// 調試信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="ps"></param>    public static void Debug(object source, string message, params object[] ps)    {      Debug(source.GetType(), string.Format(message, ps));    }    /// <summary>    /// 調試信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Debug(Type source, string message)    {      ILog logger = GetLogger(source);      if (logger.IsDebugEnabled)        logger.Debug(message);    }    /// <summary>    /// 關鍵信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Info(object source, object message)    {      Info(source.GetType(), message);    }    /// <summary>    /// 關鍵信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Info(Type source, object message)    {      ILog logger = GetLogger(source);      if (logger.IsInfoEnabled)        logger.Info(message);    }    /// <summary>    /// 警告信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Warn(object source, object message)    {      Warn(source.GetType(), message);    }    /// <summary>    /// 警告信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Warn(Type source, object message)    {      ILog logger = GetLogger(source);      if (logger.IsWarnEnabled)        logger.Warn(message);    }    /// <summary>    /// 錯誤信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Error(object source, object message)    {      Error(source.GetType(), message);    }    /// <summary>    /// 錯誤信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Error(Type source, object message)    {      ILog logger = GetLogger(source);      if (logger.IsErrorEnabled)        logger.Error(message);    }    /// <summary>    /// 失敗信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Fatal(object source, object message)    {      Fatal(source.GetType(), message);    }    /// <summary>    /// 失敗信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    public static void Fatal(Type source, object message)    {      ILog logger = GetLogger(source);      if (logger.IsFatalEnabled)        logger.Fatal(message);    }    /* Log a message object and exception */    /// <summary>    /// 調試信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Debug(object source, object message, Exception exception)    {      Debug(source.GetType(), message, exception);    }    /// <summary>    /// 調試信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Debug(Type source, object message, Exception exception)    {      GetLogger(source).Debug(message, exception);    }    /// <summary>    /// 關鍵信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Info(object source, object message, Exception exception)    {      Info(source.GetType(), message, exception);    }    /// <summary>    /// 關鍵信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Info(Type source, object message, Exception exception)    {      GetLogger(source).Info(message, exception);    }    /// <summary>    /// 警告信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Warn(object source, object message, Exception exception)    {      Warn(source.GetType(), message, exception);    }    /// <summary>    /// 警告信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Warn(Type source, object message, Exception exception)    {      GetLogger(source).Warn(message, exception);    }    /// <summary>    /// 錯誤信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Error(object source, object message, Exception exception)    {      Error(source.GetType(), message, exception);    }    /// <summary>    /// 錯誤信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Error(Type source, object message, Exception exception)    {      GetLogger(source).Error(message, exception);    }    /// <summary>    /// 失敗信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Fatal(object source, object message, Exception exception)    {      Fatal(source.GetType(), message, exception);    }    /// <summary>    /// 失敗信息    /// </summary>    /// <param name="source"></param>    /// <param name="message"></param>    /// <param name="exception"></param>    public static void Fatal(Type source, object message, Exception exception)    {      GetLogger(source).Fatal(message, exception);    }  }}

配置和Helper類都有了..現在來看看調用方法。在項目中創建一個index.aspx頁面

LogHelper.Debug(this, "Debug");LogHelper.Error(this, "Error");LogHelper.Fatal(this, "Fatal");LogHelper.Info(this, "Info");LogHelper.Warn(this, "Warn");

日志生成格式[每天一個文件]:


參數說明

Log4Net.config是配置日志輸出參數文件。在這個文件中可以到看很多配置節點,大體可以分為二個大類<configSections>...</configSections> 和 <log4net>...</log4net>。我們來看看這些節點都是啥意思。

1:<configSections>..</configSections>:申明自定義節點log4net解析的類名和程序集名(log4net.dll)。
2:<log4net>..</log4net>:使用log4net的配置信息都在這里設置。來重點看看都有那些設置信息,這個大節點整體也可以分為二類。

2.1:定義輸出信息設置節點<appender></appender>。
2.2:定義日志的輸出媒介<root></root>。

配置的總體結構就是這樣,下面來看一些詳細內容。

appender:決定日志輸出的方式(可設置多個節點,如對INFO,ERROR等設置不同的輸出方式)。

主要包括已下幾種:

1 AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日志事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
3 BufferingForwardingAppender:在輸出到子Appenders之前先緩存日志事件。
4 ConsoleAppender:將日志輸出到控制臺。
5 EventLogAppender:將日志寫到Windows Event Log.
6 FileAppender:將日志寫到文件中。
7 LocalSyslogAppender:將日志寫到local syslog service (僅用于UNIX環境下).
8 MemoryAppender:將日志存到內存緩沖區。
9 NetSendAppender:將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
10 RemoteSyslogAppender:通過UDP網絡協議將日志寫到Remote syslog service。
11 RemotingAppender:通過.NET Remoting將日志寫到遠程接收端。
12 RollingFileAppender:將日志以回滾文件的形式寫到文件中。(實例代碼中使用的是此類型)
13 SmtpAppender:將日志寫到郵件中。
14 TraceAppender:將日志寫到.NET trace 系統。
15 UdpAppender:將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。

從上面提供的方式中可以看出能輸出文件、控制臺、Windows事件日志和數據庫。這個可根據實際情況選擇。

復制代碼 代碼如下:

<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>

這里配置的name(“Log4Net_INFO”)會在定義日志的輸出媒介中使用到。name可任意設置。

在appender 節點中還會配置一些文件存放的地址,日志個數等信息。這些在實例代碼中都在體現,這里不做說明。我們在來看看日志最后輸出呈現的布局設置信息。

<layout type="log4net.Layout.PatternLayout">    <!--頭-->    <Header value="[Header]"/>    <!--腳注-->    <Footer value="[Footer]"/>    <!--正文-->    <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" /></layout>

這里配置的信息最終是日志打印出來的樣式。我們可以看到這里可以設置內容頭Header和尾Footer。正文ConversionPattern。在正文中有出現有 %d [%t]這些都是啥意思了表示什么。這里有一個對照表可提供參考:

%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息
%n(new line):換行
%d(datetime):輸出當前語句運行的時刻
%r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數
%t(thread id):當前語句所在的線程ID
%p(priority): 日志的當前優先級別,即DEBUG、INFO、WARN…等
%c(class):當前日志對象的名稱,例如:
%L:輸出語句所在的行號
%F:輸出語句所在的文件名
%-數字:表示該項的最小長度,如果不夠,則用空格填充

配置的基本也就這些。下就是root的配置說明 。

root:

對設置輸出的方式進行指定。

<root>   <!--批定DEBUG輸出的文件形式記錄日志-->   <level value="DEBUG"/>   <appender-ref ref="Log4Net_ERROR" />   <!--批定INFO輸出的文件形式記錄日志-->   <level value="INFO"/>   <appender-ref ref="Log4Net_INFO" /></root>

控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄
如果沒有定義LEVEL的值,則缺省為DEBUG

附帶源碼:代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产三级国产aⅴ浪潮| 欧美日韩在线视频一区二区| 亚洲丝袜一区在线| 亚洲欧美国产精品久久久久久久| 日韩高清有码在线| 国产在线视频91| 国产欧美日韩综合精品| 九九热这里只有在线精品视| 尤物yw午夜国产精品视频| 欧美综合国产精品久久丁香| 国产精品欧美激情在线播放| 亚洲第一区第二区| 欧美亚洲另类制服自拍| 亚洲色图日韩av| 欧美亚洲国产成人精品| 日韩av在线免播放器| www.久久色.com| 成人a视频在线观看| 国内揄拍国内精品少妇国语| 国产精品日韩欧美综合| 日韩av高清不卡| 日韩风俗一区 二区| 欧美美女15p| 中日韩美女免费视频网站在线观看| 国产欧美日韩中文字幕在线| 精品久久久久久亚洲国产300| 国产精品欧美一区二区| 亚洲成在人线av| 8x海外华人永久免费日韩内陆视频| 日韩电影免费观看在线| 成人性生交xxxxx网站| 欧美在线免费看| 久久久天堂国产精品女人| 日韩欧美精品免费在线| 亚洲色图狂野欧美| 成人午夜两性视频| 久久久免费高清电视剧观看| 久久99精品视频一区97| 97视频在线观看免费| 日韩成人激情在线| 亚洲午夜精品久久久久久久久久久久| 92国产精品久久久久首页| 一本大道久久加勒比香蕉| 久久成人这里只有精品| 日韩中文字幕第一页| 亚洲va久久久噜噜噜久久天堂| 亚洲免费伊人电影在线观看av| 欧美色视频日本版| 中文字幕亚洲二区| 欧美日韩亚洲精品一区二区三区| 国产精品高清网站| 中文字幕亚洲专区| 97精品欧美一区二区三区| 亚洲欧洲在线视频| 国模精品视频一区二区三区| 日韩中文字幕网址| 91影视免费在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 热99精品只有里视频精品| 欧美日韩成人在线播放| 国产精品永久免费| 国产一区二区黑人欧美xxxx| 成人午夜高潮视频| 亚洲人成伊人成综合网久久久| 久久久精品久久久久| 欧美激情视频一区二区三区不卡| 45www国产精品网站| 欧美一级片久久久久久久| 国产精品一区二区女厕厕| 国产日韩在线播放| 久久久久中文字幕2018| 欧美视频第一页| 欧美国产在线视频| 国产精品视频午夜| 欧美国产亚洲视频| 亚洲精品一区二区网址| 久热精品视频在线观看| 伊人久久免费视频| 欧美巨乳在线观看| 日韩欧美国产骚| 欧美精品videossex性护士| 久久免费视频网| 欧美一级bbbbb性bbbb喷潮片| 欧美性猛交xxxx黑人猛交| 国产91精品青草社区| 26uuu另类亚洲欧美日本老年| 欧美男插女视频| 亚洲国产欧美一区二区三区同亚洲| 欧美激情aaaa| 中文字幕亚洲自拍| 欧美亚州一区二区三区| 国产精品黄页免费高清在线观看| 国产精品福利网站| 久久久久久噜噜噜久久久精品| 欧美激情综合色综合啪啪五月| 精品久久久久久久久久| 日韩欧美综合在线视频| 国产欧美日韩91| 精品视频中文字幕| 国产精品对白刺激| 久久久免费av| 九九久久久久久久久激情| 日本久久亚洲电影| 久青草国产97香蕉在线视频| 日韩有码在线播放| 亚洲国产精品国自产拍av秋霞| www.亚洲天堂| 久久久av电影| 国产一区二区三区18| 亚洲天堂一区二区三区| 国产精品久久久久久久久久久久久久| 中文国产成人精品| 亚洲欧美日韩在线一区| 欧美丰满少妇xxxxx| 亚洲国产精久久久久久| www.欧美视频| 国产精品99久久久久久人| 国产欧美亚洲视频| 国产区精品在线观看| 国内精品久久久久影院 日本资源| 92看片淫黄大片欧美看国产片| 国产精品中文在线| 欧美激情2020午夜免费观看| 亚洲精品综合精品自拍| 国产日韩中文字幕| 97在线精品国自产拍中文| 久久夜色精品国产亚洲aⅴ| 97精品在线观看| 欧美猛少妇色xxxxx| 欧美激情国产精品| 国产精品视频久久久| 91亚洲精品在线| 成人黄色在线免费| 国产精品电影久久久久电影网| 亚洲自拍小视频| 热久久美女精品天天吊色| 日韩亚洲欧美中文高清在线| 美女视频黄免费的亚洲男人天堂| 久久久久国产一区二区三区| 深夜福利亚洲导航| 国产在线播放91| 国产精品96久久久久久又黄又硬| 综合久久五月天| 国产亚洲欧洲在线| 久久精品亚洲94久久精品| 国产精品午夜一区二区欲梦| 精品久久久久国产| 日韩美女视频免费看| 亚洲欧美日韩天堂一区二区| 国产精品国产三级国产aⅴ浪潮| 国产精品久久久久久久9999| 夜夜嗨av色一区二区不卡| 久久久久中文字幕| 国产精品一区二区久久久久| 97成人精品视频在线观看| 亚洲肉体裸体xxxx137| 日韩综合视频在线观看| 日本欧美一二三区| 欧美亚洲一区在线| 国产脚交av在线一区二区| 日韩中文字幕视频在线观看| 精品国产91久久久久久老师| 福利二区91精品bt7086| 日韩欧美一区二区三区久久|