NLog旋转和清理日志文件 [英] NLog rotate and cleanup logfiles
问题描述
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屋!