我在 ASP.NET Core 2.1 中使用 Serilog,并通过appsettings.json.
默认模板不包含{SourceContext},所以我使用自己的包含它的模板。但我也希望使用 JSON 进行结构化日志记录。
我在 Serilog wiki 的某个地方阅读了我无法同时指定formatter(对于 JSON 输出)的内容outputTemplate。
所以我不能这样做,例如:
"outputTemplate": "{Timestamp:yyyy-MM-dd} {Level:u3} {SourceContext} {Message:lj}{NewLine}{Exception}",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
Run Code Online (Sandbox Code Playgroud)
那么如何获得JSON输出,同时获得SourceContext我需要的数据呢?
我正在使用 Serilog 来记录有关asp.net core 2.1托管在 IIS 上的应用程序的信息。发生异常时,我会收到电子邮件通知。问题是,一些异常发生时根本不会损害应用程序,我不想每次发生时都被注意到。
Serilog 中有没有办法从记录中排除特定的异常类型?
编辑 :
这是我在 Program.cs 中配置 Serilog 的方式:
using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;
namespace WindZone_Warehouse_Mobile_App
{
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
.Build();
var columnOptions = new ColumnOptions {
AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
{
new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000}, …Run Code Online (Sandbox Code Playgroud) 我在我的项目 Angular、web api、EF 中使用了 serilog 和 SEQ。我对两者都是新手。
1) 如何确保每次我写错误、信息、调试时都应该包含 ClassName.Method Name。我知道我必须创建 Enrich 但不确定如何获取 ClassName.Method Name
例如
Class Test
{
public void testing(){
// logger.Error("Error ....");}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我看到日志时,它应该显示“29/09/2012 10:00:00, Test=>testing Error .....”
在,短 DateTime、ClassName、MethodName 和 Message
如果有人可以请帮助我进行 Serilog 配置。我想知道是否可以将滚动文件接收器配置为始终输出具有有效 JSON 的文件。文件结构必须是一个 JSON 项数组,如下所示:
如果日志文件为空,则内容应为:
[]
Run Code Online (Sandbox Code Playgroud)
如果日志文件存储单个项目,则内容应为:
[{some.json}]
Run Code Online (Sandbox Code Playgroud)
如果日志文件存储n个项目,那么内容应该是:
[{some json}, {...}, {n-th json}]
Run Code Online (Sandbox Code Playgroud)
日志文件不应该看起来像:
[{some json},
Run Code Online (Sandbox Code Playgroud)
或者
{some json}
{some json}
Run Code Online (Sandbox Code Playgroud)
或者
{some json},
{some json},
Run Code Online (Sandbox Code Playgroud)
提前致谢。
我的 Serilog 配置代码如下所示:
Log.Logger = new LoggerConfiguration()
.Enrich.WithExceptionDetails()
.Enrich.FromLogContext()
.MinimumLevel.Warning()
// .MinimumLevel.Override("Microsoft", LogEventLevel.Verbose)
// .MinimumLevel.Override("System", LogEventLevel.Verbose)
// .MinimumLevel.Override("Microsoft.AspNetCore.Authentication", LogEventLevel.Verbose)
.WriteTo.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}", theme: AnsiConsoleTheme.Literate )
// .WriteTo.File()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
我想在运行时更改此配置,不幸的是,因为 Serilog 使用了“流畅”风格的 API,这使它有些混乱。例如,如果我想在运行时启用或禁用控制台和文件日志记录:
Boolean enableConsoleLogging = ...
Boolean enableFileLogging = ...
LoggerConfiguration builder = new LoggerConfiguration()
.Enrich.WithExceptionDetails()
.Enrich.FromLogContext()
.MinimumLevel.Warning();
if( enableConsoleLogging )
{
builder = builder
.WriteTo.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message:lj}{NewLine}{Exception}{NewLine}", theme: AnsiConsoleTheme.Literate )
}
if( enableFileLogging )
{
builder = builder
.WriteTo.File( ... )
}
Log.Logger = builder.CreateLogger(); …Run Code Online (Sandbox Code Playgroud) 我使用SerilogElasticsearch sink 的配置如下:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft", LogEventLevel.Verbose)
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.Enrich.WithProperty("Application", "abc")
.Enrich.WithProperty("Environment", env.EnvironmentName)
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(Configuration["LoggingEndpoint"]))
{
AutoRegisterTemplate = true,
CustomFormatter = new ExceptionAsObjectJsonFormatter(renderMessage: true) // Better formatting for exceptions
})
Run Code Online (Sandbox Code Playgroud)
// 然后:
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog());
Run Code Online (Sandbox Code Playgroud)
但是我可以在 Kibana 上看到每个日志两次,时间戳相差几毫秒。我尝试了此处提供的解决方案,以防万一它们可能有所帮助,但没有运气。
我找不到在 ASP.Net 4.7.1 WebApi 项目中安装 Serilog 的任何资源。有人可以帮我吗?有大量的 .Net Core 资源,但这无济于事。
在 Kubernetes (Minikube) 上使用 EFK 堆栈。有一个使用 Serilog 的 asp.net 核心应用程序以 Json 的形式写入控制台。日志确实会发送到 Elasticsearch,但它们到达未解析的字符串,进入“日志”字段,这就是问题所在。
这是控制台输出:
{
"@timestamp": "2019-03-22T22:08:24.6499272+01:00",
"level": "Fatal",
"messageTemplate": "Text: {Message}",
"message": "Text: \"aaaa\"",
"exception": {
"Depth": 0,
"ClassName": "",
"Message": "Boom!",
"Source": null,
"StackTraceString": null,
"RemoteStackTraceString": "",
"RemoteStackIndex": -1,
"HResult": -2146232832,
"HelpURL": null
},
"fields": {
"Message": "aaaa",
"SourceContext": "frontend.values.web.Controllers.HomeController",
"ActionId": "0a0967e8-be30-4658-8663-2a1fd7d9eb53",
"ActionName": "frontend.values.web.Controllers.HomeController.WriteTrace (frontend.values.web)",
"RequestId": "0HLLF1A02IS16:00000005",
"RequestPath": "/Home/WriteTrace",
"CorrelationId": null,
"ConnectionId": "0HLLF1A02IS16",
"ExceptionDetail": {
"HResult": -2146232832,
"Message": "Boom!",
"Source": null,
"Type": "System.ApplicationException"
}
}
} …Run Code Online (Sandbox Code Playgroud) 我试图将 serilog 配置为写入多个文件,但没有任何运气。使用此配置它只是写入第二个文件?
{
"AllowedHosts": "*",
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "c:\\temp\\audit-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Information"
}
},
{
"Name": "File",
"Args": {
"path": "c:\\temp\\error-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Error"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
或者有什么方法可以将许多记录器加载到具有来自 appsettings.json 的不同配置的软件中。像这样的东西?
var errorLogConfiguration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
_log = new LoggerConfiguration()
.ReadFrom
.Configuration(errorLogConfiguration)
.CreateLogger();
Run Code Online (Sandbox Code Playgroud) 我在我的 ASP Core 2.2 应用程序中使用了 serilog。一切正常,但我无法设置flushToDiskInterval。例如,这意味着我想每分钟将日志刷新到磁盘,但日志会在创建时刷新。我的 Program.cs 文件:
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.File("Logs/log-{Date}.txt", buffered: true, flushToDiskInterval: TimeSpan.FromSeconds(60))
.CreateLogger();
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog() // Set serilog as the logging provider.
.UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)
那么问题来了,如何设置间隔呢?
==更新==
我无法理解,但现在一切正常……我检查过,确实设置了冲洗间隔。
serilog ×10
asp.net-core ×4
c# ×3
asp.net ×1
exception ×1
fluent ×1
fluent-bit ×1
kibana-6 ×1
kubernetes ×1
logging ×1