在.net Core应用程序中使用Loggerfactory自定义日志消息

时间:2018-12-20 08:54:39

标签: azure .net-core log4net azure-application-insights loggerfactory

我有2个控制台应用程序,其中一个是在.Net framework 4.6中创建的。 .net core 2.0中的另一种。
在.Net框架中,我使用log4Net进行日志记录,在.net核心中,我使用Logger。此记录器直接在Azure中直接写入Application Insights。

现在我的问题是,如何使用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";

我想对.Net核心中的Logger进行类似的自定义。这是我的示例代码。

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 :(得分:0)

您可以使用telemetry initializer向所有遥测项目添加额外的属性,或修改现有属性:

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();
    }