Log是监控系统状态,排查问题的重要手段,RocketMQ的默认Log存储位置是:${user.home}/Logs/rocketmqLogs,Log配置文件的设置可以通过JVM启动参数、环境变量、代码中的设置语句这三种方式来配置。RocketMQ日志相关的代码在org.apache.rocketmq.Client.Log ClientLogger类中,从源码中可以看到所有的配置选项。比如想更改RocketMQ Client的Log level,可以通过-Drocketmq.Client.LogLevel来设置,或者在程序启动时使用System.setProperty("rocketmq.Client.LogLevel","WARN")来设置。RocketMQ的Log实现是基于slf4j的,支持Logback、Log4j。RocketMQ Client里已经有Logback的相关包,可以直接使用Logback。我们可以通过Logback的配置文件对日志进行细粒度的控制。接下来以一个maven项目为例,具体说明如何使用自定义的Log配置。首先需要把rocketmq.Client.Log.loadconfig参数设置为false,可以在程序中使用System.setProperty("rocketmq.Client.Log.loadconfig","false")语句,或者在JVM启动时使用-D参数来设置。然后把Logback.xml放到maven项目的resources文件夹下。在Logback.xml示例配置里,在原有RocketMQ日志的基础上,增加了STDOUT输出,这样可以把RocketMQ的日志输出到应用系统console中,便于调试时发现问题,如代码清单1所示。
代码清单1 Logback.xml示例
<configuration>
<appender name="RocketmqClientAppender"
class="ch.qos.Logback.core.rolling.RollingFileAppender">
<file>/Users/mark.yky/IdeaProjects/mqClientest/Logs/rocketmq_Client. Log</file>
<append>true</append>
<rollingPolicy class="ch.qos.Logback.core.rolling.FixedWindow-RollingPolicy">
<fileNamePattern>/Users/mark.yky/IdeaProjects/mqClientest/otherdays/rocketmq_Client.%i.Log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>20</maxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.Logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.Logback.core.ConsoleAppender">
<layout class="ch.qos.Logback.classic.PatternLayout">
<Pattern>
%d{yyy-MM-dd HH:mm:ss,GMT+8} %p %t - %m%n
</Pattern>
</layout>
</appender>
<Logger name="RocketmqCommon" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="RocketmqClientAppender"/>
</Logger>
<Logger name="RocketmqRemoting" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="RocketmqClientAppender"/>
</Logger>
<Logger name="RocketmqClient" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="RocketmqClientAppender"/>
<appender-ref ref="STDOUT"/>
</Logger>
</configuration>
有了自定义的Log配置,就可以根据实际情况,设置每个模块的输出Level,或者把日志输出到特定的位置。具体的设置方法可以参考Logback的日志配置文档:Chapter 3: Configuration 。