x天后删除日志文件

时间:2011-04-06 11:29:53

标签: logging archive nlog

我想使用文件目标登录Nlog,就像在example中一样。如何在X天之后删除文件而不归档它们?或者是否可以将文件存档到同一文件夹?

7 个答案:

答案 0 :(得分:68)

您可以简单地使用内置归档功能。此设置将保留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

的文档

答案 1 :(得分:10)

我发现如果我在日志文件名中存档带有日期戳的文件,则归档日志会混淆,{#}总是会转换为“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 target:

 filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);

答案 2 :(得分:4)

您可以使用当天的名称并将maxArchiveFiles设置为固定数字。例如,在一周的前一天,您可以存储最多100个100Kb的文件:

<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" />   

答案 3 :(得分:3)

我不知道这是否能回答你的问题,但看起来maxArchiveFiles应该做你想做的事。我自己实际上没有使用过这个选项,所以我不能肯定地说。您当然可以将日志文件“归档”在同一文件夹中。

如果是我,我会创建一个非常小的程序来执行一些日志记录并设置时间(archiveEvery="minute"),这样就很容易强制归档逻辑启动。设置maxArchiveFiles到类似于5的东西,看看NLog是否只保留5个日志文件。运行程序一段时间,可能通过计时器生成日志消息,这样您就可以在NLog的归档/滚动逻辑启动的足够时间内轻松分隔日志消息。

试用归档文件命名模板。使用archiveNumbering选项可以控制存档文件的编号方式。

抱歉,我无法给出更明确的答案或具体的例子,但我也没有使用过这些选项,所以我只需要进行相同的实验,而且我现在时间紧迫。

答案 4 :(得分:2)

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

        }

答案 5 :(得分:1)

NLog 4.5(或更高版本)使设置归档变得更加容易。您只需配置fileNamemaxArchiveFiles

<target name="logfile" type="File" fileName="Log-${shortdate}.txt" maxArchiveFiles="7" />

另请参阅:https://github.com/NLog/NLog/wiki/FileTarget-Archive-Examples

答案 6 :(得分:0)

NLog 4.5 (或更高版本)中,如果要在7天后删除,但每天使用的空间有限,在我们的示例中为700MB,则可以使用以下内容:

请注意,如果在存档文件夹中达到限制大小,您将找到最新的日志,而不必是最近7天的日志,这是因为这些选项是互斥的。

<target xsi:type="File" name="f"
            fileName="${basedir}/logs/$currentLogfile.log"
            archiveFileName="${basedir}/logs/archives/logfile.{#}.log"
            layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=toString}"
            archiveNumbering="DateAndSequence"
            archiveEvery="Day"
            archiveDateFormat="yyyyMMdd"
            maxArchiveFiles="7"
            archiveAboveSize="104857600"
            />```