c# - 如何强制 Serilog 仅记录我的自定义日志消息
问题描述
我将 Serilog in 配置为通过我的应用程序中的 tcpappsettings.json
将条目记录到Logstashasp net core web api
,方法如下:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Network" ],
"MinimumLevel": {
"Default": "Information"
},
"WriteTo:0": {
"Name": "TCPSink",
"Args": {
"uri": "tcp://172.26.48.39:5066"
}
},
"Properties": {
"app_id": "my-service-api",
"index": "my-app-"
}
},
...
}
但它记录了太多消息。例如,我在 Token 控制器中有一个 CreateToken 操作方法:
[HttpPost]
public ActionResult<string> CreateToken([FromBody] CredentialsModel credentials)
{
var user = _authentication.Authenticate(credentials);
if (user == null)
{
Log.Warning("Unable to authenticate an user: {Login}, {Password}",
credentials.Username, credentials.Password);
return Unauthorized();
}
return BuildToken();
}
我只需要记录一条消息:
无法验证用户登录密码
但 Serilog 记录以下内容:
请求启动 HTTP/1.1 POST http://localhost:5000/api/token application/json 57
与“{action = \"CreateToken\", controller = \"Token\"}" 匹配的路由。执行动作“Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)”
使用参数([“Deal.BL.Models.Auth.CredentialsModel”])执行操作方法“Deal.WebApi.Controllers.TokenController.CreateToken(Deal.WebApi)” - 验证状态:有效
无法验证用户:登录密码
执行动作方法“Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)”,在 11.0935ms 内返回结果“Microsoft.AspNetCore.Mvc.UnauthorizedResult”。
执行HttpStatusCodeResult,设置HTTP状态码401
在 95.272 毫秒内执行操作“Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)”
请求在 123.9485 毫秒内完成 401
我怎样才能摆脱不需要的消息?
这是我的Program.cs
文件:
public class Program
{
public static void Main(string[] args)
{
var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{currentEnv}.json", true)
.AddEnvironmentVariables()
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.CreateLogger();
try
{
Log.Information("Start web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>();
}
解决方案
您可以覆盖appsettings.json
. 例如,以下appsettings.json
将Microsoft
日志消息设置为仅注销那些考虑过的消息Error
:
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Error"
}
},
...
}
这里感兴趣的属性是Override
,它表示一个对象,其中属性是类别前缀,值是要使用的Serilog 日志级别。
因为您自己的自定义日志消息不会记录在某个Microsoft
类别下,所以您仍然会在输出中看到它。
推荐阅读
- neural-network - 是否可以使用未见数据(与输入数据不同的数据)的损失函数来训练神经网络?
- java - map 和 forEach 实例修改的区别
- android - 有什么方法可以使用颤振 File.writeAsStringSync 将文件写入 SDCard
- swift - MapKit、注解和 addSubview 重复
- python - 如何修复 ValueError:要解包的值太多(预期 2)
- yosys - 在 yosys 上合成
- javascript - 为什么,当我进行 http 调用时,会收到一条错误消息,指出我的 url 不是字符串?
- algorithm - 在 O(logn) 时间和空间复杂度中找到第 N 个斐波那契数?
- python - form.ValidationError 未显示在模板中
- node.js - 如何实现通知