RocketMQ -日志文件路径、级别的配置

1 问题背景

1、RocketMQ引入之后,生成和消费数据产生大量日志,导致磁盘内存不足。需要提高日志输出级别

2、修改RocketMQ的日志路径

2 原理

RocketMQ日志配置可参考源码:org.apache.rocketmq.client.log.ClientLogger

public class ClientLogger {

    public static final String CLIENT_LOG_USESLF4J = "rocketmq.client.logUseSlf4j";
    public static final String CLIENT_LOG_ROOT = "rocketmq.client.logRoot";
    public static final String CLIENT_LOG_MAXINDEX = "rocketmq.client.logFileMaxIndex";
    public static final String CLIENT_LOG_FILESIZE = "rocketmq.client.logFileMaxSize";
    public static final String CLIENT_LOG_LEVEL = "rocketmq.client.logLevel";
    public static final String CLIENT_LOG_ADDITIVE = "rocketmq.client.log.additive";
    public static final String CLIENT_LOG_FILENAME = "rocketmq.client.logFileName";
    public static final String CLIENT_LOG_ASYNC_QUEUESIZE = "rocketmq.client.logAsyncQueueSize";
    public static final String ROCKETMQ_CLIENT_APPENDER_NAME = "RocketmqClientAppender";

    private static final InternalLogger CLIENT_LOGGER;

    private static final boolean CLIENT_USE_SLF4J;

    //private static Appender rocketmqClientAppender = null;

    static {
        CLIENT_USE_SLF4J = Boolean.parseBoolean(System.getProperty(CLIENT_LOG_USESLF4J, "false"));
        if (!CLIENT_USE_SLF4J) {
            InternalLoggerFactory.setCurrentLoggerType(InnerLoggerFactory.LOGGER_INNER);
            CLIENT_LOGGER = createLogger(LoggerName.CLIENT_LOGGER_NAME);
            createLogger(LoggerName.COMMON_LOGGER_NAME);
            createLogger(RemotingHelper.ROCKETMQ_REMOTING);
        } else {
            CLIENT_LOGGER = InternalLoggerFactory.getLogger(LoggerName.CLIENT_LOGGER_NAME);
        }
    }

rocketmq默认不使用logback日志,需要额外配置,使mq使用logback配置

日志级别
DEBUG < INFO < WARNING < ERROR < CRITICAL

DEBUG:程序调试bug时使用。
INFO:程序正常运行时使用。
WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误。
ERROR:程序出错误时使用,如:IO操作失败。
CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使用

如果日志太多,占用磁盘空间过大,INFO级别的日志绝大多数情况下没有参考价值,所以可以修改RocketMQ的日志输出级别,只有ERROR级别的才会输出。

3 解决方案

3.1 服务启动参数配置

命令:

// 修改日志级别为ERROR
java -jar -Drocketmq.client.logLevel=ERROR xx.xx.jar

// 修改日志配置使用slf4j
java -jar -Drocketmq.client.logUserSlf4j=true xx.xx.jar

这种方式非常简便,但是不灵活,生产环境需要找运维修改启动脚本,而且个性化的日志配置不支持。
 

3.2 修改日志级别

org.apache.rocketmq.client.log.ClientLogger中,默认的日志级别是INFO:

 private static InternalLogger createLogger(final String loggerName) {
        String clientLogLevel = System.getProperty(CLIENT_LOG_LEVEL, "INFO");
        boolean additive = "true".equalsIgnoreCase(System.getProperty(CLIENT_LOG_ADDITIVE));
        InternalLogger logger = InternalLoggerFactory.getLogger(loggerName);
        InnerLoggerFactory.InnerLogger innerLogger = (InnerLoggerFactory.InnerLogger) logger;
        Logger realLogger = innerLogger.getLogger();

        //if (rocketmqClientAppender == null) {
        //   createClientAppender();
        //}

        realLogger.addAppender(new AppenderProxy());
        realLogger.setLevel(Level.toLevel(clientLogLevel));
        realLogger.setAdditivity(additive);
        return logger;
    }

 如果只需要修改RocketMQ日志级别,可以只修改启动类,修改级别配置参数:

System.setProperty("rocketmq.client.logLevel","ERROR");

日志配置文件logback.xml,统一修改日志路径及大小,所以建议用下面这种方法。

3.3 修改日志路径

org.apache.rocketmq.client.log.ClientLogger中,默认是不使用Slf4j

static {
        CLIENT_USE_SLF4J = Boolean.parseBoolean(System.getProperty(CLIENT_LOG_USESLF4J, "false"));
        if (!CLIENT_USE_SLF4J) {
            InternalLoggerFactory.setCurrentLoggerType(InnerLoggerFactory.LOGGER_INNER);
            CLIENT_LOGGER = createLogger(LoggerName.CLIENT_LOGGER_NAME);
            createLogger(LoggerName.COMMON_LOGGER_NAME);
            createLogger(RemotingHelper.ROCKETMQ_REMOTING);
        } else {
            CLIENT_LOGGER = InternalLoggerFactory.getLogger(LoggerName.CLIENT_LOGGER_NAME);
        }
    }

1、启动类中增加配置信息,修改RocketMQ的日志使用slf4j:

System.setProperty("rocketmq.client.logUseSlf4j","true");

2、logback.xml中增加日志配置参数

<appender name="RocketmqClientAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
            <file>${LOG_PATH}/${APP_NAME}/rocketmq/rocketmq_client.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>${LOG_PATH}/${APP_NAME}/rocketmq/rocketmq_client.%i.log</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
            </rollingPolicy>
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>64MB</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>

<logger name="RocketmqClient" additivity="false" level="WARN">
       <appender-ref ref="RocketmqClientAppender"/>
</logger>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值