You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry Java自动配置Agent:能否仅导出错误级别日志?

OpenTelemetry Java自动配置Agent:能否仅导出错误级别日志?

这个需求太接地气了——很多团队在用OTLP对接New Relic时,都不想把全量日志塞过去(毕竟日志量真的会爆炸),只希望把关键的错误日志同步过去,同时全量日志保留在ELK里。我来给你说说可行的解决方案:

首先得明确:OpenTelemetry Java Agent目前并没有直接提供otel.logs.exporter.level这种一键配置,但我们可以通过两种方式实现只导出ERROR级别日志:

方案一:通过日志框架配置过滤(推荐,更简单)

因为Spring Boot默认用SLF4J搭配Logback/Log4j2,我们可以直接在日志框架的配置里,给OpenTelemetry的Appender设置级别过滤,只让ERROR级别的日志进入OTLP导出流程。

以Logback为例

修改你的logback-spring.xml,给OpenTelemetry的Appender添加级别过滤规则:

<appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

<!-- 然后在root或者指定logger里引用这个appender -->
<root level="INFO">
    <appender-ref ref="ELK" /> <!-- 全量日志打去ELK -->
    <appender-ref ref="OTEL" /> <!-- 只打ERROR级去New Relic -->
</root>

以Log4j2为例

修改log4j2-spring.xml,配置类似的级别过滤:

<Appenders>
    <OpenTelemetry name="OTEL">
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
    </OpenTelemetry>
</Appenders>

<Loggers>
    <Root level="INFO">
        <AppenderRef ref="ELK"/>
        <AppenderRef ref="OTEL"/>
    </Root>
</Loggers>

这种方式的好处是直接复用日志框架的原生过滤能力,配置简单,和你现有ELK的日志流程完全兼容。

方案二:自定义OpenTelemetry日志处理器

如果需要更灵活的过滤逻辑(比如除了级别还要过滤特定日志内容),可以自定义一个LogRecordProcessor,在日志导出前过滤掉非ERROR级别的日志,然后让Java Agent加载这个处理器。

  1. 先写一个自定义处理器:
public class ErrorLevelLogProcessor implements LogRecordProcessor {
    private final LogRecordProcessor delegate;

    public ErrorLevelLogProcessor(LogRecordProcessor delegate) {
        this.delegate = delegate;
    }

    @Override
    public void onEmit(LogRecord logRecord) {
        // 只处理ERROR级别日志(包含FATAL)
        if (logRecord.getSeverity() == Severity.ERROR || logRecord.getSeverity() == Severity.FATAL) {
            delegate.onEmit(logRecord);
        }
    }

    // 实现其他必要的接口方法,直接委托给delegate即可
    @Override
    public void shutdown() {
        delegate.shutdown();
    }

    @Override
    public void forceFlush() {
        delegate.forceFlush();
    }
}
  1. 然后通过Agent的配置指定加载这个处理器:
otel.logs.exporter=otlp
otel.javaagent.extensions=path/to/your-custom-processor.jar
otel.logs.processor=your.package.ErrorLevelLogProcessor

这种方式适合有特殊过滤需求的场景,但需要额外开发和打包自定义扩展,相对麻烦一些。

总结一下,如果你只是单纯要过滤ERROR级别日志,方案一完全够用,配置起来也最快。

备注:内容来源于stack exchange,提问作者John Little

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:14:37