ручний спосіб логування у файл
翻译
| // у чистому Microsoft.Extensions.Logging немає вбудованого файлового провайдера, але можна написати свій: | |
| // Soccer.Infrastructure/Logging/FileLoggerProvider.cs | |
| public sealed class FileLoggerProvider : ILoggerProvider | |
| { | |
| private readonly StreamWriter _writer; | |
| private readonly object _lock = new(); | |
| public FileLoggerProvider(string path) | |
| { | |
| Directory.CreateDirectory(Path.GetDirectoryName(path)!); | |
| _writer = new StreamWriter(path, append: true) { AutoFlush = true }; | |
| } | |
| public ILogger CreateLogger(string categoryName) => | |
| new FileLogger(categoryName, _writer, _lock); | |
| public void Dispose() => _writer.Dispose(); | |
| } | |
| public sealed class FileLogger : ILogger | |
| { | |
| private readonly string _category; | |
| private readonly StreamWriter _writer; | |
| private readonly object _lock; | |
| public FileLogger(string category, StreamWriter writer, object @lock) | |
| { | |
| _category = category; | |
| _writer = writer; | |
| _lock = @lock; | |
| } | |
| public IDisposable? BeginScope(TState state) where TState : notnull => null; | |
| public bool IsEnabled(LogLevel logLevel) => logLevel >= LogLevel.Information; | |
| public void Log( | |
| LogLevel logLevel, EventId eventId, TState state, | |
| Exception? exception, Func formatter) | |
| { | |
| if (!IsEnabled(logLevel)) return; | |
| var line = $"{DateTime.UtcNow:O} [{logLevel}] {_category}: {formatter(state, exception)}"; | |
| if (exception != null) line += Environment.NewLine + exception; | |
| lock (_lock) _writer.WriteLine(line); | |
| } | |
| } | |
| // і потім реєстрація в Program.cs: | |
| // builder.Logging.AddProvider(new FileLoggerProvider("logs/app.log")); |
评论
?
参与讨论