首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用自定义属性的Serilog过滤器水槽

使用自定义属性的Serilog过滤器水槽
EN

Stack Overflow用户
提问于 2022-03-23 05:07:47
回答 1查看 916关注 0票数 2

我想使用Serilog.Expressions来过滤特定接收器的日志记录。在这种情况下,如果我的自定义属性MethodName等于"SomeOtherTask“,我只想登录到控制台Sink。Serilog仍在为DoSomeWorkSomeOtherTask登录到Sinks。我的过滤器表达式有什么问题吗?或者我是如何实现我的自定义属性MethodName或其他什么的?

appsettings.json:

代码语言:javascript
运行
复制
{
    "Serilog": {
        "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Expressions" ],
        "MinimumLevel": "Debug",
        "WriteTo": [
            {
                "Name": "Console",
                "Filter": [
                    {
                        "Name": "ByIncludingOnly",
                        "Args": {
                            "expression": "MethodName = 'SomeOtherTask'"
                        }
                    }
                ]
            },
            {
                "Name": "File",
                "Args": {
                    "path": "Logs/log.txt"
                }
            }
        ],
        "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
        "Properties": {
            "Application": "SerilogSplitLogTest"
        }
    }
}

Program.cs:

代码语言:javascript
运行
复制
internal class Program
{
    static void Main()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", true, true);
        
        var config = builder.Build();

        var logger = new LoggerConfiguration()
            .ReadFrom.Configuration(config)
            .CreateLogger();

        new Program().Run(logger);

        Console.ReadKey(true);
    }

    public void Run(ILogger logger)
    {
        DoSomeWork(logger);
        SomeOtherTask(logger);
    }

    public void DoSomeWork(ILogger logger)
    {
        logger.Information("This should log to File");
    }

    public void SomeOtherTask(ILogger logger)
    {
        using (LogContext.PushProperty("MethodName", nameof(SomeOtherTask)))
        {
            logger.Information("This should log to Console");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-27 10:53:45

我有类似的问题,写到两个文件,一个是拥有所有的日志,而在那里,其他是由一个属性过滤,所以它是一种压缩日志。我就是这么做的。

首先,确保安装Serilog.Expressions。单独这样做可能会解决您的问题,如果没有,下面是我使用的配置的WriteTo部分。

注意:Marker是我正在筛选的自定义属性。

代码语言:javascript
运行
复制
"WriteTo": [
  {
    "Name": "Logger",
    "Args": {
      "configureLogger": {
        "Filter": [
          {
            "Name": "ByIncludingOnly",
            "Args": {
              "expression": "Marker is not null"
            }
          }
        ],
        "WriteTo": [
          {
            "Name": "File",
            "Args": {
              "path": "D:\\Temp\\SerilogTesting.txt",
              "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}",
              "rollingInterval": "Day",
              "retainedFileCountLimit": 7,
              "shared": true
            }
          }
        ]
      }
    }
  },
  {
    "Name": "File",
    "Args": {
      "path": "D:\\Temp\\SerilogTesting.log",
      "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}",
      "rollingInterval": "Day",
      "retainedFileCountLimit": 7,
      "shared": true
    }
  },
  {
    "Name": "Console",
    "Args": {
      "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
      "outputTemplate": "[{Marker}][{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}"
    }
  }
]

然后我的财产就这样被推下去了

代码语言:javascript
运行
复制
_logger.ForContext("Marker","LW").Information("Something to log");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71582077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档