NLog 旋转和清理日志文件

Posted

技术标签:

【中文标题】NLog 旋转和清理日志文件【英文标题】:NLog rotate and cleanup logfiles 【发布时间】:2011-12-23 14:44:41 【问题描述】:

在我的公司内,我们正在使用 NLog。我们遇到大量日志文件的问题。我们要做的是按天归档文件并保留最多 x 数量的文件。让我们说 7。我已经阅读了互联网上关于此的几个主题,它们大多指向我修改我的 NLog.config 文件的相同方向。但是,它似乎不愿意像我期望的那样旋转文件。目前没有任何内容被存档在所需的文件夹中。但是所有文件都以以下格式保存在“日志”目录中;

Log.info.2011-11-07.txt

在我的应用程序中,我有一个目录“日志”。在该文件夹内保存所有日志文件。我还有一个名为“存档”的文件夹,我想在其中存档所有旧文件。在该目录中达到最大日志文件数后,应自动清除它们。这可能吗?我当前的 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"
      throwExceptions="true"
      internalLogFile="C:\nlog-internal.txt"
      internalLogLevel="Error">

  <extensions>
    <add assembly="NLog.Extended" />
  </extensions>

  <targets>
    <!-- will move file to archive once it reaches 1MB. Files are archived by day, with a maximum of three files. ConcurrentWrites is set to false, 
            change to true if multiple processes will be writing to the logfile-->
    <target name="file" xsi:type="File" fileName="$basedir/logs/Log.info.$shortdate.txt" 
            layout="$longdate $callsite $level: $message $exception:format=Message,StackTrace $stacktrace"
            archiveFileName="$basedir/logs/archives/log.info.$shortdate.txt"
            archiveAboveSize="1048576"
            archiveEvery="Day"
            archiveNumbering = "Rolling"
            maxArchiveFiles="7"
            concurrentWrites="false"
            />
    <target name="file-default" xsi:type="File" fileName="$basedir/log_default.txt"/>
    <target name="file-debug" xsi:type="File" fileName="$basedir/log_debug.txt"/>
    <target name="file-testclass" xsi:type="File" fileName="$basedir/log_testclass.txt"/>
    <target name="mail" xsi:type="Mail" 
            subject="$level - $aspnet-request:serverVariabele=PATH_INFO | $callsite:includeSourcePath=true" 
            to="someone@mail.com" 
            smtpServer="mail.server.com" 
            from="no-reply@errormail.com"/>
    <target xsi:type="Database" 
            name="TestDatabaseLogging" 
            connectionString="Data Source=123.123.123.123;Initial Catalog=NLog_Test;User ID=su_Nlog;Password=test123" 
            dbDatabase="NLog_Test">
      <commandText>
        insert into INNO_LOG ([createDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @exception, @stackTrace)
      </commandText>
      <parameter name="@createDate" layout="$date"/>
      <parameter name="@origin" layout="$callsite"/>
      <parameter name="@logLevel" layout="$level"/>
      <parameter name="@message" layout="$message"/>
      <parameter name="@exception" layout="$exception:format=Message,StackTrace"/>
      <parameter name="@stackTrace" layout="$stacktrace"/>
    </target>

  </targets>

  <rules>
    <logger name="*" minlevel="Fatal" writeTo="mail" />
    <logger name="*" minlevel="Error" writeTo="TestDatabaseLogging" />
    <logger name="*" minlevel="Debug" writeTo="file-debug" />
    <logger name="*" minlevel="Info" writeTo="file" />
    <!--Log to specific files for specific classes.-->
    <logger name="_Default" minlevel="Trace" writeTo="file-default" />
    <logger name="TestClass" minlevel="Trace" writeTo="file-testclass" />
  </rules>
</nlog>

编辑: ckellers 回答后的最终(截断)解决方案。

<target name="file"
            xsi:type="File"
            fileName="$basedir/logs/Log.$level.current.txt"
            layout="$longdate $callsite $level: $message $exception:format=Message,StackTrace $stacktrace"
            archiveFileName="$basedir/logs/archives/log.error.$shortdate.#.txt"
            archiveAboveSize="5242880"
            archiveEvery="Day"
            archiveNumbering = "Rolling"
            maxArchiveFiles="3" />

【问题讨论】:

【参考方案1】:

看起来问题出在文件名定义中的shortdate。请参阅我对这个问题的回答:Delete log files after x days

你必须定义没有日期部分的文件名

fileName="$basedir/logs/Log.info.txt

【讨论】:

做到了!我之前通过谷歌找到了这个话题,但从没想过名称中的短日期会导致问题。我在 shortdate 之后添加了 #,它起作用了!【参考方案2】:

NLog 4.5(和更高版本)改进了对动态文件名布局和归档逻辑的支持。

你可以这样做:

    <target name="file" xsi:type="File"
        fileName="$basedir/logs/Log.$level.$shortdate.txt"
        archiveAboveSize="5242880"
        maxArchiveFiles="3" />

NLog 4.7 还为 FileTarget 引入了设置 maxArchiveDays

另见https://github.com/NLog/NLog/wiki/File-target#archive-old-log-files

【讨论】:

以上是关于NLog 旋转和清理日志文件的主要内容,如果未能解决你的问题,请参考以下文章

Windows7磁盘清理中的设置日志文件能清理吗?

Kafka日志清理相关设置

如何清理Oracle11g RAC日志文件

如何清理Oracle11g RAC日志文件

2022.04.13 清理 Docker 日志

linux日志清理