首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NLog循环和清理日志文件

NLog循环和清理日志文件
EN

Stack Overflow用户
提问于 2011-11-07 20:43:11
回答 2查看 24.5K关注 0票数 34

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

代码语言:javascript
复制
Log.info.2011-11-07.txt

在我的应用程序中,我有一个'logs‘目录。在该文件夹中保存所有日志文件。我还有一个名为“archives”的文件夹,我想在其中存档所有较旧的文件。在达到该目录中日志文件的最大数量后,应自动清除这些文件。这个是可能的吗?我当前的NLog.config文件如下所示;

代码语言:javascript
复制
<?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回答之后,最终(截取的)解决方案。

代码语言:javascript
复制
<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" />
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-07 21:42:06

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

您必须定义不带日期部分的文件名

代码语言:javascript
复制
fileName="${basedir}/logs/Log.info.txt
票数 19
EN

Stack Overflow用户

发布于 2020-04-01 19:04:34

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

您可以这样做:

代码语言:javascript
复制
    <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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8036681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档