この example のようなファイルターゲットを使用して、Nlogでログを記録したいと思います。 X
日後にアーカイブせずにファイルを削除するにはどうすればよいですか?または、ファイルを同じフォルダにアーカイブすることは可能ですか?
単純に組み込みのアーカイブ機能を使用できます。この設定では、現在のログに加えて7つの古いログファイルが保持されます。クリーンアップはNLogによって自動的に行われます。
<?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="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/logs/logfile.txt"
archiveFileName="${basedir}/logs/log.{#}.txt"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
concurrentWrites="true" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
file target のドキュメントも参照してください
ログのファイル名に日付スタンプが含まれているファイルをアーカイブすると、アーカイブログが混乱し、{#}
は常に「0」に変換され、古いログが削除されることはありません。また、ログファイル名にGDC参照を使用すると、ログがまったく切り替わりません。
これらの豪華なログファイル名が必要な場合は、古いログを手動で削除する必要があります。ファイル名に日付が含まれていると、ファイルが自動的に切り替わります。
// Delete log files older than X days
var dirInfo = new DirectoryInfo(".");
var oldestArchiveDate = DateTime.Now - new TimeSpan(30, 0, 0, 0);
foreach (FileInfo fi in dirInfo.GetFiles())
if (fi.Name.StartsWith("log-") && fi.Name.EndsWith(".txt") && fi.CreationTime < oldestArchiveDate)
fi.Delete();
var midnight = DateTime.Today.AddDays(1);
_oldLogCleanUpThread = new System.Threading.Timer(OldLogCleanUpThreadMethod, null, midnight - DateTime.Now, TimeSpan.FromDays(1));
nlogターゲット:
filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);
曜日の名前を使用して、maxArchiveFiles
を固定数に設定できます。たとえば、foreach曜日には、100 KBのファイルを最大100個格納できます。
<variable name="dayname" value="${date:format=dddd}" />
<target name="logfile" xsi:type="File"
fileName="${basedir}/Logs/MyLog_${dayname}.txt"
archiveFileName="${basedir}/Logs/Archives/MyLog_${dayname}.{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
maxArchiveFiles="100"
concurrentWrites="true"
keepFileOpen="false"
encoding="iso-8859-2" />
これがあなたの質問に答えるかどうかはわかりませんが、maxArchiveFiles
があなたのやりたいことをしているようです。私は実際にこのオプションを自分で使用したことがないので、はっきりとは言えません。同じフォルダーにログファイルを確実に「アーカイブ」できます。
それが私なら、ロギングを行って時間を設定する非常に小さなプログラムを作成します(archiveEvery="minute"
)を使用すると、アーカイブロジックを簡単に強制実行できます。maxArchiveFiles
を5などに設定し、NLogが5つのログファイルのみを保持するかどうかを確認します。しばらくプログラムを実行します。おそらくタイマーを介してログメッセージを生成し、NLogのアーカイブ/ローリングロジックが作動するのに十分な時間にわたってログメッセージを簡単に配置できるようにします。
アーカイブファイルの名前付けテンプレートを試します。 archiveNumbering
オプションを使用すると、アーカイブファイルの番号付け方法をある程度制御できます。
申し訳ありませんが、より明確な答えや具体的な例を提供することはできませんでしたが、これらのオプションも使用していないため、同じ実験を行う必要があるだけで、今は時間に追われています。
//Store the number of days after which you want to delete the logs.
int Days = 30;
// Storing the path of the directory where the logs are stored.
String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\\Log(s)\\";
//Fetching all the folders.
String[] objSubDirectory = Directory.GetDirectories(DirPath);
//For each folder fetching all the files and matching with date given
foreach (String subdir in objSubDirectory)
{
//Getting the path of the folder
String strpath = Path.GetFullPath(subdir);
//Fetching all the files from the folder.
String[] strFiles = Directory.GetFiles(strpath);
foreach (string files in strFiles)
{
//For each file checking the creation date with the current date.
FileInfo objFile = new FileInfo(files);
if (objFile.CreationTime <= DateTime.Now.AddDays(-Days))
{
//Delete the file.
objFile.Delete();
}
}
//If folder contains no file then delete the folder also.
if (Directory.GetFiles(strpath).Length == 0)
{
DirectoryInfo objSubDir = new DirectoryInfo(subdir);
//Delete the folder.
objSubDir.Delete();
}
}
NLog 4.5(またはそれ以降)では、アーカイブのセットアップがはるかに簡単になります。 fileName
とmaxArchiveFiles
を設定するだけです:
<target name="logfile" type="File" fileName="Log-${shortdate}.txt" maxArchiveFiles="7" />
参照: https://github.com/NLog/NLog/wiki/File-target#archive-old-log-files
NLog 4.7(またはそれ以降)には、ログファイルの実際のタイムスタンプを検査する新しいオプションmaxArchiveDays
が導入されています。 archiveAboveSize
と組み合わせると便利です。
NLog 4.5(またはそれ以降)から、7日後に削除する場合は以下を使用できますが、1日あたりの使用スペースを制限します(この例では10MB)。
<target xsi:type="File" name="f"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=toString}"
archiveEvery="Thursday"
maxArchiveFiles="7"
archiveAboveSize ="10485760"/>```