我试图将 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)
由于 Serilog 和任何接收器的简单文档而苦苦挣扎了几天之后,这最终对我有用,而无需创建任何单独的记录器:
"Serilog": {
"Using": [ "Serilog.Sinks.Async" ],
"MinimumLevel": "Verbose",
"Enrich": [ "FromLogContext", "WithDemystifiedStackTraces" ],
"WriteTo:Information": {
"Name": "Async",
"Args": {
"Configure": [
{
"Name": "RollingFile",
"Args": {
"RestrictedToMinimumLevel": "Information",
"Formatter": "FOOINC.API.Configuration.Logging.CustomRenderedCompactJsonFormatter, FOOINC.API.Configuration",
"PathFormat": "_logs\\info\\info-log.json"
}
}
]
}
},
"WriteTo:Error": {
"Name": "Async",
"Args": {
"Configure": [
{
"Name": "RollingFile",
"Args": {
"RestrictedToMinimumLevel": "Error",
"Formatter": "FOOINC.API.Configuration.Logging.CustomRenderedCompactJsonFormatter, FOOINC.API.Configuration",
"PathFormat": "_logs\\errors\\error-log.json"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
希望这对任何人都有帮助!
我找到了解决方案。为 appsettings.json、ErrorLog 和 AuditLog 创建了单独的部分。
"ErrorLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "c:\\temp\\error-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Error"
}
}
]
},
"AuditLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "c:\\temp\\audit-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Information"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在我可以创建 2 个单独的记录器:
"ErrorLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "c:\\temp\\error-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Error"
}
}
]
},
"AuditLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "c:\\temp\\audit-.log",
"rollingInterval": "Day",
"restrictedToMinimumLevel": "Information"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
哪个更适合我的需要。
经过一段时间的错误,我的发现是,由于缺乏有关 Serilog 的文档,重试并几乎放弃。他们在 GitHub 上有足迹:https ://github.com/serilog/serilog-filters-expressions/issues/27 。几乎每个线程都会得出相同的结论:您必须创建一个 SUBLOGGER。这是我的实现。对于此实现,您需要以下插件:
Serilog异步
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo:Information": { //this name here can be changed
"Name": "Logger", //this name here is essential
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "@Level = 'Information'"
}
}
],
"WriteTo": [
{
"Name": "Async", //i use async plugin from serilog
"Args": {
"configure": [
{
"Name": "File",
"Args": {
"path": "Logs/Log_.txt",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
]
}
}
},
Run Code Online (Sandbox Code Playgroud)Pre*_*soc -1
我针对这个问题做了一些测试。好消息是您的配置有效。您的错误文件可能未创建,因为没有记录错误。
当第一条消息记录到该文件中时,Serilog 将创建日志文件。如果您运行这个简单的程序并(取消)注释错误记录,您可以确认这一点。
class Program
{
static void Main(string[] args)
{
var errorLogConfiguration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("settings.json", optional: false, reloadOnChange: true)
.Build();
var log = new LoggerConfiguration()
.ReadFrom
.Configuration(errorLogConfiguration)
.CreateLogger();
log.Warning("Warning");
log.Error("Error");
}
}
Run Code Online (Sandbox Code Playgroud)