如何通过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表示让日志继续走后续过滤器,直到遇到ACCEPT或DENY- 最后那个过滤器是兜底的,确保只有你指定的包能通过
额外小贴士
- 确保你的项目已经正确引入了
logstash-logback-encoder依赖(Maven/Gradle都可以) - 可以根据需求调整日志级别(比如把
INFO改成DEBUG) - 如果需要更复杂的过滤规则,还可以用
JaninoEventEvaluator写自定义表达式匹配日志
内容的提问来源于stack exchange,提问作者Alessio Frabotta




