web-dev-qa-db-ja.com

x日後にログファイルを削除する

この example のようなファイルターゲットを使用して、Nlogでログを記録したいと思います。 X日後にアーカイブせずにファイルを削除するにはどうすればよいですか?または、ファイルを同じフォルダにアーカイブすることは可能ですか?

41
Freddy

単純に組み込みのアーカイブ機能を使用できます。この設定では、現在のログに加えて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 のドキュメントも参照してください

71
ccellar

ログのファイル名に日付スタンプが含まれているファイルをアーカイブすると、アーカイブログが混乱し、{#}は常に「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", ...);
10
Curtis

曜日の名前を使用して、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" />   
4
ilCosmico

これがあなたの質問に答えるかどうかはわかりませんが、maxArchiveFilesがあなたのやりたいことをしているようです。私は実際にこのオプションを自分で使用したことがないので、はっきりとは言えません。同じフォルダーにログファイルを確実に「アーカイブ」できます。

それが私なら、ロギングを行って時間を設定する非常に小さなプログラムを作成します(archiveEvery="minute")を使用すると、アーカイブロジックを簡単に強制実行できます。maxArchiveFilesを5などに設定し、NLogが5つのログファイルのみを保持するかどうかを確認します。しばらくプログラムを実行します。おそらくタイマーを介してログメッセージを生成し、NLogのアーカイブ/ローリングロジックが作動するのに十分な時間にわたってログメッセージを簡単に配置できるようにします。

アーカイブファイルの名前付けテンプレートを試します。 archiveNumberingオプションを使用すると、アーカイブファイルの番号付け方法をある程度制御できます。

申し訳ありませんが、より明確な答えや具体的な例を提供することはできませんでしたが、これらのオプションも使用していないため、同じ実験を行う必要があるだけで、今は時間に追われています。

3
wageoghe
     //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();
            }

        }
2
Arihant Lodha

NLog 4.5(またはそれ以降)では、アーカイブのセットアップがはるかに簡単になります。 fileNamemaxArchiveFilesを設定するだけです:

<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と組み合わせると便利です。

1
Rolf Kristensen

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"/>```
0
MSD561