最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年05月21日 23:40:37   投稿:mdxy-dxy  
這篇文章主要介紹了Log4Net 日志配置[附帶源碼下載],需要的朋友可以參考下

前述

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

準(zhǔn)備工作:

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

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

2.在項(xiàng)目中引用log4net.dll。

實(shí)例代碼

準(zhǔn)備工作完成后我們來看下實(shí)例代碼 ,首先在項(xiàng)目中創(chuàng)建一個文件夾LogConfig。把有關(guān)log4net的一些配置文件和類都放在這個文件夾里面。

WEB網(wǎng)站為例,在項(xiàng)目LogConfig文件夾中創(chuàng)建Log4Net.config配置文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <configSections>
  <!--添加自定義節(jié)點(diǎn):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/"/>
   <!--是否追加到文件,默認(rèn)為true,通常無需設(shè)置-->
   <appendToFile value="true"/>
   <RollingStyle value="Date"/>
   <!--日期的格式,每天換一個文件記錄,如不設(shè)置則永遠(yuǎn)只記錄一天的日志,需設(shè)置-->
   <DatePattern value="INFO_yyyyMMdd&quot;.log&quot;" />
   <!--日志文件名是否為靜態(tài)-->
   <StaticLogFileName value="false"/>
   <!--多線程時采用最小鎖定-->
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
   <!--布局(向用戶顯示最后經(jīng)過格式化的輸出信息)-->
   <layout type="log4net.Layout.PatternLayout">
    <!--
      %m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息 
      %n(new line):換行 
      %d(datetime):輸出當(dāng)前語句運(yùn)行的時刻 
      %r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語句時消耗的毫秒數(shù) 
      %t(thread id):當(dāng)前語句所在的線程ID 
      %p(priority): 日志的當(dāng)前優(yōu)先級別,即DEBUG、INFO、WARN…等 
      %c(class):當(dāng)前日志對象的名稱,例如:
      %L:輸出語句所在的行號 
      %F:輸出語句所在的文件名 
      %-數(shù)字:表示該項(xiàng)的最小長度,如果不夠,則用空格填充
     -->
    <Header value="[Header]&#13;&#10;"/>
    <Footer value="[Footer]&#13;&#10;"/>
    <!--正文-->
    <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&quot;.log&quot;" />
   <StaticLogFileName value="false"/>
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
   <layout type="log4net.Layout.PatternLayout">
    <Header value="[Header]&#13;&#10;"/>
    <Footer value="[Footer]&#13;&#10;"/>
    <!--正文-->
    <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類。同樣在項(xiàng)目中創(chuàng)建一個名為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>
    /// 調(diào)試信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Debug(object source, string message)
    {
      Debug(source.GetType(), message);
    }

    /// <summary>
    /// 調(diào)試信息
    /// </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>
    /// 調(diào)試信息
    /// </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>
    /// 關(guān)鍵信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Info(object source, object message)
    {
      Info(source.GetType(), message);
    }

    /// <summary>
    /// 關(guān)鍵信息
    /// </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>
    /// 調(diào)試信息
    /// </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>
    /// 調(diào)試信息
    /// </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>
    /// 關(guān)鍵信息
    /// </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>
    /// 關(guān)鍵信息
    /// </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類都有了..現(xiàn)在來看看調(diào)用方法。在項(xiàng)目中創(chuàng)建一個index.aspx頁面

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

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


參數(shù)說明

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

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

2.1:定義輸出信息設(shè)置節(jié)點(diǎn)<appender></appender>。
2.2:定義日志的輸出媒介<root></root>。

配置的總體結(jié)構(gòu)就是這樣,下面來看一些詳細(xì)內(nèi)容。

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

主要包括已下幾種:

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環(huán)境下).
8 MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
9 NetSendAppender:將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
10 RemoteSyslogAppender:通過UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。
11 RemotingAppender:通過.NET Remoting將日志寫到遠(yuǎn)程接收端。
12 RollingFileAppender:將日志以回滾文件的形式寫到文件中。(實(shí)例代碼中使用的是此類型)
13 SmtpAppender:將日志寫到郵件中。
14 TraceAppender:將日志寫到.NET trace 系統(tǒng)。
15 UdpAppender:將日志connectionless UDP datagrams的形式送到遠(yuǎn)程宿主或以UdpClient的形式廣播。

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

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

root:

對設(shè)置輸出的方式進(jìn)行指定。

<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

附帶源碼:代碼

相關(guān)文章

  • WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例

    WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的可以參考一下
    2024-02-02
  • C#文件上傳與下載的實(shí)現(xiàn)方法

    C#文件上傳與下載的實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了C#文件上傳與下載的實(shí)現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解決C#中Linq GroupBy 和OrderBy失效的方法

    解決C#中Linq GroupBy 和OrderBy失效的方法

    最近發(fā)現(xiàn)了一個問題,在服務(wù)器端的Linq GroupBy 和OrderBy居然不管用,后來終于解決了所以現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。
    2016-09-09
  • C#簡單的特殊輸出實(shí)例

    C#簡單的特殊輸出實(shí)例

    這篇文章主要介紹了C#簡單的特殊輸出,以實(shí)例實(shí)現(xiàn)了針對一些特殊字符與位置的輸出控制,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • c# AcceptEx與完成端口(IOCP)結(jié)合的示例

    c# AcceptEx與完成端口(IOCP)結(jié)合的示例

    這篇文章主要介紹了c# AcceptEx與完成端口(IOCP)結(jié)合的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 深入多線程之:內(nèi)存柵欄與volatile關(guān)鍵字的使用分析

    深入多線程之:內(nèi)存柵欄與volatile關(guān)鍵字的使用分析

    本篇文章對內(nèi)存柵欄與volatile關(guān)鍵字的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于C#編寫一個操作XML的簡單類庫XMLHelper

    基于C#編寫一個操作XML的簡單類庫XMLHelper

    這篇文章主要為大家詳細(xì)介紹了如何基于C#編寫一個操作XML的簡單類庫——XMLHelper,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-06-06
  • C#?字典Dictionary的具體用法

    C#?字典Dictionary的具體用法

    本文主要介紹了C#?字典Dictionary的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中

    C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中

    這篇文章介紹了C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中ListView用法實(shí)例

    C#中ListView用法實(shí)例

    我們經(jīng)常會在應(yīng)用程序中使用列表的形式來展現(xiàn)一些內(nèi)容,所以學(xué)好ListView是非常必需的,下面這篇文章主要給大家介紹了關(guān)于C#中ListView用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評論

如东县| 介休市| 金阳县| 南汇区| 区。| 金寨县| 宁南县| 米易县| 克山县| 恩施市| 南部县| 三都| 磴口县| 大渡口区| 探索| 盖州市| 铁力市| 乐安县| 烟台市| 修水县| 许昌县| 缙云县| 浦东新区| 静宁县| 平凉市| 新宁县| 塔城市| 邓州市| 金湖县| 辽宁省| 务川| 宁海县| 新龙县| 奇台县| 江油市| 龙州县| 融水| 时尚| 衡东县| 兴业县| 苏州市|