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="[email protected]"
smtpServer="mail.server.com"
from="[email protected]"/>
<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 4.5 (and newer) improves the support for dynamic fileName-Layout and archive-logic.
You can do this:
<target name="file" xsi:type="File"
fileName="${basedir}/logs/Log.${level}.${shortdate}.txt"
archiveAboveSize="5242880"
maxArchiveFiles="3" />
NLog 4.7 also introduces the setting maxArchiveDays
for the FileTarget.
See also https://github.com/NLog/NLog/wiki/File-target#archive-old-log-files
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With