[C#]NLog進階使用(1) - 檔案多目標輸出

關於NLog的基本用法,

網路上有很多的教學文,所以在此就不多作介紹。

如果你是第一次使用NLog的朋友,

可以參考Kevin大的文章: 傳送門

內容寫得非常詳盡,包準看著做就會。

本篇要介紹的主要是NLog.Config檔裡面rule的多目標輸出

首先我們先看一下NLog.Config的正常設定

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Error" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

   <target name="file" xsi:type="File"
      fileName="${basedir}/App_Data/Logs/${shortdate}/${logger}.txt"
      layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}" />

    <target name="FatalFile" xsi:type="File"
      fileName="${basedir}/App_Data/Logs/${shortdate}/FatalFile.txt"
      layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}" />

    <target name="eventlog" xsi:type="EventLog" 
      source="Lab_Of_NLog" log="Application" 
      layout="${date}: ${message} ${stacktrace}" />

  </targets>

  <rules>
  
    <logger name="*" levels="Trace, Debug, Info, Warn" writeTo="file" />
    <logger name="*" level="Fatal" writeTo="FatalFile" />
    <logger name="*" level="Fatal" writeTo="eventlog" />

  </rules>
</nlog>


這邊的基本介紹一開始的Kevin大的文章內已經有說明過了,我就不再贅述

正常來講一份Log應該只需要一次,但是總是有例外

當你的老闆要求你把一份Log寫到兩個不同目標的資料夾的時候

你可以先問問他是不是瘋了(也只能OS一下啦)

但因為他是老闆,所以我們也只能照辦

所以要怎麼設定呢?

NLog可支援單筆rule寫至多個target裡面

所以我們只要修改NLog.Config內容即可

假設我們要把某個rule分別寫到兩個不同的target(Dir_A、Dir_B)

target

 <target name="Dir_A" xsi:type="File"
            fileName="${basedir}/App_Data/Logs/${shortdate}/DirA/${logger}.txt"
            layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}" />
   <target name="Dir_B" xsi:type="File"
            fileName="${basedir}/App_Data/Logs/${shortdate}/DirB/${logger}.txt"
            layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${newline}" />

rule

<logger name="*" levels="Trace, Debug, Info, Warn" writeTo="Dir_A,Dir_B" />

測試結果如下

後記:

雖然這是很白癡的作法

但老闆想要你也只能認了......

下次再來分享NLog rule的進階設定