如何将Apache HttpClient日志输出到Logback自定义Appender文件?
解决Apache HttpClient日志定向到自定义文件的问题
要把org.apache.http、org.apache.http.wire这类通信库的日志定向到自定义文件(比如MyApp-shopify-rest-client.log),只需要在logback-spring.xml中为这些日志包添加专属的logger配置,绑定对应的appender并关闭日志传递性即可。
具体修改步骤
1. 替换Production环境下的HttpClient日志配置
在<springProfile name="production">标签内,把原来仅设置日志级别的配置,替换为绑定目标appender的logger:
<!-- 替换原有的HttpClient日志配置 --> <!-- HttpClient logging for Shopify Rest Client --> <logger name="org.apache.http" level="debug" additivity="false"> <appender-ref ref="SHOPIFY-REST-CLIENT-FILE"/> <appender-ref ref="STDOUT"/> </logger> <logger name="org.apache.http.wire" level="debug" additivity="false"> <appender-ref ref="SHOPIFY-REST-CLIENT-FILE"/> <appender-ref ref="STDOUT"/> </logger>
2. 若需区分亚马逊/Shopify的HttpClient日志
如果亚马逊和Shopify任务使用各自独立的HttpClient实例,可以通过自定义日志名称+MDC过滤实现更细粒度的区分:
- 为每个客户端的HttpClient配置专属的日志标记(比如通过MDC添加
clientType字段) - 在appender中添加过滤规则,只接收对应标记的日志
示例(以亚马逊客户端为例):
<!-- 为亚马逊HttpClient添加带MDC过滤的Appender --> <appender name="AMAZON-CLIENT-FILE-FILTERED" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"> <expression>MDC.get("clientType").equals("amazon")</expression> </evaluator> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> <!-- 其余配置和原AMAZON-CLIENT-FILE一致 --> <file>${LOGS_HOME}/MyApp-amazon-client.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%M %L - %msg%n</Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOGS_HOME}/%d{yyyy-MM-dd,aux}/MyApp-amazon-client.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>1024MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <!-- 绑定亚马逊HttpClient日志到过滤后的Appender --> <logger name="org.apache.http" level="debug" additivity="false"> <appender-ref ref="AMAZON-CLIENT-FILE-FILTERED"/> <appender-ref ref="STDOUT"/> </logger>
同时在亚马逊客户端代码中添加MDC标记:
MDC.put("clientType", "amazon"); try { // 执行亚马逊API请求 } finally { MDC.remove("clientType"); }
关键配置说明
additivity="false":关闭日志传递性,避免这些日志同时输出到ROOT-FILE(root logger的appender)- 直接绑定appender:让
org.apache.http包下的日志直接输出到指定的自定义文件和控制台
内容的提问来源于stack exchange,提问作者user3187960
相关产品推荐
相关产品推荐

