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
我在我的 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