我正在尝试使用Serilog将丰富的属性输出到渲染的消息中:
private static Tester GetTester()
{
return new Tester {Count = 7, Name = "Redmond"};
}
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.WithProperty("Site", "Dan Local")
.WriteTo
.ColoredConsole()
.CreateLogger();
var tester = GetTester();
Log.Verbose("{Site} - This is verbose {@tester}", tester);
Log.Verbose("This is verbose {@tester} - {Site}", tester);
Run Code Online (Sandbox Code Playgroud)
第一个日志语句输出:
2014-08-19 10:02:25 [Verbose] "SeriLogTest.Tester" - This is verbose {@tester}
Run Code Online (Sandbox Code Playgroud)
第二个日志语句输出:
2014-08-19 10:02:25 [Verbose] This is verbose Tester { Count: 7, Name: "Redmond" } - "Dan Local"
Run Code Online (Sandbox Code Playgroud)
我希望他们两者输出相同的信息,只是按照消息模板定义的不同顺序.但是正如您所看到的,如果您没有将最丰富的属性放在最后,它将被提供的对象接管以进行记录,并忽略第二个模板属性.有没有办法做到这一点?
在 Serilog 中,当属性值为空时是否可以忽略属性?
我尝试添加 DataMember 属性,但这些属性似乎被忽略:
[DataMember(EmitDefaultValue = false)]
public string Title { get; set; }
Run Code Online (Sandbox Code Playgroud)
进一步研究源代码,我注意到有一个AttributedDestructuringPolicy但这似乎控制渲染属性值而不是省略属性。
我正在使用Microsoft.Extensions.Logging.ILogger抽象,它提供BeginScope函数,该函数将分层信息预先添加到创建和处理作用域之间的任何日志中.
ms的默认控制台提供程序运行良好,范围很有用.我希望我的Serilog RollingFile接收器也包含这些信息.
配置代码:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Is(LogEventLevel.Debug)
.Enrich.WithThreadId()
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.WriteTo.RollingFile(pathFormat: "/opt/iqdata/logs/log-{Date}.txt", restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, retainedFileCountLimit:30, flushToDiskInterval:TimeSpan.FromSeconds(15), shared:true)
.Enrich.WithProperty("process", "Worker")
.CreateLogger();
var loggerFactory = new LoggerFactory().AddSerilog(Log.Logger).AddConsole(includeScopes: true, minLevel: LogLevel.Debug);
IConfigurationRoot config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(path: "AppSettings.json", optional: false, reloadOnChange: true).Build();
provider = new ServiceCollection()
.AddOptions()
.AddSingleton(loggerFactory)
.BuildServiceProvider();
logger = provider.GetService<ILoggerFactory>().CreateLogger("Worker.Program");
logger.LogDebug("Current directory:{CurrentDirectory}", Directory.GetCurrentDirectory());
Run Code Online (Sandbox Code Playgroud)
那么我需要做什么才能将范围信息写入文件?另外作为奖励我该如何在RollingFile接收器中包含像ProcessName这样的丰富值?
有没有一种方法可以动态更改某些事件的日志级别?(也许按名称空间或谓词)
我正在寻找类似的东西,.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)但我真正想做的就是将Information事件的级别从Microsoft命名空间更改为Verbose。重要性较高的事件应保持原样。
编辑:
我在Linux上运行ASP.NET Core应用程序时遇到了启用日志记录的问题.我正在使用Serilog.Sinks.File(但也尝试使用RollingFile),并在appsettings中定义了以下配置:
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": { "path": "core_log.log", "rollingInterval": "Day" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "CORE service"
} }
Run Code Online (Sandbox Code Playgroud)
我也尝试使用pathFormat使用RollingFile接收器,但没有成功.我尝试过什么,应用程序不创建日志文件.
我还尝试了多种路径变体,例如:/var/test/app/core_log.log或者只是core_log.log,但我没有在任何地方看到文件.我尝试使用以下方法搜索:
sudo find / -name '*.log' -print | grep core_log
Run Code Online (Sandbox Code Playgroud)
值得一提的是,在Windows上运行相同的应用程序时,一切运行良好,我可以看到创建的日志文件.
有没有人在Linux上与Serilog有类似的问题?它可以是与特权相关的东西吗?
我正在尝试确定是否可以在appsettings.jsonASP.Net Core 2 项目的文件中配置 serilog 接收器 mssqlserver 的列选项。
我在文件中创建并配置记录器Program.cs。
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
//.Enrich.WithProperty("AppName", "One Badass App") // Adds property to XML structure in properties column
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("Starting web host");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1; …Run Code Online (Sandbox Code Playgroud) 我希望能够使用我的日志通过Hangfires context.console发出事件,这样我就不需要使用context.writeline将日志事件输出到我的hangfire仪表板.
我试图为此目的实施一个特定的serilog水槽.但是由于我需要来自hangfire的PerformContext(在运行时注入任务方法),我无法在应用程序启动时配置日志接收器.我试图在任务方法中创建一个新的记录器,只是为了查看接收器是否真的有效,但它没有 - 任何人都可以看到它为什么不起作用,或者可能建议采用不同的方法?
这是水槽:
class HangfireContextSink : ILogEventSink {
private readonly IFormatProvider formatProvider;
private readonly PerformContext context;
public HangfireContextSink(IFormatProvider formatProvider, PerformContext context) {
this.formatProvider = formatProvider;
this.context = context;
}
public void Emit(LogEvent logEvent) {
var message = logEvent.RenderMessage(formatProvider);
context.WriteLine(ConsoleTextColor.Blue, DateTimeOffset.Now.ToString() + " " + message);
}
Run Code Online (Sandbox Code Playgroud)
接收器配置:
public static class SinkExtensions {
public static LoggerConfiguration HangfireContextSink(this LoggerSinkConfiguration loggerSinkConfiguration, PerformContext context, IFormatProvider formatProvider = null) {
return loggerSinkConfiguration.Sink(new HangfireContextSink(formatProvider, context));
}
}
Run Code Online (Sandbox Code Playgroud)
任务方法:
public static bool TestJob(PerformContext context) …Run Code Online (Sandbox Code Playgroud) 虽然我有一个通用记录器来记录错误,异常等情况,但这些记录器使用滚动文件接收器将内容记录到my- {date} .log中。
但是,我需要另一个实例来对audit- {date} .log进行审计,并需要另一个实例来将perf信息写入perf- {date} .log。
如何使用不同的配置或接收器创建serilog的多个实例?
如果我使用新引入的InProcess托管模型ASP.NET Core 2.2如下:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
Serilog不写日志到文件.但是,如果我<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>从.csproj一切中删除按预期工作.
我Serilog在Program课堂上的配置如下:
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information() // Set the minimun log level
.WriteTo.File("Logs\\log-.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7) // this is for logging into file system
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static …Run Code Online (Sandbox Code Playgroud) 我正在编写使用Serilog的Web服务。我在使文件写出来时遇到问题(但控制台日志记录有效)。我注意到,基于此以及此页面的说明,.net core 2.0发行时,设置发生了变化。
但是,现在,我看不到任何日志记录(也许过去默认的M $记录器实际上就是我所看到的)。
以下是如何program.cs设置:
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.AddUserSecrets<Startup>()
.Build();
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration.GetSection("Serilog"))
.CreateLogger();
try
{
Log.Information("Starting webhost...");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static …Run Code Online (Sandbox Code Playgroud) serilog ×10
c# ×7
logging ×5
.net ×4
asp.net-core ×3
.net-core ×2
appsettings ×1
hangfire ×1
linux ×1