如何在 Spring 引导项目中使用 Azure 的 ApplicationInsight appender 设置 Log4j?

How to setup Log4j with Azure's ApplicationInsight appender in a Spring Boot project?

我有一个 Spring 启动 1.5.8 设置,带有 Log4j 用于日志记录。我使用 Azure Web 服务和 Azure 的 Application Insights 进行日志记录。

问题

  1. 如何使用 Logj4j 设置 Azure 以在 Spring 引导(即基于注释的配置)中拦截 HTTP 请求?
  2. 为什么我的自定义日志没有显示在 Application Insights 中?

首先,没有太多内容可以说明如何使用 Log4j 和 Application Insights 设置 Spring Boot。我认为 Logback 上有一两个教程。

其次,在一个或多个版本的 Azure ApplicationInsights 库中似乎存在一些问题|错误(参见link 在末尾)。

要在 Spring 引导中启用 Request-level 到 Azure ApplicationInsights 的日志记录,我们需要按以下方式注册 ApplicationInsights

package com.sample;

import javax.servlet.Filter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.microsoft.applicationinsights.TelemetryConfiguration;
import com.microsoft.applicationinsights.web.internal.WebRequestTrackingFilter;

@Configuration
@ComponentScan("com.microsoft.applicationinsights.web.spring")
public class AppInsightsConfig {
    private String insightsKey = "appInsightsKeyXX"; 

    @Bean
    public String telemetryConfig() {
        if (insightsKey != null) {
            TelemetryConfiguration.getActive().setInstrumentationKey(insightsKey);
        }
        return insightsKey;
    }

    @Bean
    public FilterRegistrationBean aiFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new WebRequestTrackingFilter());
        registration.addUrlPatterns("/**");
        registration.setOrder(1);
        return registration;
    } 

    @Bean(name = "WebRequestTrackingFilter")
    public Filter WebRequestTrackingFilter() {
        return new WebRequestTrackingFilter();
    }   
}

以上是 annotation-config 等效于以下基于 XML 的配置

<filter>
  <filter-name>ApplicationInsightsWebFilter</filter-name>
  <filter-class>
    com.microsoft.applicationinsights.web.internal.WebRequestTrackingFilter
  </filter-class>
</filter>
<filter-mapping>
   <filter-name>ApplicationInsightsWebFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

以上将配置记录所有 http 对应用程序洞察力的请求 - 一个基本的请求拦截器|过滤器。

我不得不坚持使用以下版本的 ApplicationInsights 罐子

// application insights dependencies
compile group: 'com.microsoft.azure', name: 'applicationinsights-core', version: '1.0.9'
compile group: 'com.microsoft.azure', name: 'applicationinsights-web', version: '1.0.9'
compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j1_2', version: '1.0.9'

导航到此 tutorial 的评论部分,查看人们在 Log4j 1.2Log4j2 中使用不同版本的 ApplicationInsights 时遇到的问题。对我来说只有 1.0.9 有效。

共享以防其他人遇到同样的问题。

@Raf 是的,以前版本的 Application Insights Java SDK 中的 Log4j 和 LogBack 存在错误。然而,随着 Maven 上最新的 SDK 2.0.0-BETA,我们已经解决了这个问题。请在此处查看发行说明。也非常感谢你放下这个例子。我会尝试将其包含在 Microsoft 文档存储库中。

https://github.com/Microsoft/ApplicationInsights-Java/releases/tag/v2.0.0-BETA