首页 > 解决方案 > NLog 在数据库中旋转和清理日志文件

问题描述

我有用于 nlog 日志记录的数据库目标,现在我想在数据库中轮换和清理旧记录。有没有内置的方法可以做到这一点?我的配置现在看起来像:

<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="true">

  <variable name="logBase" value="${basedir}\logs" />
  <variable name="serverAPI" value="-serverAPI" />

  <add assembly="NLog.Web.AspNetCore"/>
  <add assembly="NLog.Appsettings.Standard"/>

  <targets>
    <target xsi:type="AsyncWrapper" timeToSleepBetweenBatches="0" optimizeBufferReuse="true"
            overflowAction="Grow"
            name="serverAPI">
      <target
        xsi:type="File"
        layout="[${time}] ${message}${onexception:${newline}EXCEPTION\:${exception:format=tostring}${newline}}"
        createDirs="true"
        fileName="${logBase}/${shortdate}/${serverAPI}.txt"
        archiveFileName="${logBase}/${shortdate}/${serverAPI}.{#####}.txt"
        archiveAboveSize="8388608"
        archiveNumbering="Rolling"
        maxArchiveFiles="86400"
        concurrentWrites="true"
        keepFileOpen="false"
        encoding="utf-8"
      />
    </target>    
    <target xsi:type="Database"
            name="database"
            dbProvider="Npgsql.NpgsqlConnection, Npgsql"
            connectionString="${gdc:item=DefaultConnection}"
            commandText="INSERT INTO log_entries(Date, Exception, Level, Logger, Message, Stacktrace, Thread) VALUES (@Date, @Exception, @Level, @Logger, @Message, @Stacktrace, @Thread);">
      />
      <parameter name="@Date" layout="${longdate}" />
      <parameter name="@Exception" layout="${exception}" />
      <parameter name="@Level" layout="${level}" />
      <parameter name="@Logger" layout="${logger}" />
      <parameter name="@Message" layout="${message}" />
      <parameter name="@Stacktrace" layout="${stacktrace}" />
      <parameter name="@Thread" layout="${threadid}" />
      />
    </target>
  </targets>

  <rules>
    <logger name="serverAPI" writeTo="serverAPI" minlevel="Trace" />
    <logger name="*" minlevel="Info" writeTo="database" />
  </rules>
</nlog>

我知道,通过在 DB 写工作可以实现我的目标,但这不是最理想的方式。

标签: c#databasenlog

解决方案


NLog 中没有对此的支持,也没有计划。

我建议为此创建一个 Windows 服务或 SQL 作业。


推荐阅读