将 feign 和 Ribbon 日志重定向到 log4j2

Posted

技术标签:

【中文标题】将 feign 和 Ribbon 日志重定向到 log4j2【英文标题】:Redirecting feign & ribbon logs to log4j2 【发布时间】:2015-09-02 19:58:09 【问题描述】:

我目前使用带有 log4j2 的 spring cloud netflix。 log4j2 配置来自类路径中的 xml。当我运行应用程序时,我看到 feign 和 Ribbon 日志没有被重定向到配置中指定的记录器。我已经为 com.netflix.ribbonfeign 包配置了日志以在 debug 级别进行记录。

但是,为 spring 配置的日志正确地重定向到指定的 appender,ribbon 和 feign 没有。

我在使用 gradle 时忽略了 spring-boot-starter-logging 并在构建过程中添加了 spring-boot-starter-log4j2。

我看到可以配置 slf4j 的 feign has a way,但是由于我们使用注释驱动的 feign 支持,我无法配置 feign 以使用 slf4j 进行日志记录。

感谢任何帮助。

我的 log4j2.xml 看起来有点像

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="log-path">logs</Property>
        <Property name="log-fileName">test</Property>
    </Properties>

    <Appenders>
        <Console name="console-log" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n" />
        </Console>

        <RollingFile name="trace-log" fileName="$log-path/$log-fileName-trace.log" filePattern="$log-path/$log-fileName_trace-%dyyyy-MM-dd.log">
            <PatternLayout pattern="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <RollingFile name="error-log" fileName="$log-path/$log-fileName-error.log" filePattern="$log-path/$log-fileName_error-%dyyyy-MM-dd.log">
            <PatternLayout pattern="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <logger name="org.springframework" level="trace" additivity="false">
            <AppenderRef ref="trace-log" />
        </logger>
        <logger name="feign" level="trace" additivity="false">
            <AppenderRef ref="trace-log" />
        </logger>
        <logger name="com.netflix.ribbon" level="trace" additivity="false">
            <AppenderRef ref="trace-log" />
        </logger>
        <Root level="info">
            <AppenderRef ref="console-log"></AppenderRef>
            <AppenderRef ref="error-log" level="ERROR"/>
        </Root>
    </Loggers>
</Configuration>

PS:调试 feign/ribbon 的原因是为了了解我们微服务设置中两台不同机器之间的奇怪 feign 行为

【问题讨论】:

您可以创建一个 feign.Logger 类型的 bean,它会自动装入。feign.slf4j.Slf4jLogger 是默认值。问题之一是只有一个记录器(即日志名称)feign.Logger 将以下 bean 添加到启动应用程序类中,并提供帮助。 @Bean public Logger feignLogger() return new Slf4jLogger();我是否需要进行任何 log4j2.xml 更改(除了已经注册的记录器,记录器名称设置为 feign)? 仅供参考,我用 @FeignClient 注释了存根接口,我使用的是 Spring boot 1.2.1.RELEASE& spring cloud version of 1.0.1.RELEASE 我从未使用过 log4j2,所以我无能为力。 斯宾塞,谢谢。 @dsyer,对此有何建议? 【参考方案1】:

查看 Spring Cloud 的 FeignClientFactoryBean 表明您可以选择自动装配 feign.Logger.Level 类型的 bean。尝试在@Configurationusing 中注册这样一个 bean

@Bean
public feign.Logger.Level feignLoggerLevel() 
    return feign.Logger.Level.FULL;

【讨论】:

我已尝试使用此选项。我只看到来自 com.netflix 的日志,而不是 feign 的日志。我在这个测试中使用了 logback(不是 log4j2) 还将logging.level.feign=DEBUG 放入您的application.properties 是的。当我之前尝试过时,我已经将 com.netflix 和 feign 的 logging.level 设置为 DEBUG【参考方案2】:

@jensfischerhh 的回答可以解决很多问题,但看起来错误地错过了一件事情。

您需要使用 feignLoggerLevel Bean配置 feign 生成类的记录器级别

两个配置必须同时存在。

related doccument in spring-cloud-netflix

bean 配置(在@Configuration 注解的类中)

@Bean
public feign.Logger.Level feignLoggerLevel() 
    return feign.Logger.Level.FULL;
  

日志配置

</Configuration>
    <Loggers>
        <logger name="your.feign-interface-package" level="trace">
    </Loggers>
</Configuration>

【讨论】:

以上是关于将 feign 和 Ribbon 日志重定向到 log4j2的主要内容,如果未能解决你的问题,请参考以下文章

Pitest:如何将日志输出重定向到文件?

nginx入口子路径重定向

41 ribbon和feign

将 aws lambda 日志重定向到 cloudwatch 中的特定日志组

如何在实时输出的同时将命令的 stdout 和 stderr 重定向到控制台和日志文件?

从 bash 脚本本身将 stdout 的副本重定向到日志文件