見我的答案在這裏一個類似的問題:
Nlog - Generating Header Section for a log file
總之,我建議定義另一個日誌目標。如果要記錄到文件,請定義第二個文件目標,指向同一個文件,但使用不同的佈局。定義佈局以使其具有所需的格式。您可以將佈局定義爲硬編碼到您想要的標題值(您的情況爲「---------------」),或者您可以定義佈局以僅記錄消息並那麼你可以將佈局傳遞給它。
這是可能工作的最短的事情。請注意,我從上面鏈接的答案中剪切和粘貼,並針對您的情況稍作修改。我沒有測試它。
定義佈局:
<variable name="HeaderLayout" value="${message}"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />
使用佈局定義目標:
<target name="fileHeader" xsi:type="File" fileName="xxx.log" layout="${HeaderLayout}" />
<target name="file" xsi:type="File" fileName="xxx.log" layout="${InfoLayout}" />
定義的規則/記錄器:
<rules>
<logger name="headerlogger" minlevel="Trace" writeTo="fileHeader" final="true" />
<logger name="*" minlevel="Trace" writeTo="file" />
</rules>
使用記錄儀:
public class MyClass
{
private static Logger logger = LogManager.GetCurrentClassLogger();
private static Logger headerLogger = LogManager.GetLogger("headerlogger");
public void DoSomething()
{
headerLogger.Info("---------------------");
logger.Info("Inside DoSomething");
headerLogger.Info("---------------------");
}
}
或者,你可以定義佈局,使得它在它的頭定義:
<variable name="HeaderLayout" value="-----------------------------"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />
然後你會使用這樣的:
Logger headerLogger = LogManager.GetLogger("headerlogger"); //Assuming same rules/loggers definition as above.
headerLogger.Info("It doesn't matter what you put here because the layout has the header message hardcoded");
你可以寫一個輔助函數,使您不必明確處理標題記錄器:
public void WriteHeader()
{
LogManager.GetLogger("headerlogger").Info("This string does not matter");
}
我認爲這應該會給您一些很好的見解你如何才能完成你想要做的事情。
希望這會有所幫助!
祝你好運!
優秀的答案。它爲我工作。謝謝。 – Animesh
太複雜了。很遺憾,它沒有像LogRaw()這樣的簡單方法,它跳過了行標題。 – NickG