标签: serilog

Serilog 不使用 .NET Core 2.2 写入文件

PS 下面的代码工作正常。问题出在显示器和椅子之间。@jpgrassi 的回答让我朝着正确的方向解决了这个问题。

我在 program.cs 中有以下内容:

public class Program {
    public static void Main(string[] args) {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
            .UseStartup<Startup>();

}
Run Code Online (Sandbox Code Playgroud)

在 appsettings.json 中:

{
  "Serilog": {

    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Information",
        "System": "Information"
      }
    },

    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "log-{Date}.txt",
        }
      }
    ]
  },

  "AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)

在控制器中,我写了一个日志_logger.LogWarning("foo");,但文件没有在任何地方写出,我看不到任何错误。

我从 Nuget 导入了以下包:Serilog、Serilog.AspNetCore、Serilog.Settings.Configuration、Serilog.Sinks.RollingFile。

我错过了什么?

c# serilog asp.net-core

7
推荐指数
1
解决办法
8086
查看次数

如何在不添加其他上下文属性的情况下将自定义属性推送到 Serilog 的 LogContext?

在 .Net Core 2.2 API 中,我尝试使用 Serilog 记录到 SQL Server,以利用其结构化日志记录功能。除了标准字段(Id、Timestamp、Level、Message、MessageTemplate、LogEvent)之外,我还需要在每个日志条目中捕获用户名和 IP 地址。我看过这篇文章,但我想在一个地方做这件事,这样开发人员就不必在每个日志语句中手动添加它。我的Startup.csctor 中有以下代码段:

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .Enrich.FromLogContext()
            .Enrich.With<SerilogContextEnricher>()
            .CreateLogger();
    }
Run Code Online (Sandbox Code Playgroud)

.Enrich.FromLogContext()调用使静态 LogContext 可供我在自定义中间件中添加自定义属性(用户名和 IP 地址),如下所示:

    public class SerilogMiddleware
    {
        private static readonly ILogger Log = Serilog.Log.ForContext<SerilogMiddleware>();
        private readonly RequestDelegate _next;

        public SerilogMiddleware(RequestDelegate next)
        {
            this._next = next ?? throw new ArgumentNullException(nameof(next));
        }

        public async Task Invoke(HttpContext httpContext)
        {
            if (httpContext == null) throw new ArgumentNullException(nameof(httpContext)); …
Run Code Online (Sandbox Code Playgroud)

serilog asp.net-core-webapi

7
推荐指数
1
解决办法
7238
查看次数

在 ASP .NET Core Web API 控制器中注入 Serilog 的 ILogger 接口

我能找到的关于在 ASP .NET Core Web 应用程序ILogger<T>中使用 Serilog 的所有示例都使用 Microsoft 的界面,而不是使用 Serilog 的ILogger界面。

我如何才能使 Serilog 的 ILogger 可以通过构造函数注入?

using Serilog;

public class HomeController : Controller
{
    ILogger logger;

    public HomeController(ILogger logger)
    {
        this.logger = logger;
    }

    public IActionResult Index()
    {
        this.logger.Information("Index was called");
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection serilog asp.net-core

7
推荐指数
2
解决办法
6408
查看次数

无法解析“Serilog.ILogger”类型的服务:“AspNetCore.Serilog.RequestLoggingMiddleware”

我是编程新手,我正在尝试为 .net 核心项目实现日志记录解决方案。

我想收集默认和 Microsoft 类别日志。

APPSETTING.JSON

      {
          "Serilog": {
              "MinimumLevel": {
                  "Default": "Information",
                  "System": "Warning",
                  "Microsoft": "Information"
              },
              "File": {
                  "location": "logs/timeapi.log"
              }
          },
          "EnableSwagger": true
      }
Run Code Online (Sandbox Code Playgroud)

程序.CS

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseSerilogRequestLogging();
Run Code Online (Sandbox Code Playgroud)

启动文件

app.UseSerilogRequestLogging(options =>
            options.RequestProjection =
            r => new { r.IsHttps, QueryString = r.QueryString.Value });
        app.UseMvc();
Run Code Online (Sandbox Code Playgroud)
https://github.com/mthamil/AspNetCore.Serilog.RequestLoggingMiddleware
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

Unable to resolve service for type 'Serilog.ILogger' while attempting to activate 'AspNetCore.Serilog.RequestLoggingMiddleware.SerilogRequestMiddleware'.
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
1
解决办法
3210
查看次数

serilog 异步接收器不会在关机时将缓冲区刷新到磁盘

将 serilog 异步接收器与文件接收器(并且缓冲 = 真)一起使用时,日志条目在关闭时会丢失。我猜这是缓冲区没有刷新到磁盘,即使它被调用。我不确定为什么会发生这种情况,但我很确定这是异步接收器。如果我从配置中删除它并单独使用文件接收器,日志会按预期刷新到磁盘。

我有一个相当简单的设置。

程序.cs:

 public class Program
{
    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 void Main(string[] args)
    {

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

        try
        {
            Log.Information("Starting the web host");

            CreateWebHostBuilder(args).Build().Run();

            Log.Information("Shutting down the web host");

        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");

        }
        finally
        {
            Log.Information("Closing Log");

            Log.CloseAndFlush();
        }



    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) …
Run Code Online (Sandbox Code Playgroud)

c# serilog asp.net-core

7
推荐指数
1
解决办法
2639
查看次数

Serilog、Microsoft.Extensions.Logging 和 Autofac

我有一个面向 .Net Framework 4.6.1 的 Asp Net Core API。在这个项目中,我将 Serilog 与 Microsoft.Extensions.Logging 以及 Auofac 用于 DI。在控制器构造函数中使用带有 DI 的 ILogger< T> 记录器完美地工作,我也得到了日志。

当在 API 中我需要使用另一个项目 use Microsoft.Extensions.Logging 和 Autofac 并期望在某些构造函数中接收 ILogger< T> 时,乐趣就开始了。我在两个项目中都安装了相同版本的 Microsoft.Extensions.Logging。

我得到了以下例外情况:

Autofac.Core.DependencyResolutionException: '激活 Microsoft.Extensions.Logging.Logger 1[[Microsoft.AspNetCore.Hosting.Internal.WebHost, Microsoft.AspNetCore.Hosting, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] -> Microsoft.Extensions.Logging.LoggerFactory -> ?:Microsoft.Extensions.Logging.ILoggerProvider[] -> Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider -> Microsoft.Extensions.Options.OptionsMonitor1时抛出异常[[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions, Microsoft.Extensions.Logging.Console, Version=2.2.0.0, Culture=neutral , PublicKeyToken=adb9793829ddae60]] -> Microsoft.Extensions.Options.OptionsFactory 1[[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions, Microsoft.Extensions.Logging.Console, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] -> ?:Microsoft.Extensions.Options.IConfigureOptions1[[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions, Microsoft.Extensions.Logging.Console, Version=2.2.0.0, Culture=neutral, PublicKey9Token=adb97ae] ][] -> Microsoft.Extensions.Logging.Console.ConsoleLoggerOptionsSetup -> Microsoft.Extensions.Logging.Configuration.LoggerProviderConfiguration`1[[Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider, Microsoft.Extensions.Logging.Console, Version=2.2 .0.0,文化=中性,PublicKeyToken=adb9793829ddae60]]。'

内部异常 1:DependencyResolutionException:在类型 …

c# serilog asp.net-core

7
推荐指数
1
解决办法
4129
查看次数

如何在 serilog 的输出 .net 核心中添加“请求正文”?

我有一个基于 .net core 3.1 的 Web API。

我使用 SeriLog 库作为记录器。

这是我的 SeriLog 配置。Serilog 已从“appsettings.json”配置。

在此处输入图片说明

如果存在,我需要将“请求正文”参数添加到日志的输出中。有什么办法可以配置这个。另外,我分享了我的日志输出。

在此处输入图片说明

c# serilog asp.net-core

7
推荐指数
4
解决办法
5077
查看次数

如何在 Serilog JsonFormatter 输出中包含“Message”和“MessageTemplate”?

我正在使用 Serlog 2.10,写入控制台(作为人类可读的文本),并使用 JsonFormatter 写入 RollingFile。

我希望在输出 JSON 中同时具有:“Message”和“MessageTemplate”节点,

但是,我只收到“Message”或“MessageTemplate”,但不是两者都收到。

下面是它的配置方式:

Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Console()
                .WriteTo.RollingFile(new JsonFormatter(), "logs/log-{Date}.log")
                .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我按照此页面上的说明进行操作: https ://github.com/serilog/serilog-formatting-compact

我已经尝试了所有 3 个 Json 格式化程序:

  • “RenderedCompactJsonFormatter” - 将“@m”(消息)放入输出中
  • “CompactJsonFormatter” - 将“@mt”(MessageTemlate)放入输出中
  • “JsonFormatter” - 将“MessageTemplate”放入输出中

我怎样才能将它们都包含在输出中?

任何援助将不胜感激

.net c# logging serilog

7
推荐指数
1
解决办法
3250
查看次数

.Net Core 3.1 - 使用 Microsoft Ilogger 接口为 Serilog 设置 ForContext

如何使用来自 的接口来ForContext使用 Serilog 记录器的方法?ILoggerMicrosoft.Extensions.Logging

这是代码:

private readonly ILogger<UserService> _logger;

//DI code here

....

//inside some method
_logger.ForContext("CorrelationId", correlationId); // Ilogger doesn't contain ForContext extension method 

_logger.LogInformation("message");
Run Code Online (Sandbox Code Playgroud)

我真的不想使用ILoggerSerilog 的接口,因为我不希望它是 Serilog 特定的并且它不是通用的。

c# logging serilog asp.net-core

7
推荐指数
1
解决办法
3394
查看次数

通过 API 端点的 Serilog 级别切换器

我正在使用 Serilog 登录我的 .net 6 Web API,并希望公开一个端点以使我能够更改全局日志记录级别。这将使我能够通过前端切换开关切换级别。这是我到目前为止所实施的,但似乎根本没有任何效果。即使只是在启动时设置日志记录级别也不会改变“信息”的默认级别。我正在使用 .net DI 来配置一切。

这是我到目前为止所拥有的:

程序.cs

var levelSwitcher = new LoggingLevelSwitch(LogEventLevel.Verbose);

builder.Services.AddSingleton<LoggingLevelSwitch>(levelSwitcher);

var seriLogger = new LoggerConfiguration()
            .MinimumLevel.ControlledBy(levelSwitcher)
            .ReadFrom.Configuration(builder.Configuration)
            .Enrich.FromLogContext()
            .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

然后在我的端点控制器中

    private readonly LoggingLevelSwitch _levelSwitch;
    private readonly ILogger<DiagnosticsController> _logger;

    public DiagnosticsController(ILogger<DiagnosticsController> logger, LoggingLevelSwitch levelSwitch)
    {
        _logger = logger;
        _levelSwitch = levelSwitch;
    }

    [HttpGet(Name = "SwitchLoggingLevel")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public IActionResult SwitchLoggingLevel(string level)
    {
        if (Enum.TryParse(level, out Serilog.Events.LogEventLevel newLoggingLevel))
        {
            _levelSwitch.MinimumLevel = newLoggingLevel;
            return Ok();
        }

        return BadRequest();
    }
Run Code Online (Sandbox Code Playgroud)

从我在调试器中看到的是,记录器仍然处于“信息”最低级别,即使调用端点并传入或多或少的详细级别,也没有任何效果。

我最初的想法是,我在 DI 环境中初始化切换器的方式不正确,但我不确定如何正确执行(即创建一个服务,然后立即在记录器的后续配置中使用它),但是即使这是不正确的,实际的最低级别甚至没有按照配置设置为“错误”。

c# serilog .net-6.0

7
推荐指数
1
解决办法
601
查看次数