标签: serilog

使用Serilog时如何在输出消息中获得丰富的属性

我正在尝试使用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)

我希望他们两者输出相同的信息,只是按照消息模板定义的不同顺序.但是正如您所看到的,如果您没有将最丰富的属性放在最后,它将被提供的对象接管以进行记录,并忽略第二个模板属性.有没有办法做到这一点?

.net c# logging serilog

6
推荐指数
2
解决办法
5438
查看次数

在 Serilog 中解构时忽略空值

在 Serilog 中,当属性值为空时是否可以忽略属性?

我尝试添加 DataMember 属性,但这些属性似乎被忽略:

[DataMember(EmitDefaultValue = false)]
public string Title { get; set; }
Run Code Online (Sandbox Code Playgroud)

进一步研究源代码,我注意到有一个AttributedDestructuringPolicy但这似乎控制渲染属性值而不是省略属性。

.net c# logging serilog

6
推荐指数
1
解决办法
1265
查看次数

dotnetcore控制台上的Microsoft.Extensions.Logging和Serilog.在RollingFile接收器中包含范围信息

我正在使用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这样的丰富值?

c# logging serilog .net-core

6
推荐指数
1
解决办法
4372
查看次数

在Serilog中更改/覆盖日志事件级别

有没有一种方法可以动态更改某些事件的日志级别?(也许按名称空间或谓词)

我正在寻找类似的东西,.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)但我真正想做的就是将Information事件的级别从Microsoft命名空间更改为Verbose。重要性较高的事件应保持原样。

编辑:

扩展程序无法更改日志事件级别。 在此处输入图片说明

.net c# serilog

6
推荐指数
1
解决办法
1387
查看次数

Serilog在Linux上运行时不创建日志文件

我在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有类似的问题?它可以是与特权相关的东西吗?

linux serilog asp.net-core

6
推荐指数
1
解决办法
1509
查看次数

在 AppSettings.json 中配置 Serilog 接收器 MsSqlServer 的列选项

我正在尝试确定是否可以在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)

appsettings serilog asp.net-core-2.0

6
推荐指数
1
解决办法
8462
查看次数

Serilog输出到hangfire上下文控制台

我希望能够使用我的日志通过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)

.net serilog hangfire

6
推荐指数
1
解决办法
902
查看次数

serilog每个功能多个实例

虽然我有一个通用记录器来记录错误,异常等情况,但这些记录器使用滚动文件接收器将内容记录到my- {date} .log中。

但是,我需要另一个实例来对audit- {date} .log进行审计,并需要另一个实例来将perf信息写入perf- {date} .log。

如何使用不同的配置或接收器创建serilog的多个实例?

c# logging serilog asp.net-core

6
推荐指数
1
解决办法
866
查看次数

在ASP.NET Core 2.2中使用InProcess托管模型时,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一切中删除按预期工作.

SerilogProgram课堂上的配置如下:

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)

c# serilog asp.net-core asp.net-core-2.2

6
推荐指数
1
解决办法
1712
查看次数

Serilog未写入文件(.net core 2.2)

我正在编写使用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)

c# logging serilog .net-core

6
推荐指数
2
解决办法
4355
查看次数