限制NLog数据库目标大小

时间:2014-09-23 19:29:44

标签: sql-server logging nlog

如何以这样的方式配置NLog:它会记录到数据库表(在我的情况下是SQL Server)并在一段时间后清除行?

我正在使用N {database targetfile target有多个翻转选项,最终删除日志文件(例如按日期/时间,大小等)。我希望能够在NLog中使用类似的东西。

以下NLog文件目标配置允许我将日志设置为保留一段时间然后完全过期。

<targets async="true">
    <target xsi:type="File"
        name="TraceFile"
        layout="${longdate} - ${level:uppercase=true} - ${callsite:className=true:fileName=true:includeSourcePath=true
          :methodName=true}: ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"
        fileName="${logFolder}\${appName}\Trace\Trace.log"
        archiveFileName="${logFolder}\${appName}\Trace\Trace_${shortdate}.log"
        archiveNumbering="Sequence"
        archiveEvery="Day"
        maxArchiveFiles="5"
            />
    <target xsi:type="File"
        name="DebugFile"
        layout="${longdate} - ${level:uppercase=true} - ${callsite:className=true:fileName=true:includeSourcePath=true
          :methodName=true}: ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"
        fileName="${logFolder}\${appName}\Debug\Debug.log"
        archiveFileName="${logFolder}\${appName}\Debug\Debug_${shortdate}.log"
        archiveNumbering="Sequence"
        archiveEvery="Day"
        maxArchiveFiles="10"
            />
</targets>

2 个答案:

答案 0 :(得分:4)

简单的答案是否定的.NLog没有自动清理数据库目标的参数,就像文件目标一样。但是,要实现这一目标,你可以......

您可以修改NLog.Config文件CommandText

<target name="database" xsi:type="Database" connectionStringName="nlog">
     <commandText>
        insert into myLogTable (LogDateColumn, LogMessageColumn) values (GETDATE(), @message);
        delete from myLogTable where LogDateColumn <= DATEADD(DAY, -7, GETDATE());
     </commandText>
     <parameter name="@message" layout="${message}"/>
</target>

不可否认,这是一个基本的例子,但是你可能会对SQL更加复杂。而且,诚然,这可能有点轻微......每次插入都要删除。

您可以每晚使用正常的预定SQL作业运行delete语句等。

提供替代品。

希望这有帮助。

答案 1 :(得分:1)

我最终创建了一个sql server作业来完成这项工作。我将下面的sql添加到第一步也是唯一一步。此脚本确实假定表的名称为Log

DECLARE @DaysToKeepTrace INT
DECLARE @DaysToKeepDebug INT
DECLARE @DaysToKeepInfo INT
DECLARE @DaysToKeepWarn INT
DECLARE @MonthsToKeepError INT
DECLARE @Now DATETIME

SET @DaysToKeepTrace = 5
SET @DaysToKeepDebug = 10
SET @DaysToKeepInfo = 15
SET @DaysToKeepWarn = 30
SET @MonthsToKeepError = 6
SET @Now = GETDATE()

DELETE FROM [dbo].[Log]
WHERE 
    [Level] = 'Trace'
    AND
    DATEDIFF(DAY, time_stamp, @Now) > @DaysToKeepTrace

DELETE FROM [dbo].[Log]
WHERE 
    [Level] = 'Debug'
    AND
    DATEDIFF(DAY, time_stamp, @Now) > @DaysToKeepDebug

DELETE FROM [dbo].[Log]
WHERE 
    [Level] = 'Info'
    AND
    DATEDIFF(DAY, time_stamp, @Now) > @DaysToKeepInfo

DELETE FROM [dbo].[Log]
WHERE 
    [Level] = 'Warn'
    AND
    DATEDIFF(DAY, time_stamp, @Now) > @DaysToKeepWarn

DELETE FROM [dbo].[Log]
WHERE 
    ([Level] = 'Error' OR [Level] = 'Fatal' )
    AND
    DATEDIFF(MONTH, time_stamp, @Now) > @MonthsToKeepError

交错的方法允许您保留更严重的日志消息以供审查和理想的修复。

每次NLog写入数据库时​​我都不想运行它。我知道这不是每封邮件,但可以在交通流量缓慢的时间安排工作。