需求產生緣由
在開發中為了了解程序在運行的內存狀態并記錄下來,以便出問題時判斷是不是與內存相關。于是實時采集了開發程序需要的內存信息。但采集的內存信息在存儲時,以NLog中的Trace級別來存儲的話,會與程序其它Trace級別的日志都記錄在相同的Trace Log文件下,這會導致在查看內存日志時還需要將非內存日志去除,才能將所有的內存日志方便地顯示出來。
解決方法——NLog XML配置
代碼如下,主要就是添加過濾條件filters,要實現的是含有MemoryLog的要寫入Memory文件中,于是判斷日志字符串中是否有MemoryLog.
<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" /><target name="logconsole" xsi:type="Console" /><target name="memory" xsi:type="File" fileName="${basedir}/Memory.log" layout="${longdate} ${level} ${message} ${exception} ${newline}" /></targets><rules><logger name="*" minlevel="Info" writeTo="logconsole" /><logger name="*" minlevel="Debug" writeTo="logfile" /><logger name="*" minlevel="Trace" writeTo="memory" ><filters defaultAction="Ignore"><when condition="contains('${message}', 'MemoryLog')" action="Log" /></filters></logger></rules>
</nlog>
注意:filters的defaultAction設置成Ignore(忽略),否則會將其它日志記錄到Memory文件中;另外xml配置時插入的xml文件文件名應該為NLog.config,同時要將此文件的?復制到輸出目錄?設置為?如果較新則復制/始終復制。
參考鏈接:
When Filter · NLog/NLog Wiki · GitHub
Filtering log messages · NLog/NLog Wiki · GitHub
解決方法——C#代碼
本質就是將上述xml轉化為C#代碼 ,為了方便以后查閱,特記錄如下:
var config = new NLog.Config.LoggingConfiguration();//設定log文件var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };//設定log控制臺var logconsole = new NLog.Targets.ConsoleTarget("logconsole");//設定MemoryLog文件var memory = new NLog.Targets.FileTarget("memory") { FileName = "${basedir}/Memory.log", Layout = "${longdate} ${level} ${message} ${exception} ${newline}" };config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole);config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile);//為memory設定過濾條件var rule = new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, memory);rule.Filters.Add(new NLog.Filters.ConditionBasedFilter{Condition = "contains('${message}', 'MemoryLog')",Action = NLog.Filters.FilterResult.Log});config.LoggingRules.Add(rule);NLog.LogManager.Configuration = config;