屬性解釋
<target xsi:type="File" name="String" layout="Layout" header="Layout" footer="Layout" encoding="Encoding" lineEnding="Enum" archiveAboveSize="Long" maxArchiveFiles="Integer" maxArchiveDays="Integer" archiveFileName="Layout" archiveNumbering="Enum" archiveDateFormat="String" archiveEvery="Enum" archiveOldFileOnStartup="Boolean" archiveOldFileOnStartupAboveSize="Long" replaceFileContentsOnEachWrite="Boolean" fileAttributes="Enum" fileName="Layout" deleteOldFileOnStartup="Boolean" enableFileDelete="Boolean" createDirs="Boolean" concurrentWrites="Boolean" openFileFlushTimeout="Integer" openFileCacheTimeout="Integer" openFileCacheSize="Integer" networkWrites="Boolean" concurrentWriteAttemptDelay="Integer" concurrentWriteAttempts="Integer" bufferSize="Integer" autoFlush="Boolean" keepFileOpen="Boolean" forceManaged="Boolean" enableArchiveFileCompression="Boolean" cleanupFileName="Boolean" writeFooterOnArchivingOnly="Boolean" writeBom="Boolean" />
看着是不是很不舒服,接下來我們對file的屬性一個個進行講解
name:輸出配置名稱,可以自己定義,隨便寫
layout:日志的格式模板 自定義,里面的變量可以參考官方文檔
header:頭部格式
footer:腳部格式
encoding:編碼格式,可以是utf-8或者其他字符集
lineEnding:行結束模式
- CR - 在每行后插入 CR 字符 (ASCII 13)。
- CRLF - 在每行之后插入 CR LF 序列(ASCII 13、ASCII 10)
- 默認 - 在每行之后插入依賴於平台的行尾序列。
- LF - 在每行后插入 LF 字符 (ASCII 10)。
- 無 - 不插入任何行尾。
這個是官方給的解釋及參考值
archiveAboveSize:以字節為單位的大小,超過該大小的日志文件將被自動存檔
maxArchiveFiles:應保留的最大存檔文件數。如果maxArchiveFiles小於或等於 0,則不刪除舊文件
maxArchiveDays: 應保留的存檔文件的最長期限。當archiveNumbering為時無效Rolling。如果maxArchiveDays小於或等於 0,則不刪除舊文件
archiveFileName:要用於存檔的文件的名稱 可以指定日志,具體參考官方文檔
archiveNumbering:對文件檔案進行編號的方式
archiveDateFormat:指定用於存檔編號的日期格式。此選項僅在“ArchiveNumbering”參數設置為 Date 或 DateAndSequence 時有效
- 默認: yyyyMMdd
- ArchiveEvery = 分鍾時的默認值: yyyyMMddHHmm
- ArchiveEvery = 小時時的默認值: yyyyMMddHH
- ArchiveEvery = Month 時的默認值: yyyyMM
- ArchiveEvery = Year 時的默認值: yyyy
archiveEvery:指示是否在每次經過指定時間時自動歸檔日志文件
- 日 - 每天存檔。
- 小時 - 每小時存檔一次。
- 分鍾 - 每分鍾存檔一次。
- 月 - 每月存檔。
- 無 - 不要根據時間存檔。
- 年 - 每年存檔。
- 星期日 - 每個星期日存檔。在 NLog 4.4.4 中引入。
- 星期一 - 每周一存檔。在 NLog 4.4.4 中引入。
- 星期二 - 每個星期二存檔。在 NLog 4.4.4 中引入。
- 星期三 - 每周三存檔。在 NLog 4.4.4 中引入。
- 星期四 - 每個星期四存檔。在 NLog 4.4.4 中引入。
- 星期五 - 每星期五存檔。在 NLog 4.4.4 中引入。
- 星期六 - 每星期六存檔。在 NLog 4.4.4 中引入。
如果當前時間段發生變化,文件將作為寫入操作的一部分移動到存檔中。例如,如果當前小時從 10 點更改為 11 點,則在 11:00 或之后發生的第一次寫入將觸發
archiveOldFileOnStartup:在啟動時存檔舊日志文件
archiveOldFileOnStartupAboveSize:啟動時存檔舊日志文件的文件大小閾值。默認值為 0,這意味着一旦啟用archiveOldFileOnStartup就會歸檔文件。在 NLog 4.7 中引入
replaceFileContentsOnEachWrite:指示是否在每次寫入時替換文件內容,而不是在末尾附加日志消息
fileAttributes:文件屬性(僅限 Windows)
- 存檔 - 文件應該被存檔。
- 壓縮的- 由於 .Net 限制,壓縮將不起作用。您可以使用 enableArchiveFileCompression。
- DeleteOnClose - 關閉文件后刪除文件。
- 設備 - 設備文件。
- 加密 - 加密文件。
- 隱藏 - 隱藏文件。
- NoBuffering - 系統打開一個沒有系統緩存的文件。
- 普通 - 普通文件。
- NotContentIndexed - 內容索引服務不應為文件編制索引。
- PosixSemantics - 根據 POSIX 規則訪問文件。
- 只讀 - 只讀
- ReadOnly - 只讀文件。
- ReparsePoint - 重新解析點。
- SparseFile - 稀疏文件。
- 系統 - 系統文件。
- 臨時 - 文件是臨時的(應該保存在緩存中,如果可能的話不要寫入磁盤)。
- WriteThrough - 系統通過任何中間緩存寫入並直接進入磁盤。
fileName:要寫入的文件的名稱
deleteOldFileOnStartup: 指示是否在啟動時刪除舊日志文件,此選項僅在“FileName”參數表示單個文件時有效。
enableFileDelete:指示是否啟用刪除日志文件
createDirs:是否創建不存在的目錄
keepFileOpen:指示是否在每次記錄事件時保持日志文件打開,將此屬性更改為 true 將大大提高性能,但也會保持文件句柄鎖定。啟用此選項時,請考慮設置openFileCacheTimeout = 30,因為它將允許存檔操作並對被刪除的日志文件做出反應。
concurrentWrites:當使用keepFileOpen = true時,支持從同一機器主機上的多個進程優化並發寫入同一日志文件。通過使用一種特殊的技術,它可以讓文件從多個進程中打開。如果只有單個進程(和單個 AppDomain)應用程序正在記錄日志,那么設置為concurrentWrites = False會更快。
openFileCacheTimeout:文件保持打開的最大秒數。如果此數字為負數,則文件在一段時間不活動后不會自動關閉
openFileCacheSize:要保持打開的文件數。在單個 File 目標寫入多個文件(例如按級別或按記錄器拆分)的情況下,將此設置為更高的值可能會提高性能
openFileFlushTimeout:顯式刷新文件緩沖區之間的秒數。有助於確保文件緩沖區在autoFlush = false時最終被刷新
networkWrites:指示是否由不同網絡主機上的多個進程並發寫入日志文件。
concurrentWriteAttemptDelay:在嘗試再次寫入文件之前等待的延遲(以毫秒為單位)。整數默認值:1
實際延遲是一個介於 0 和此參數中指定的值之間的隨機值。在每次失敗的嘗試中,延遲基數加倍為 ConcurrentWriteAttempts 次。
concurrentWriteAttempts:在 NLog 丟棄日志消息之前嘗試寫入文件的次數
bufferSize:以字節為單位的日志文件緩沖區大小。整數默認值:32768
autoFlush: 指示是否在每條日志消息后自動刷新文件緩沖區,禁用它會提高性能
forceManaged:指示文件目標應僅使用托管方法。這會禁用某些選項
enableArchiveFileCompression:指示是否將存檔文件壓縮為 zip 文件
cleanupFileName:在寫入文件之前,檢查文件名是否包含非法字符(取決於操作系統)。如果寫入大量消息,這可能代價高昂。清理緩存為固定名稱(無布局渲染器)。將此設置false為最佳性能(但要注意文件名,如果錯誤,則不會寫入任何內容)
writeFooterOnArchivingOnly:指示是否應僅在歸檔文件時寫入頁腳
writeBom:指示是否在創建的文件中寫入 BOM(字節順序標記)
JSON/xml Log-file
Nlog不光能記錄普通的log文件,還可以記錄json格式的問題
<?xml version="1.0" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="jsonfile" xsi:type="File" fileName="${basedir}/file.json"> <layout xsi:type="JsonLayout"> <attribute name="time" layout="${date:format=O}" /> <attribute name="message" layout="${message}" /> <attribute name="logger" layout="${logger}"/> <attribute name="level" layout="${level}"/> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="jsonfile" /> </rules> </nlog>
可以記錄xml格式的文件呢
<?xml version="1.0" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="csvfile" xsi:type="File" fileName="${basedir}/file.csv"> <layout xsi:type="CSVLayout"> <column name="time" layout="${longdate}" /> <column name="message" layout="${message}" /> <column name="logger" layout="${logger}"/> <column name="level" layout="${level}"/> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="csvfile" /> </rules> </nlog>
示例
那我們開始一個個進行嘗試,看看效果
<?xml version="1.0" encoding="utf-8" ?> <!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema--> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="c:\temp\console-example-internal.log" internalLogLevel="Info" > <targets> <target xsi:type="ColoredConsole" name="colorConsole" encoding="Encoding" detectConsoleAvailable="true" detectOutputRedirected="false" useDefaultRowHighlightingRules="false" header="--------------------" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception} ${newline} ${stacktrace} ${newline}" footer="---------------------" > <highlight-row condition="level == LogLevel.Trace" backgroundColor="White" foregroundColor="DarkGray"/> <highlight-row condition="level == LogLevel.Debug" backgroundColor="White" foregroundColor="DarkBlue"/> <highlight-row condition="level == LogLevel.Info" backgroundColor="Green" foregroundColor="White"/> <highlight-row condition="level == LogLevel.Warn" backgroundColor="Magenta" foregroundColor="DarkYellow"/> <highlight-row condition="level == LogLevel.Error" backgroundColor="Gray" foregroundColor="Red"/> <highlight-row condition="level == LogLevel.Fatal" backgroundColor="Gray" foregroundColor="DarkRed"/> </target> <target xsi:type="File" name="myfile" fileName="${basedir}/logs/${level:uppercase=true}.${shortdate}.log" createDirs="true" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}" header="-------" footer="--------" encoding="utf-8" lineEnding="CRLF" keepFileOpen="true" concurrentWrites="false" openFileCacheTimeout="30" openFileCacheSize="6" openFileFlushTimeout="10" autoFlush="false" cleanupFileName="false" archiveAboveSize="10000" maxArchiveFiles="10" maxArchiveDays="10" archiveFileName="archive.${level:uppercase=true}.{#}.log" archiveNumbering="Date" archiveEvery="Month" archiveOldFileOnStartup="false" archiveOldFileOnStartupAboveSize="0" replaceFileContentsOnEachWrite="false" enableFileDelete="true" concurrentWriteAttempts="20000" networkWrites="false" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="colorConsole,myfile" /> </rules> </nlog>
嗯,確實很棒,速度很快,很方便
下面我們試一下json文件,然后我們換個目錄看看效果
<?xml version="1.0" encoding="utf-8" ?> <!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema--> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="c:\temp\console-example-internal.log" internalLogLevel="Info" > <targets> <target xsi:type="ColoredConsole" name="colorConsole" encoding="Encoding" detectConsoleAvailable="true" detectOutputRedirected="false" useDefaultRowHighlightingRules="false" header="--------------------" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception} ${newline} ${stacktrace} ${newline}" footer="---------------------" > <highlight-row condition="level == LogLevel.Trace" backgroundColor="White" foregroundColor="DarkGray"/> <highlight-row condition="level == LogLevel.Debug" backgroundColor="White" foregroundColor="DarkBlue"/> <highlight-row condition="level == LogLevel.Info" backgroundColor="Green" foregroundColor="White"/> <highlight-row condition="level == LogLevel.Warn" backgroundColor="Magenta" foregroundColor="DarkYellow"/> <highlight-row condition="level == LogLevel.Error" backgroundColor="Gray" foregroundColor="Red"/> <highlight-row condition="level == LogLevel.Fatal" backgroundColor="Gray" foregroundColor="DarkRed"/> </target> <target xsi:type="File" name="myfile" fileName="${basedir}/logs/${level:uppercase=true}.${shortdate}.log" createDirs="true" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}" header="-------" footer="--------" encoding="utf-8" lineEnding="CRLF" keepFileOpen="true" concurrentWrites="false" openFileCacheTimeout="30" openFileCacheSize="6" openFileFlushTimeout="10" autoFlush="false" cleanupFileName="false" archiveAboveSize="10000" maxArchiveFiles="10" maxArchiveDays="10" archiveFileName="archive.${level:uppercase=true}.{#}.log" archiveNumbering="Date" archiveEvery="Month" archiveOldFileOnStartup="false" archiveOldFileOnStartupAboveSize="0" replaceFileContentsOnEachWrite="false" enableFileDelete="true" concurrentWriteAttempts="20000" networkWrites="false" /> <target xsi:type="File" name="myjsonfile" fileName="${basedir}/jsonlogs/${level:uppercase=true}.${shortdate}.json" createDirs="true" encoding="utf-8" lineEnding="CRLF" keepFileOpen="true" concurrentWrites="false" openFileCacheTimeout="30" openFileCacheSize="6" openFileFlushTimeout="10" autoFlush="false" cleanupFileName="false" archiveAboveSize="10000" maxArchiveFiles="10" maxArchiveDays="10" archiveFileName="archive.${level:uppercase=true}.{#}.log" archiveNumbering="Date" archiveEvery="Month" archiveOldFileOnStartup="false" archiveOldFileOnStartupAboveSize="0" replaceFileContentsOnEachWrite="false" enableFileDelete="true" concurrentWriteAttempts="20000" networkWrites="false" > <layout xsi:type="JsonLayout"> <attribute name="time" layout="${longdate:format=O}" /> <attribute name="message" layout="${message}" /> <attribute name="logger" layout="${logger}"/> <attribute name="level" layout="${level}"/> <attribute name="exception" layout="${exception:format=ToString}"/> <attribute name="stacktrace" layout="${stacktrace}"/> </layout> </target> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="colorConsole,myfile,myjsonfile" /> </rules> </nlog>
效果依舊非常棒!
xml我們就不做測試了,本章完畢,點個關注唄,你們的關注是longyan的強大動力