Serilog Filter.ByIncludingOnly 命名空间不工作

Serilog Filter.ByIncludingOnly not working namspace

我在我的 dotnet 4.8 中使用 serilog (2.8) application.Please 查看有助于初始化 serilog 的代码。

    var isxyz = Matching.FromSource("xyz.Dispose");
    Log.Logger = new LoggerConfiguration()
    .Enrich.WithProperty("ServiceName", servicename)
    .Enrich.FromLogContext()
    .MinimumLevel.Debug()
    .Filter.ByIncludingOnly(i=> isxyz(i))
    .WriteTo.Console()

    .WriteTo.File(AppDomain.CurrentDomain.BaseDirectory + "Logs" + "\" + "log-.txt", rollingInterval: RollingInterval.Day, outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {ServiceName} {CountryCode} {Message:lj}{NewLine}{Exception}")
    .CreateLogger();

这里我只包括命名空间 xyz.Dispose。所以在控制台和文件接收器中,我应该只从命名空间 xyz.Dispose.

获取日志

但是在配置上述设置后,控制台或文件中没有打印任何日志。

您的过滤器匹配每条日志消息的 SourceContext 属性,因此如果没有日志消息被写入日志,要么是您 不是 在写入之前在记录器中设置 SourceContext 属性( 最有可能 )或者 SourceContext 你正在设置的东西与 xyz.Dispose 不同,后者会导致您的过滤器将消息排除在外。

设置SourceContext的方法有很多种,但一个简单的例子是:

var logger = Log.Logger.ForContext(Constants.SourceContextPropertyName, "xyz.Dispose");
logger.Information("This should appear in the log");

填充 SourceContext 属性 的一种常见方法是在 classes 中使用通用方法 ForContext<T>。例如:

using Serilog;

namespace xyz.Dispose
{
    public class MyService
    {
        private readonly ILogger _log = Log.ForContext<MyService>();

        public void DoStuff()
        {
            _log.Information("This should appear in the log");

            // ...
        }
    }
}

在上面的示例中,SourceContext 将自动填充 class (xyz.Dispose.MyService) 的全名,由于命名空间,它与您的过滤器匹配。


与您的问题无关:xyz.Dispose 似乎不是命名空间的好名称... Dispose 在任何 .NET 代码库中都是如此常见的方法,可能会引起混淆。也许使用描述一组事物的东西?例如 Disposables