You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过logstash-logback-encoder仅发送特定包相关日志?

实现特定包日志发送到Elasticsearch的配置方案

没问题,我来帮你搞定这个需求——只把特定包的日志通过LoggingEventCompositeJsonEncoder发送到Elasticsearch,其实用logback的原生配置就能轻松实现,给你两种实用方案:

方法1:给目标包单独配置Logger(推荐)

这种方式最直观,直接指定哪些包的日志要走Elasticsearch的输出通道,其他包完全不碰这个appender,避免冗余配置。

这里是完整的logback配置示例,你可以直接套用:

<configuration>
    <!-- 配置Elasticsearch输出的Appender,用你需要的LoggingEventCompositeJsonEncoder -->
    <appender name="ELASTICSEARCH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- 替换成你的Elasticsearch/Logstash地址和端口 -->
        <destination>your-es-host:5044</destination>
        
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <!-- 这里可以添加你需要的日志字段,按需调整 -->
                <timestamp/>
                <loggerName/>
                <level/>
                <message/>
                <threadName/>
                <stackTrace/>
            </providers>
        </encoder>
    </appender>

    <!-- 给你需要的包单独配置Logger,指定使用ELASTICSEARCH Appender -->
    <!-- 比如你示例里的org.springframework.context.annotation包(缩写o.s.c.a) -->
    <logger name="o.s.c.a" level="INFO" additivity="false">
        <appender-ref ref="ELASTICSEARCH"/>
    </logger>
    <!-- 还有org.springframework.jmx.export.annotation包(o.s.j.e.a) -->
    <logger name="o.s.j.e.a" level="INFO" additivity="false">
        <appender-ref ref="ELASTICSEARCH"/>
    </logger>

    <!-- 根Logger配置其他输出(比如控制台),不要绑定ELASTICSEARCH -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

关键说明:

  • additivity="false"一定要加上,这样目标包的日志不会再传递给根Logger的Appender,避免重复输出
  • 如果你需要匹配某个包下的所有子包,直接写父包名就行(比如o.s.c.a会自动匹配它的所有子包)

方法2:在Appender中添加过滤器

如果不想单独配置多个Logger,也可以在Elasticsearch的Appender里加过滤器,只允许特定包的日志通过:

<configuration>
    <appender name="ELASTICSEARCH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>your-es-host:5044</destination>
        
        <!-- 第一个过滤器:接受o.s.c.a包的日志 -->
        <filter class="ch.qos.logback.classic.filter.LoggerFilter">
            <loggerName>o.s.c.a</loggerName>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <!-- 第二个过滤器:接受o.s.j.e.a包的日志 -->
        <filter class="ch.qos.logback.classic.filter.LoggerFilter">
            <loggerName>o.s.j.e.a</loggerName>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <!-- 最后一个过滤器:拒绝所有其他日志 -->
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
                <expression>true</expression>
            </evaluator>
            <onMatch>DENY</onMatch>
        </filter>

        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp/>
                <loggerName/>
                <level/>
                <message/>
                <threadName/>
            </providers>
        </encoder>
    </appender>

    <!-- 根Logger可以同时绑定控制台和Elasticsearch Appender -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ELASTICSEARCH"/>
    </root>
</configuration>

关键说明:

  • NEUTRAL表示让日志继续走后续过滤器,直到遇到ACCEPTDENY
  • 最后那个过滤器是兜底的,确保只有你指定的包能通过

额外小贴士

  • 确保你的项目已经正确引入了logstash-logback-encoder依赖(Maven/Gradle都可以)
  • 可以根据需求调整日志级别(比如把INFO改成DEBUG
  • 如果需要更复杂的过滤规则,还可以用JaninoEventEvaluator写自定义表达式匹配日志

内容的提问来源于stack exchange,提问作者Alessio Frabotta

火山引擎 最新活动