Настройте сообщения журнала, используя Loggerfactory в основном приложении .net - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть 2 консольных приложения, одно из которых создано в .Net framework 4.6.И другой в .net core 2.0.
Для ведения журнала, в .Net framework я использую log4Net, в .net core я использую Logger. Этот регистратор напрямую записывает в Application Insights непосредственно в Azure.

Теперь мой вопрос: как настроить регистрацию сообщений с помощью Logger.
В log4Net я использовал aiappender и определил шаблон конвертации на основе моих требований.Например,

<appender name="aiAppender" type="Microsoft.ApplicationInsights.Log4NetAppender.ApplicationInsightsAppender, Microsoft.ApplicationInsights.Log4NetAppender">
    <layout type="log4net.Layout.PatternLayout">
      <parameterName value="@Extra"/>      
        <conversionPattern value="%date{dd/MM/yy HH:mm:ss} [%thread] %level  :: Extra = %property{Extra} %message%newline"   />
    </layout>
</appender> 

Я записал это в log4net.config и присвоил значения переменной Extra, как показано ниже.

log4net.GlobalContext.Properties["Extra"] = "SomeValue";

Я хочу выполнить аналогичную настройку для Loggerв ядре .Net.Вот пример кода, который у меня есть.

public class Startup
{
    public Startup()
    {
    } 
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        loggerFactory.AddConsole();
        var logger = loggerFactory.CreateLogger<ConsoleLogger>();
        logger.LogInformation("Executing Configure()");
    }
}

public class HomeController : Controller
{
    ILogger _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    public IActionResult Index()
    {
        _logger.LogInformation("Executing Home/Index");

        return View();
    } 
}

В этом коде, если мне нужна дополнительная информация, аналогичная шаблону Log4Net, как мне это сделать?Любая идея высоко ценится.

PS: я не могу перейти с logger на log4Net, так как на самом деле код довольно большой.Также я не хочу добавлять необходимую информацию каждый раз, когда я регистрирую некоторые данные.

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете использовать инициализатор телеметрии , чтобы добавить дополнительные свойства ко всем элементам телеметрии или изменить существующие свойства:

public class CustomInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        // modify trace message
        if (telemetry is TraceTelemetry trace)
            trace.Message = $"Modified Message: {trace.Message}"; 

        if (!(telemetry is ISupportProperties supportedTelemetry))
            return;

        // add custom property
        supportedTelemetry.Properties["MyProp"] = "MyValue";
    }
}

Добавить его к своим услугам:

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ITelemetryInitializer, CustomInitializer>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

и убедитесь, что вывод Ilogger направлен в App Insights:

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace);

        app.UseMvc();
    }
...