【问题标题】:NLog - delete logs older than X daysNLog - 删除超过 X 天的日志
【发布时间】:2015-08-18 09:38:36
【问题描述】:

如何删除日志超过 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>

【问题讨论】:

    标签: c# asp.net-mvc nlog


    【解决方案1】:

    现在您正在包含日期的目录中创建日志。要使 NLog 自动管理您当前和旧的日志文件,您需要使用 NLog 归档功能。正如 NLog 文件目标文档 here 中所述,您可以将属性 archiveFileNamemaxArchiveFiles 与每日日志一起使用,在 NLog 删除它们之前将日志文件保留 X 天。

    您可能必须将所有归档日志保存在一个目录中,否则 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>
    

    这应该为您提供两个包含当前日志的日志文件和一个包含过去 5 天每个目标的 5 个日志的存档目录。

    【讨论】:

      【解决方案2】:

      NLog 4.5 使设置归档清理变得更加容易:

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

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

      【讨论】:

      • 这里的maxArchiveFiles 是指日志文件吗?那么,我们将拥有不超过 5 个最新的日志文件?
      • @apdevelop 在上面的例子中,它将使用通配符`${DailyDir}/Error.*.txt
      【解决方案3】:
      <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>
      

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

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2014-07-02
        • 2015-04-01
        相关资源
        最近更新 更多