NLog - 删除超过X天的日志

pio*_*lut 9 c# asp.net-mvc nlog

如何删除日期超过X天的文件.这很简单,但我在一个文件夹中只记录了一天.我的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">
  <extensions>
    <add assembly="NLog.Extended" />
  </extensions>
  <variable name="LogHome" value="PATH"/>
  <variable name="DailyDir" value="${LogHome}${date:format=yyyy}/${date:format=MM}/${date:format=dd}/"/>
  <targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
      <target
        name="fatalLog"
        xsi:type="File"
        layout="${longdate}|${callsite}|${message}|${exception}"
        fileName="${DailyDir}/Fatal.txt"
              />
    </target>
    <target name="asyncFile" xsi:type="AsyncWrapper">
      <target
        name="errorLog"
        xsi:type="File"
        layout="${longdate}|${callsite}|${message}|${exception}"
        fileName="${DailyDir}/Error.txt"
              />
    </target>
  </targets>
  <rules>
    <logger name="*" level="Fatal" writeTo="fatalLog" />
    <logger name="*" level="Error" writeTo="errorLog" />
  </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

Dir*_*eek 16

现在,您正在包含日期的目录中创建日志.要使NLog能够自动管理当前和旧的日志文件,您需要使用NLog归档功能.如此处的NLog文件目标文档中所述,您可以使用这些属性archiveFileName以及maxArchiveFiles每日日志将日志文件保留X天,然后NLog将其删除.

您可能必须将所有存档日志保存在单个目录中,否则NLog将无法找到旧日志并将其删除.我将创建一个存档目录作为主日志目录的子目录,让NLog将所有存档日志放在那里,然后使用该maxArchiveFiles参数告诉NLog你想要保留多少这些日志.

<targets>
<target name="asyncFile" xsi:type="AsyncWrapper">
  <target
    name="fatalLog"
    xsi:type="File"
    layout="${longdate}|${callsite}|${message}|${exception}"
    fileName="${LogHome}/Fatal.txt"
    archiveFileName="${LogHome}/Archive/Fatal-${shortdate}.txt"
    maxArchiveFiles="5"
    archiveEvery="Day"
          />
</target>
<target name="asyncFile" xsi:type="AsyncWrapper">
  <target
    name="errorLog"
    xsi:type="File"
    layout="${longdate}|${callsite}|${message}|${exception}"
    fileName="${LogHome}/Error.txt"
    archiveFileName="${LogHome}/Archive/Error-${shortdate}.txt"
    maxArchiveFiles="5"
    archiveEvery="Day"
          />
</target>
</targets>
Run Code Online (Sandbox Code Playgroud)

这应该为您提供两个包含当前日志的日志文件和一个归档目录,其中包含过去5天内每个目标的5个日志.


Rol*_*sen 8

NLog 4.5 可以更轻松地设置存档清理:

  <target
    name="errorLog"
    xsi:type="File"
    layout="${longdate}|${callsite}|${message}|${exception}"
    fileName="${DailyDir}/Error.${shortdate}.txt"
    maxArchiveFiles="5"
  />
Run Code Online (Sandbox Code Playgroud)

NLog 4.7 还引入了设置maxArchiveDays(如果还使用则很有用archiveAboveSize)。另见:https : //github.com/NLog/NLog/wiki/File-target#archive-old-log-files


小智 6

<target name="Logs" xsi:type="File" fileName="${basedir}/Logs/${shortdate}/${shortdate}-${level}.csv" archiveAboveSize="10240" keepFileOpen="false" 
        maxArchiveDays="30" maxArchiveFiles="90">
  <layout xsi:type="CSVLayout">
    <column name="time" layout="${longdate}" />
    <column name="logger" layout="${logger}"/>
    <column name="message" layout="${message}" />
  </layout>
</target>
Run Code Online (Sandbox Code Playgroud)

我在我的目标中使用了上面的代码来解决这个问题。如果文件增加 10MB 并存储为 CSV,它将创建一个新文件,以便在 Excel 中轻松读取并删除 30 天前的文件。