Application Insights Log4j 按日志文件名筛选

Application Insights Log4j filter by log file name

我在 Azure 中有一个 Application Insights 资源。在我们的 Java 应用程序中,我们有一个 log4j.xml 文件,它根据服务名称写入多个日志文件。

我正在将 Application Insights 附加程序添加到日志记录中,我能够在 Application Insights 资源中看到不同日志文件的所有日志。但是,我无法在 Application Insights 中按日志文件名进行筛选,因此跟踪日志没有用。

有没有办法将日志文件名放入日志事件属性中?这样,在 AppInsights 中,我们将能够按日志文件名进行过滤,并读取它们,就好像我们在那里有日志文件一样。

编辑: 我们的 log4j.xml 看起来像这样,其中包含 aiAppender 用于应用程序洞察

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="fileout" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="datePattern" value="'.'yyyyMMdd"/>
    <param name="file" value="${app.install.home}/log/${app.server.name}-${app.service.process.host}.log"/>
    <param name="append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %5p [%t] (%C) - %m%n"/> 
    </layout> 
</appender>
<appender name="aiAppender" 
    class="com.microsoft.applicationinsights.log4j.v1_2.ApplicationInsightsAppender">
</appender>    
<root> 
    <priority value ="INFO" /> 
    <appender-ref ref="fileout"/>
    <appender-ref ref="aiAppender" />
</root>

您可以实现一个TelemetryInitializer将服务名称添加到遥测属性中,可用于分组。

您的遥测初始化程序应如下所示:

public class ServiceNameInitializer implements TelemetryInitializer {
    @Override
    public void initialize(Telemetry telemetry) {
        if (telemetry instanceof TraceTelemetry) {
            telemetry.getProperties().put("ServiceName", ServiceNameFromConfigurationOrProcessName);
        }
    }
}

请注意,可以删除该条件 - 这会将 属性 添加到所有遥测类型。

实现初始化器后,将其添加到 TelemetryInitializers 元素内的 configuration file

<TelemetryInitializers>
    .
    .
    <Add type="your.initializer.package.ServiceNameInitializer"/>
</TelemetryInitializers>