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。
我错过了什么?
在 .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) 我能找到的关于在 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) 我是编程新手,我正在尝试为 .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) 将 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) 我有一个面向 .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.OptionsFactory1[[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:在类型 …
我有一个基于 .net core 3.1 的 Web API。
我使用 SeriLog 库作为记录器。
这是我的 SeriLog 配置。Serilog 已从“appsettings.json”配置。
如果存在,我需要将“请求正文”参数添加到日志的输出中。有什么办法可以配置这个。另外,我分享了我的日志输出。
我正在使用 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 格式化程序:
我怎样才能将它们都包含在输出中?
任何援助将不胜感激
如何使用来自 的接口来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 特定的并且它不是通用的。
我正在使用 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 环境中初始化切换器的方式不正确,但我不确定如何正确执行(即创建一个服务,然后立即在记录器的后续配置中使用它),但是即使这是不正确的,实际的最低级别甚至没有按照配置设置为“错误”。