Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NLog rotate and cleanup logfiles

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" />
like image 359
Rob Avatar asked Nov 07 '11 12:11

Rob


2 Answers

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
like image 183
ccellar Avatar answered Oct 18 '22 18:10

ccellar


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

like image 22
Rolf Kristensen Avatar answered Oct 18 '22 19:10

Rolf Kristensen