[英]Serilog does not output logs into the txt file
我使用 dotnet worker 服務(.net 5)我集成了 serilog 以及豐富器和接收器。 但由於某種原因,我在文件日志中看不到任何輸出。
這是我的 appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=eeee;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"WorkerOptions": {
"Batch": 5
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.txt",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
},
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
記錄儀注冊:
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
});
}
這是一個實現:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IConfiguration _config;
public Worker(ILogger<Worker> logger, IServiceScopeFactory serviceScopeFactory, IConfiguration config)
{
_config = config;
_logger = logger;
_serviceScopeFactory = serviceScopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Worker picked up {0} requests for dispatch at at: {time}", generatedRequests.Count(), DateTimeOffset.Now);
}
當我通過 Kestrel 運行工作程序時,我可以在控制台日志中看到,但在 my.txt 文件和 json 文件中看不到
更新#1我在下面嘗試了這個答案,但是當我部署我的工作人員時我仍然遇到問題,我沒有看到任何日志。 當我通過 service.exe 文件運行它時,或者只是進行調試(Kestrel)會生成日志文件。
這是更新的應用程序。json:
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.txt",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
},
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
這是 Program.cs
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
})
.UseSerilog(); // no args
}
UPDATE#2我像這樣更新了程序 class:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
})
.UseSerilog((hostContext, services, logger) => {
logger.ReadFrom.Configuration(hostContext.Configuration);
});
}
}
我還在 appsettings.json 中放了一些簡單的東西:
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "Logs/log.txt" }
},
//{
// "Name": "File",
// "Args": {
// "path": ".\\Logs\\log_.txt",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//},
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
當我 start.exe 文件(控制台)再次調用時,這也是正在工作的 _logger
using Microsoft.Extensions.Logging;
...
private readonly ILogger<Worker> _logger;
...
_logger.LogInformation("Worker picked up {0} requests for dispatch at: {time}", generatedRequests.Count(), DateTimeOffset.Now);
更新#3我只是設置了記錄c:\\Logs\log.txt
的絕對路徑,它部分工作 - 它創建一個 txt 文件,但文件為空。 這是新的 appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=svcProcessor_dev;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"WorkerOptions": {
"Batch": 10,
"Delay": 5000,
"MaxAttempts": 3
},
"Serilog": {
"Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "C:\\Logs\\log.txt" }
}
//{
// "Name": "File",
// "Args": {
// "path": "C:\\Logs\\log_.txt",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//}
//{
// "Name": "File",
// "Args": {
// "path": "C:\\Logs\\log_.json",
// "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//}
]
}
}
更新#4
這是我的工人工人示例的最小示例
您沒有添加將 Serilog 的Logger
轉換為Microsoft.Extensions.Logging.ILogger
的基礎結構。 就目前而言,您只是在創建 Serilog Logger,但並未實際使用它。 您在控制台中看到的實際上是來自內置 Microsoft 記錄器的日志,而不是來自 Serilog 的日志。
幸運的是,根據您的使用場景,Serilog 有一個從他們的記錄器到 Microsoft 記錄器接口和各種幫助程序包的適配器。 您正在使用通用主機,因此首先將Serilog.Extensions.Hosting
package添加到您的項目中。 然后調用UseSerilog
擴展方法。 傳遞給此方法的委托接收HostBuilderContext
的實例,您可以從中檢索當前的IConfiguration
以及用於配置記錄器的IServiceProvider
和LoggingConfiguration
:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
/* elided */
})
.UseSerilog((hostContext, services, logger) => {
logger.ReadFrom.Configuration(hostContext.Configuration);
});
請注意,不再需要直接從Main
中設置Log.Logger
屬性和構建LoggerConfiguration
。 UseSerilog
方法將自動設置 static 記錄器——盡管您不需要它,但無論如何您都是通過ILogger<>
記錄的。
或者,您可以配置當前執行的記錄器方式(直接在Main
中)。 如果您使用 go 這條路線,您將在沒有任何參數的情況下調用UseSerilog
。 這將反過來使用 static 記錄器的當前配置。
public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggingConfiguration()
.ReadFromConfiguration(config)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
/* elided */
})
.UseSerilog(); // no args
我個人不喜歡這個選項,尤其是在使用ReadFrom.Configuration
時,因為它需要您構建額外的配置 object。 我更喜歡使用傳入回調的那個,因為它將匹配主機使用的所有其他配置。
您用aspnet-core
標記了您的問題,並在您的問題中引用了“Kestrel”。 但是,您演示的代碼顯示了一個非常基本的通用主機,而不是web 應用程序。 如果這確實是 web 應用程序,那么您將添加Serilog.AspNetCore
package 。 package 隱式引用Serilog.Extensions.Hosting
並包括在 web 應用程序中使用的其他一些零碎。
我在使用 serilog 時看到的幾件事(如果上面提到了它們,我很抱歉,我錯過了它們)。
如果每個環境有多個 AppSettings 將相互覆蓋。 有時,根據您記錄 output 的方式,您可能需要考慮更改記錄級別。 調試或詳細
最后一件事是在您的工作人員中,而不是將 ms 日志記錄擴展切換為使用 serilog,這應該會導致您的日志記錄必須使用 _log.Information("SampleEntry") 完成,即 serilogs pipe
正如上面在應用程序設置中提到的,您需要“使用”:[“Serilog.Sinks.File”],甚至可能有“Serilog.Settings.Configuration”用於自定義配置內容
對我來說,我遇到了類似的問題,我的日志文件沒有被寫入 my.Net 5 應用程序中。 正如@pinkfloydx33 上面多次詢問的那樣,您是否將此應用程序作為單文件應用程序發布? 就我而言,我正在這樣做。 在他分享的鏈接和他問的原因中,因為您需要在.Net 5 單文件應用程序中執行某些特定操作,那就是您的 appsettings.json 中的“使用”語句。 .Net 5 單文件應用程序無法為您解析命名空間,因此您必須在“Using”語句中指定它們。
這是他分享的文章: Serilog 配置
一旦我簡單地將我對“Serilog.Sinks.File”的使用添加到我的 appsettings.json,我的記錄器就開始寫入該文件。
希望這可以幫助某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.