You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用NLog实现向MongoDB条件化存储日志

NLog条件化写入MongoDB的实现方案

1. 安装MongoDB日志依赖包

首先安装NLog的MongoDB扩展包,通过NuGet命令完成:

Install-Package NLog.Mongo
# 或使用.NET CLI
dotnet add package NLog.Mongo

2. 修改NLog配置文件(nlog.config)

新增MongoDB目标,并通过过滤规则实现条件化写入;同时保留原有File和Console的目标与规则:

<?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">

  <!-- 目标配置 -->
  <targets>
    <!-- 原有文件目标 -->
    <target name="file" xsi:type="File" fileName="logs/${shortdate}.log"
            layout="${longdate} ${level} ${message}" />
    <!-- 原有控制台目标 -->
    <target name="console" xsi:type="Console"
            layout="${longdate} ${level} ${message}" />
    <!-- 新增MongoDB目标 -->
    <target name="mongo" xsi:type="Mongo"
            connectionString="mongodb://localhost:27017"
            databaseName="LogDB"
            collectionName="Logs">
      <!-- MongoDB日志字段映射 -->
      <field name="Timestamp" layout="${longdate}" />
      <field name="Level" layout="${level}" />
      <field name="Message" layout="${message}" />
    </target>
  </targets>

  <!-- 规则配置 -->
  <rules>
    <!-- 原有规则:所有日志写入File和Console -->
    <logger name="*" minlevel="Trace" writeTo="file,console" />
    <!-- MongoDB规则:仅当自定义属性WriteToMongo为true时写入 -->
    <logger name="*" minlevel="Trace" writeTo="mongo">
      <filters>
        <when condition="${mdlc:WriteToMongo} == true" action="Log" />
        <when action="Ignore" />
      </filters>
    </logger>
  </rules>
</nlog>

3. 扩展Logger方法实现自定义调用

创建静态扩展类,给ILogger添加符合需求的重载方法:

public static class LoggerExtensions
{
    public static void Write(this ILogger logger, string message, bool isWriteToMongo)
    {
        // 用MDLC传递条件标记,确保日志事件携带过滤属性
        using (logger.PushProperty("WriteToMongo", isWriteToMongo))
        {
            // 可根据业务需求替换为Debug/Warn/Error等级别
            logger.Info(message);
        }
    }

    // 可选:支持指定日志级别的重载
    public static void Write(this ILogger logger, LogLevel level, string message, bool isWriteToMongo)
    {
        using (logger.PushProperty("WriteToMongo", isWriteToMongo))
        {
            logger.Log(level, message);
        }
    }
}

4. 调用示例

直接使用扩展方法即可,File和Console会始终输出日志,MongoDB仅在isWriteToMongo为true时写入:

var logger = LogManager.GetCurrentClassLogger();

// 这条日志会写入File、Console和MongoDB
logger.Write("需要同步到Mongo的业务日志", true);

// 这条日志仅写入File和Console,不会写入MongoDB
logger.Write("普通业务日志", false);

关键说明

  • 这里使用NLog的**MDLC(Mapped Diagnostics Context)**传递条件标记,确保过滤规则能读取到属性值。
  • 若需要更复杂的过滤逻辑,可修改<filters>中的条件表达式,比如结合日志级别、日志内容等判断。

内容的提问来源于stack exchange,提问作者Tali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:43:17