#c# #.net #.net-core #dependency-injection #nlog
#c# #.net #.net-ядро #внедрение зависимостей #nlog
Вопрос:
У меня есть следующий код для внедрения зависимостей в регистратор NLog:
// startup.cs
[assembly: FunctionsStartup(typeof(MyApp.FunctionApp.Startup))]
namespace MyApp.FunctionApp {
public class Startup : FunctionsStartup {
public override void Configure(IFunctionsHostBuilder builder) {
var nLogConfigPath = GetLogPath("nlog.config");
builder.Services.AddLogging(loggingBuilder =>
{
var nLogOptions = new NLogAspNetCoreOptions
{
RegisterHttpContextAccessor = true,
IgnoreEmptyEventId = true,
IncludeScopes = true,
ShutdownOnDispose = true
};
var logFactory = NLogBuilder.ConfigureNLog(nLogConfigPath);
logFactory.AutoShutdown = false;
var nLogConfig = logFactory.Configuration;
loggingBuilder.AddNLog(nLogConfig, nLogOptions);
});
}
}
}
// actual function code
public class ActualFunctionClass {
public ActualFunctionClass (ILogger<ActualFunctionClass> logger) {
logger.LogInformation("log stuff");
}
}
В файле nlog.config у меня есть несколько целевых объектов. Как мне убедиться, что logger
параметр ActualFunctionClass настроен с правильным целевым значением?
Это содержимое файла nlog.config. Для записи я хотел бы войти, используя locations-dataload-file
цель.
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="true"
keepVariablesOnReload="true">
<variable name="logDirectory" value="${basedir}/logs/locations-dataload" />
<variable name="commonLayout" value="${longdate}|${logger}|${uppercase:${level}}|${message}, ${all-event-properties:format=[key]=[value]:separator=, } ${exception}" />
<targets>
<target xsi:type="ApplicationInsightsTarget"
name="locations-dataload-ai"
layout="${commonLayout}" />
<target xsi:type="File"
name="locations-dataload-file"
fileName="${logDirectory}/locations-dataload-file-${shortdate}.log"
layout="${commonLayout}" />
<target xsi:type="Null" name="blackhole" />
</targets>
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="locations-dataload-ai" />
<!--All logs, including from Microsoft-->
<logger name="locations-dataload-local*" minlevel="Trace" writeTo="locations-dataload-ai,locations-dataload-file" />
<!-- Skip Microsoft logs and so log only own logs -->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
</rules>
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
<add assembly="MyApp.Logging" />
</extensions>
</nlog>
Комментарии:
1. Что не работает?
2. @Julian Регистратор в конструкторе ActualFunctionClass ничего не регистрирует. Я предполагаю, что не было указано, на какую цель входить. Но я не уверен, как указать цель в настройке DI.
3. Пожалуйста, поделитесь своей конфигурацией nlog. Вероятно, проблема в этом
4. Какая версия .net core / asp.net core?
5. Смотрите также: github.com/NLog/NLog . Расширения. Ведение журнала / проблемы / 447
Ответ №1:
Я думаю, что это неправильно:
<logger name="locations-dataload-local*" ...
Имя регистратора по умолчанию является пространством имен.Имя_класса
Вы могли бы протестировать это с помощью:
измените правило на name="*"
<logger name="*" minlevel="Trace" writeTo="locations-dataload-ai,locations-dataload-file" />
и добавить в свой макет ${logger}
, например
layout="${logger}|${commonLayout}"
Фильтр имен будет сопоставлен с именем регистратора ${logger)
. Итак, если имя регистратора является, YourNamespace.ActualFunctionClass
то locations-dataload-local*
оно не будет соответствовать этому.