В .NET у меня есть следующий код
var logger = new LoggerConfiguration()
.Enrich.WithProperty("Assembly", assembly?.Name)
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Debug)
.WriteTo.Console(
theme: Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code,
formatProvider: CultureInfo.CurrentCulture,
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}][{Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}",
restrictedToMinimumLevel: LogEventLevel.Debug)
.WriteTo.File(
path: "Logs/log-.log",
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}][{Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}",
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: LogEventLevel.Debug,
formatProvider: CultureInfo.CurrentCulture)
.WriteTo.Sink(new WebSocketSink(logChannel), LogEventLevel.Debug)
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
Когда я передаю этот регистратор в качестве аргумента другим классам Microsoft, где используется ILogger,
операторы регистрации не отображаются ни на консоли, ни в файле.
Но когда я меняю его на
Log.logger = new LoggerConfiguration()..
Операторы регистрации начинают появляться на консоли и в файле.
Вот отрывок из класса, который я использую ILogger в качестве аргумента.
public class MyService(IDeviceIO devIO, ILogger<MyService> logger) : IMyService
{
/// <inheritdoc/>
public void OpenDevice(string host)
{
logger.LogInformation("Device is being opened!");
devIO.Open(host);
}
...
Почему я не могу использовать var logger = ..
? Нужно ли мне всегда использовать какой статический экземпляр?
@PMF: Обновлен мой вопрос с примером, который вы задали. Дайте мне знать, если вам нужна дополнительная информация.
Я не знаю ответа, но теперь вопрос стал намного лучше.
есть ли шанс, что вы используете инъекцию зависимостей, которая настроена неправильно?
Я использую ДИ. Можете ли вы @IvanPetrov предоставить правильный пример DI, чтобы решить эту проблему?
@BND попытайтесь отладить значение регистратора внутри метода в качестве первого шага
Я вижу следующие значения в регистраторе внутри метода logger = Name = "App.Service.MyService", Enabled = false | -- _provider {Serilog.Extensions.Logging.SerilogLoggerProvider} | -- _logger = null @IvanPetrov Означает ли это, что у DI есть какие-то проблемы?
да, сосредоточься на _logger = null
, хотя почему это не бросает NullReferenceException
, я не уверен
Как настроить ведение журнала при запуске? Если это проект ASP.NET, вам, вероятно, стоит посмотреть этот ответ здесь
Спасибо @P. Магнуссону за вашу помощь и быстрый ответ!
Спасибо @IvanPetrov за советы!
Я обнаружил проблему. Добавил только три строки следующим образом и решил мою проблему
var logger = new LoggerConfiguration()
.Enrich.WithProperty("Assembly", assembly?.Name)
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Debug)
.WriteTo.Console(
theme: Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code,
formatProvider: CultureInfo.CurrentCulture,
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}][{Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}",
restrictedToMinimumLevel: LogEventLevel.Debug)
.WriteTo.File(
path: "Logs/log-.log",
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}][{Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}",
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: LogEventLevel.Debug,
formatProvider: CultureInfo.CurrentCulture)
.WriteTo.Sink(new WebSocketSink(logChannel), LogEventLevel.Debug)
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
builder.Host.UseSerilog(logger);
builder.Services.AddLogging();
Спасибо за помощь ! Короче говоря, это была проблема DI!
Покажите пример, в котором вы используете этот регистратор в качестве аргумента.