如何使用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
相关产品推荐
相关产品推荐

