私の会社ではNLogを使用しています。大量のログファイルに関する問題が発生しています。私たちがやりたいことは、ファイルを毎日アーカイブし、最大でx個のファイルを保持することです。 7.これについてインターネットでいくつかのトピックを読みましたが、それらは主に、NLog.configファイルを変更する同じ方向を示しています。しかし、私が期待するように、ファイルをローテーションする気にはならないようです。現在、目的のフォルダには何もアーカイブされていません。ただし、すべてのファイルは次の形式で「logs」ディレクトリに保存されます。
Log.info.2011-11-07.txt
私のアプリケーション内には、ディレクトリ「ログ」があります。そのフォルダ内にすべてのログファイルが保存されます。古いファイルをすべてアーカイブしたい「archives」というフォルダもあります。そのディレクトリ内でログファイルの最大数に達した後、ログファイルは自動的に消去されます。これは可能ですか?現在の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"
autoReload="true"
throwExceptions="true"
internalLogFile="C:\nlog-internal.txt"
internalLogLevel="Error">
<extensions>
<add Assembly="NLog.Extended" />
</extensions>
<targets>
<!-- will move file to archive once it reaches 1MB. Files are archived by day, with a maximum of three files. ConcurrentWrites is set to false,
change to true if multiple processes will be writing to the logfile-->
<target name="file" xsi:type="File" fileName="${basedir}/logs/Log.info.${shortdate}.txt"
layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}"
archiveFileName="${basedir}/logs/archives/log.info.${shortdate}.txt"
archiveAboveSize="1048576"
archiveEvery="Day"
archiveNumbering = "Rolling"
maxArchiveFiles="7"
concurrentWrites="false"
/>
<target name="file-default" xsi:type="File" fileName="${basedir}/log_default.txt"/>
<target name="file-debug" xsi:type="File" fileName="${basedir}/log_debug.txt"/>
<target name="file-testclass" xsi:type="File" fileName="${basedir}/log_testclass.txt"/>
<target name="mail" xsi:type="Mail"
subject="${level} - ${aspnet-request:serverVariabele=PATH_INFO} | ${callsite:includeSourcePath=true}"
to="[email protected]"
smtpServer="mail.server.com"
from="[email protected]"/>
<target xsi:type="Database"
name="TestDatabaseLogging"
connectionString="Data Source=123.123.123.123;Initial Catalog=NLog_Test;User ID=su_Nlog;Password=test123"
dbDatabase="NLog_Test">
<commandText>
insert into INNO_LOG ([createDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@createDate, @Origin, @logLevel, @message, @exception, @stackTrace)
</commandText>
<parameter name="@createDate" layout="${date}"/>
<parameter name="@Origin" layout="${callsite}"/>
<parameter name="@logLevel" layout="${level}"/>
<parameter name="@message" layout="${message}"/>
<parameter name="@exception" layout="${exception:format=Message,StackTrace}"/>
<parameter name="@stackTrace" layout="${stacktrace}"/>
</target>
</targets>
<rules>
<logger name="*" minlevel="Fatal" writeTo="mail" />
<logger name="*" minlevel="Error" writeTo="TestDatabaseLogging" />
<logger name="*" minlevel="Debug" writeTo="file-debug" />
<logger name="*" minlevel="Info" writeTo="file" />
<!--Log to specific files for specific classes.-->
<logger name="_Default" minlevel="Trace" writeTo="file-default" />
<logger name="TestClass" minlevel="Trace" writeTo="file-testclass" />
</rules>
</nlog>
編集:ケラーが答えた後の最終的な(省略)ソリューション。
<target name="file"
xsi:type="File"
fileName="${basedir}/logs/Log.${level}.current.txt"
layout="${longdate} ${callsite} ${level}: ${message} ${exception:format=Message,StackTrace} ${stacktrace}"
archiveFileName="${basedir}/logs/archives/log.error.${shortdate}.{#}.txt"
archiveAboveSize="5242880"
archiveEvery="Day"
archiveNumbering = "Rolling"
maxArchiveFiles="3" />
問題はファイル名定義のshortdate
にあるようです。この質問で私の答えを参照してください: x日後にログファイルを削除
日付部分なしでファイル名を定義する必要があります
fileName="${basedir}/logs/Log.info.txt
NLog 4.5以降では、動的なfileName-Layoutとarchive-logicのサポートが改善されています。
あなたはこれを行うことができます:
<target name="file" xsi:type="File"
fileName="${basedir}/logs/Log.${level}.${shortdate}.txt"
archiveAboveSize="5242880"
maxArchiveFiles="3" />
NLog 4.7では、FileTargetの設定maxArchiveDays
も導入されています。
参照 https://github.com/NLog/NLog/wiki/File-target#archive-old-log-files