如何以这样的方式配置NLog:它会记录到数据库表(在我的情况下是SQL Server)并在一段时间后清除行?
我正在使用N {database target。 file 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>
答案 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写入数据库时我都不想运行它。我知道这不是每封邮件,但可以在交通流量缓慢的时间安排工作。