NLog旋转和清理日志文件 [英] NLog rotate and cleanup logfiles

查看:212
本文介绍了NLog旋转和清理日志文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我公司内,我们正在与NLog合作。我们遇到大量日志文件的问题。我们想要做的是日常存档文件,并保留最多x个文件数量。让我说7.我已经在互联网上阅读了几个主题,他们主要指向我修改我的NLog.config文件的方向。但是,它似乎并不愿意像我期望的那样旋转文件。目前,所有文件夹中都没有归档。但所有文件都以以下格式保存在logs目录中:

  Log.info.2011-11-07 .txt 

在我的应用程序中,我有一个目录'logs'。在该文件夹中,所有的日志文件都被保存。我还有一个名为archives的文件夹,其中我要归档所有旧文件。在该目录中达到最大数量的日志文件之后,它们将自动清除。这可能吗?我当前的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:\\\
log-internal.txt
internalLogLevel =Error>

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

< targets>
<! - 一旦达到1MB,将文件移动到档案。文件日期存档,最多三个文件。 ConcurrentWrites设置为false,如果多个进程将写入日志文件,
将更改为true。
< target name =filexsi:type =FilefileName =$ {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-defaultxsi:type =FilefileName =$ {basedir} /log_default.txt/>
< target name =file-debugxsi:type =FilefileName =$ {basedir} /log_debug.txt/>
< target name =file-testclassxsi:type =FilefileName =$ {basedir} /log_testclass.txt/>
< target name =mailxsi: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 =数据库
name =TestDatabaseLogging
connectionString =数据源= 123.123.123.123;初始目录= NLog_Test;用户ID = su_Nlog;密码= test123
dbDatabase =NLog_Test>
< commandText>
插入INNO_LOG([createDate],[Origin],[LogLevel],[Message],[Exception],[StackTrace])值(@createDate,@origin,@logLevel,@message,@exception,@ stackTrace)
< / commandText>
< parameter name =@ createDatelayout =$ {date}/>
< parameter name =@ originlayout =$ {callsite}/>
< parameter name =@ logLevellayout =$ {level}/>
< parameter name =@ messagelayout =$ {message}/>
< parameter name =@ exceptionlayout =$ {exception:format = Message,StackTrace}/>
< parameter name =@ stackTracelayout =$ {stacktrace}/>
< / target>

< / targets>

< rules>
< logger name =*minlevel =FatalwriteTo =mail/>
< logger name =*minlevel =ErrorwriteTo =TestDatabaseLogging/>
< logger name =*minlevel =DebugwriteTo =file-debug/>
< logger name =*minlevel =InfowriteTo =file/>
<! - 记录特定类的特定文件.-->
< logger name =_ Defaultminlevel =TracewriteTo =file-default/>
< logger name =TestClassminlevel =TracewriteTo =file-testclass/>
< / rules>
< / nlog>

编辑:
ckellers后的最终(剪切)解决方案

 < target name =file
xsi:type =文件
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 =滚动
maxArchiveFiles =3/>


解决方案

看起来问题是 shortdate 在您的文件名定义。请参阅我的答案: x天后删除日志文件



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

  fileName =$ {basedir} /logs/Log.info.txt 


Within my company we're working with NLog. We're experiencing issues with large amount of log files. What we want to do is archive files by day and keep a maximum of an x amount of files. Lets say 7. I've read several topics on the internet regarding this and they're mostly pointing me in the same direction of modifying my NLog.config file. However it doesn't seem to be willing to rotate the files as I expect it to do. Currently nothing is being archived in the desired folder. But all files are saved in the 'logs'-directory in the following format;

Log.info.2011-11-07.txt

Within my application i've got an directory 'logs'. Inside that folder all logfiles are saved. I've also got an folder called 'archives' in which I want to archive all older files. After the maximum number of log files is reached inside that directory they automatically should be cleaned. Is this possible? My current NLog.config file looks like below;

<?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>

EDIT: The final (snipped) solution after ckellers answer.

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

解决方案

It looks like the problem is the shortdate in your filename definition. See my answer at this question: Delete log files after x days

You have to define the filename without the date part

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

这篇关于NLog旋转和清理日志文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆