日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]NLog学习笔记二:深入学习

發布時間:2025/5/22 编程问答 111 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]NLog学习笔记二:深入学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自:http://www.cnblogs.com/CCHUncle/p/5207735.html

配置文件

NLog所有的配置信息都可以寫到一個單獨的xml文件中,也可以在程序代碼中進行配置。

配置文件位置

啟動的時候,NLog會試圖查找配置文件完成自動配置,查找的文件依次如下(找到配置信息則結束查詢):

  • 應用程序的標準配置文件(通常為applicationname.exe.config)
  • 應用程序所在目錄中的applicationname.exe.nlog文件
  • 應用程序所在目錄中的NLog.config文件
  • NLog.dll所在目錄中的NLog.dll.nlog文件
  • 環境變量NLOG_GLOBAL_CONFIG_FILE所指向的文件
  • 對于ASP.NET應用程序,NLog將自動按照順序搜索下列路徑:

  • Web應用程序的標準配置文件——web.config
  • web.config所在目錄中的web.nlog文件
  • 應用程序所在目錄中的NLog.config文件
  • NLog.dll所在目錄中的NLog.dll.nlog文件
  • 環境變量NLOG_GLOBAL_CONFIG_FILE所指向的文件
  • .NET Compact Framework并不支持應用程序配置文件(*.exe.config)以及環境變量,因此NLog將自動按照順序搜索下列路徑:

  • 應用程序所在目錄中的applicationname.exe.nlog文件
  • 應用程序所在目錄中的NLog.config文件
  • NLog.dll所在目錄中的NLog.dll.nlog文件
  • 配置文件形式

    NLog支持兩種形式的配置文件:

  • 嵌入到*.exe.config或web.config等標準配置文件中
  • 單獨的配置文件NLog.config
  • 對于第一種形式,我們使用了標準化的configSection機制。這樣配置文件將類似如下所示:

    <configuration> <configSections> <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> </configSections> <nlog> </nlog> </configuration>

    在配置文件的<nlog />根元素中,我們可以指定如下的子元素。其中前兩個是必須設定的,其余三個為可選設定。

  • <targets />?:定義日志的輸出目標
  • <rules />?:定義對日志信息進行路由的規則
  • <extensions />?:定義從其他dll文件中加載的NLog擴展模塊
  • <include />?: 引入外部的配置文件
  • <variable />?: 定義配置文件中用到的變量
  • 例如:

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <!--***configSections節點必須位于頂部--> <configSections> <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" requirePermission="false" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="file.txt" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="logfile" /> </rules> </nlog> </configuration> View Code

    代碼中配置

    NLog也可以通過編程配置,代碼如下:

    using NLog; using NLog.Config; using NLog.Targets; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NLogConsoleDemo { /// <summary> /// 測試在代碼中配置NLog /// </summary> class Program { static void Main(string[] args) { // Step 1. Create configuration object var config = new LoggingConfiguration(); // Step 2. Create targets and add them to the configuration var consoleTarget = new ColoredConsoleTarget(); config.AddTarget("console", consoleTarget); var fileTarget = new FileTarget(); config.AddTarget("file", fileTarget); // Step 3. Set target properties consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; fileTarget.FileName = "${basedir}/file.txt"; fileTarget.Layout = "${message}"; // Step 4. Define rules var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget); config.LoggingRules.Add(rule1); var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget); config.LoggingRules.Add(rule2); // Step 5. Activate the configuration LogManager.Configuration = config; // Example usage Logger logger = LogManager.GetLogger("Program"); logger.Trace("trace log message"); logger.Debug("debug log message"); logger.Info("info log message"); logger.Warn("warn log message"); logger.Error("error log message"); logger.Fatal("fatal log message"); Console.ReadLine(); } } } View Code

    目標(Targets)

    <targets />節點用來定義日志信息的輸出位置。每一個輸出位置都用一個<target />元素表示。<target />元素有兩個必須設置的屬性:

  • name?- 輸出目標的名稱
  • type?- 輸出目標的類型,例如“File”、“DataBase”、“Mail”等。若我們為配置文件指定了命名空間,則該屬性名為xsi:type
  • 除了上述兩個必須設置的屬性之外,<target />元素還支持一些其他的屬性,同樣可以影響記錄診斷信息的方式。我們可以為每一個輸出目標設定不同的屬性參數,這些屬性均在NLog的主頁上有詳細描述,且Visual Studio也都為其提供了智能感知功能支持。

    例如:“File”輸出目標接受一個名為fileName的參數,用來指定輸出文件的名稱;而“Console”輸出目標則接受一個名為error的參數,表示是否用標準錯誤輸出(stderr)代替標準輸出(stdout)。

    關于文件目標的詳細介紹請查看File target,關于目標類型的詳細介紹請查看Targets。

    規則(Rules)

    路由規則將定義在配置文件的<rules />節中。這部分內容就是一個簡單的路由表,用來定義不同的日志源(Logger的名稱)以及記錄等級的日志信息將被發送至哪個輸出目標中。路由規則將從列表中的第一項開始執行,如果符合當前的路由規則,則該條日志信息將被發送至指定的輸出目標中,若路由表中任意一項都不滿足,則該條日志信息將不會被處理。

    路由表中的每一個條目都由一個<logger />元素定義,<logger />元素支持如下幾個屬性:

  • name?- 日志源(Logger的名稱),可以使用*通配符
  • minlevel?-? 匹配該規則需要的最低記錄等級
  • maxlevel?- 匹配該規則需要的最高記錄等級
  • level?- 匹配該規則需要的單一的記錄等級
  • levels?- 匹配該規則需要的記錄等級列表,記錄等級之間用逗號隔開
  • writeTo?-?匹配該規則的日志信息將被發送至的輸出目標列表,輸出目標之間用逗號隔開
  • final?- 讓該規則成為日志信息的最后一個匹配條目。滿足該條規則的日志信息被處理之后,將不會再繼續嘗試匹配下面定義的路由規則。
  • 一些例子:

    來自于命名空間Name.Space下Class1的、記錄等級等于或高于Debug的日志信息將被發送至輸出目標f1。

    <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />

    ?來自于命名空間Name.Space下Class1的、記錄等級等于為Debug或Error的日志信息將被發送至輸出目標f1。

    <logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />

    ?來自于命名空間Name.Space下任意類的任意日志信息將被發送至輸出目標f3和f4。

    <logger name="Name.Space.*" writeTo="f3,f4" />

    ?來自于命名空間Name.Space下任意類的、記錄等級在Debug和Error之間(包括Debug、Info、Warn和Error)的日志信息將被忽略(沒有writeTo屬性),且也不會再被下面的路由規則處理(因為設置了final="true")。

    <logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />

    在前面的示例程序中,配置文件只包含了一個<target />元素和一個<logger />元素。隨著對程序的需求不斷擴充,添加新的輸出目標以及路由規則也將一樣非常簡單。

    可用的日志等級如下(降序排序):

    • Fatal:致命異常信息,非常嚴重的錯誤。
    • Erorr:錯誤信息,用于記錄異常。
    • Warn:警告信息,用于記錄不正確的,但程序還可以允許的行為。
    • Info:信息類型的消息,用于記錄一般的操作。
    • Debug:一般用來調試程序,用于記錄查詢、用戶認證、session過期等。
    • Trace:最常見的記錄信息,一般用于普通輸出,例如:開始于哪個方法,結束于哪個方法。

    布局和布局渲染器(Layouts and layout renderers)

    NLog最具優勢的特性之一就是它的布局(layout)概念。“${}”符號用來表示“布局呈現器(layout renderer)”,即隨當前日志插入一段上下文信息。我們可以在很多地方使用布局,例如控制日志信息寫入到屏幕以及文件中的格式,甚至還可以控制日志輸出文件的名稱。這個特性功能非常強大,接下來我們就來看看:

    假設我們需要為輸出到控制臺的每一條信息添加如下附加信息:

  • 當前的時間日期
  • 發送該消息的類名和方法名
  • 日志等級
  • 日志內容
  • 實現起來非常簡單:

    <target name="c" xsi:type="Console" layout="${longdate} | ${callsite} | ${level} | ${message}"/>

    ?還可以讓來自不同類的日志信息輸出到不同的文件中:

    <target name="f" xsi:type="File" fileName="${logger}.txt"/>

    ?默認的layout屬性值:?${longdate}|${level:uppercase=true}|${logger}|${message}?,關于布局的詳細介紹請查看Layouts。

    關于布局渲染器的詳細介紹請查看Layout Renderers,此處介紹幾個常用的:

    • ${date:universalTime=Boolean:format=String:culture=Culture}:當前日期和時間。
    • ${shortdate:universalTime=Boolean}:表示格式為?yyyy-MM-dd?的短日期。?
    • ${longdate:universalTime=Boolean}:表示格式為?yyyy-MM-dd HH\:mm\:ss.ffff ?的長日期格式。?universalTime?設置是否輸出UTC時間代替本地時間,默認為?false?。?例如:2016-02-19 10:33:49.9398
    • ${level}:表示日志等級。??uppercase??值設置大小寫,默認為?false?,即首字母大寫,其余字母小寫。例如(依次為默認、大寫):Trace、TRACE
    • ${logger}:表示日志記錄器的名稱,也就是方法?LogManager.GetLogger("Program")? 的參數值。例如:Program
    • ${message}:表示日志消息。例如:??logger.Trace("Sample trace message"); ?,則結果為:Sample trace message
    • ${machinename}:表示服務器名稱,即計算機名稱。
    • ${newline}:表示換行。
    • ${exception:innerFormat=String:maxInnerExceptionLevel=Integer:innerExceptionSeparator=String:separator=String:format=String}:表示異常信息。?format - 設置輸出格式,必須是異常的屬性:Message、Type、ShortType、ToString、Method、StackTrace、Data,默認值為Message; innerFormat?- 設置內部異常的輸出格式,可選值:Message, Type, ShortType, ToString, Method, StackTrace; maxInnerExceptionLevel?- 設置包含在輸出中的最大內部異常個數,默認為0; innerExceptionSeparator?- 設置內部異常之間的分隔符,默認為換行; separator?- 設置用于連接格式中的多個數據,默認為一個空格,例如: ${exception:format=message,tostring} ,則用一個空格分隔message和string。

    包含文件

    有時我們需要將NLog的配置文件分割成幾個存放。NLog同樣支持在某一配置文件中對其他的配置文件進行引用包含,然后在運行時一起處理。和NLog配置文件中其他部分一樣,我們可以使用熟悉的${var}標記。這樣就方便根據不同環境設置智能裝載相應的配置文件,例如如下示例降加載基于計算機名的配置文件:

    <nlog> ... <include file="${basedir}/${machinename}.config"/> ... </nlog>

    可選屬性,?ignoreErrors="true"?,默認為?false?,可以設置當包含的文件未找到或格式不正確時是否拋出異常。當設置為?true?時,使用?Troubleshooting logging節點記錄錯誤。

    變量(Variables)

    變量被用于定義復雜的表達式,或者多次重復出現的表達式。例如:

    <nlog><variable name="logDirectory" value="${basedir}/logs/${shortdate}"/> <targets> <target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/> <target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt"/> </targets> </nlog>

    變量需要在使用前聲明,否則初始化配置時將失敗。

    但是,自從NLog 4.1以后,使用??${var:var1}?代替?${var1}?,例如:

    <nlog><variable name="user" value="admin" /> <variable name="password" value="realgoodpassword" /> <targets> <target name="debug" type="Debug" layout="${message} and ${var:user}=${var:password}" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="debug" /> </rules> </nlog>

    ?自動重新配置(Autonatic reconfiguration)

    配置文件在程序啟動的時候被自動讀取。程序長時間的運行過程中,有時可能想要改變日志等級,而不停止應用程序。NLog可以監控配置文件,在配置文件發生改變后重新讀取。需要如下設置:

    <nlog autoReload="true">... </nlog>

    ?注意:包含的文件發生改變也會導致重新加載。

    日志功能排錯(Troubleshooting logging)

    有時雖然已經配置好了NLog,可是有些時候應用程序仍舊會出現一些難以理解的問題,例如沒有任何日志輸出。其中最常見的原因就是ASP.NET的權限——ASP.NET的aspnet_wp.exe或w3wp.exe可能沒有對NLog配置文件中指定目錄的寫入權限。NLog對于其自身運行中發生的異常有著很強的監測能力。如下設定可以將這些監測結果輸出至指定位置,或是對這些異常進行相應的處理(默認設定將忽略自身異常):

    • <nlog throwExceptions="true" />- 當NLog自身擲出異常時,該選項可以將異常擲回日志的調用者。在開發過程中,這個設定將變得非常有用,能夠迅速幫助我們定位異常的位置以及原因。而當程序開發結束并部署到應用環境時,應該盡快設定throwExceptions為false,免得NLog自身的異常導致整個應用程序的崩潰。
    • <nlog internalLogFile="file.txt" />- 讓NLog將自身運行過程中的日志信息(包括可能出現的異常)寫入到文件中。
    • <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 選擇寫入內部日志的記錄等級。該等級設定的越高,相應的輸出日志文件將越小。
    • <nlog internalLogToConsole="false|true" /> -?將內部日志信息發送至控制臺。
    • <nlog internalLogToConsoleError="false|true" /> - 將內部日志信息發送至標準異常輸出(stderr)。

    異步處理和包裝器(Asynchronous processing and wrapper targets

    NLog的包裝器和復合輸出目標特性讓我們能夠修改輸出目標的默認行為,這種修改體現在如下幾個方面:

    • 異步處理(向目標輸出將用單獨的線程處理)
    • 異常時自動重試
    • 負載平衡
    • 緩存?
    • 過濾?
    • 備用輸出目標(主輸出目標失敗時啟用備用輸出目標)

    只要在配置文件中將若干個target節點嵌套起來,即可完成對包裝器或復合輸出目標的定義。嵌套深度沒有任何限制。例如為某個輸出目標添加異步處理以及異常自動重試功能,只要按照如下代碼配置NLog即可:

    <targets> <target name="n" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" fileName="${file}.txt"/> </target> </target> </targets>

    ?異步處理特性極為常用,因此NLog提供了一種簡寫方式——即?<targets async="true" />?,這樣該輸出目標將自動應用AsyncWrapper包裝器。

    擴展(Extendsions)

    關于擴展的詳細信息請查看Extending NLog。

    參考文檔

  • https://github.com/NLog/NLog/wiki/Configuration-file
  • http://www.cnblogs.com/dflying/archive/2006/12/06/584426.html
  • 分類: NLog

    ?

    總結

    以上是生活随笔為你收集整理的[转]NLog学习笔记二:深入学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。