ручний спосіб логування у файл

翻译
// у чистому 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"));
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论