解决RocketMQ客户端日志问题

前言:由于项目使用rocketMQ消费数据,然后发现项目运行中会在用户主目录产生大量日志,导致本地c盘内存不足,测试服务器几次崩溃 (╬▔皿▔)╯

1.rocketMQ客户端日志配置了解

配置项 默认值 含义
rocketmq.client.log.loadconfig true 是否加载指定配置文件,当设置为 false 时,RocketMQ 客户端会会使用应用本身的日志配置,rocketmq.client.log4j.resource.fileName、rocketmq.client.logback.resource.fileName、 rocketmq.client.log4j2.resource.fileName三种日志框架的的配置文件名,默认值分别为 log4j_rocketmq_client.xml、logback_rocketmq_client.xml、log4j2_rocketmq_client.xml
rocketmq.client.log.configFile 日志配置文件路径
rocketmq.client.logRoot 用户主目录:$USER_HOME/Logs/rocketmqLogs 日志信息默认存放日志
rocketmq.client.logLevel INFO 日志输出级别
rocketmq.client.logFileMaxIndex 10 滚动窗口的索引最大值

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

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

2. rocketMQ客户端日志配置

由于该日志打印过多导致占内存,本来想要完全关闭日志,但经过多次测试,没有找到方法,于是选择了另一种方式,通过配置日志级别和修改日志路径的方式,以此减去很多没有意义的日志,减少内存消耗。

2.1 tomcat项目-启动命令添加配置项

由于业务项目是个老项目,用到的是tomcat,所以一开始想着在启动脚本添加一些配置项,这里衍生了两种方式

  • 修改tomcat安装目录下的bin文件夹里的catalina.sh
    由于这个方式修改了bin文件下的配置,不推荐,这里也不细讲

  • 添加系统环境变量JAVA_OPTS(需要有root权限)

    由于catalina.sh脚本里面提供了一些系统变量让我们增加自己的启动命令
    解决RocketMQ客户端日志问题_第1张图片

    #在/etc/profile 文件夹里添加配置
    JAVA_OPTS='-Drocketmq.client.logLevel=\"ERROR\" -Drocketmq.client.logRoot=/data'
    #添加完后就保存,然后执行下面命令更新配置
    source /etc/profile
    

    这样子重启后就可以看到启动命令里多了这两个启动参数

2.2 代码配置

在启动类添加代码块
System.setProperty("rocketmq.client.logLevel","ERROR");
System.setProperty("rocketmq.client.logRoot","自定义路径");

2.2.1 tomcat

由于tomcat没有启动入口,于是我选择了@Component+@PostConstruct的方式来实现,具体代码实现为:

import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ResourceBundle;

@Component
public class RocketMqClientConfig {

	// 只读取properties文件后缀的配置
    private static ResourceBundle bundle = ResourceBundle.getBundle("mqConfig");
    private static final String LOG_LEVEL = bundle.getString("mq.client.logLevel");
    private static final String LOG_ROOT = bundle.getString("mq.client.logRoot");

    @PostConstruct
    private void init() {
        // 没设置默认ERROR级别
        String logLevel = StrUtil.nullToDefault(LOG_LEVEL, "ERROR");
        System.setProperty("rocketmq.client.logLevel", logLevel);

        if (StringUtils.isNotEmpty(LOG_ROOT)) {
            // 没配置默认用户目录下
            System.setProperty("rocketmq.client.logRoot", LOG_ROOT);
        }
    }
}

2.2.2 springboot项目

注:本人没用springboot尝试该配置是否生效,但理论上是可行的,有需要的可以自己自测一番

public static void main(String[] args) {
        System.setProperty("rocketmq.client.logLevel","ERROR");
        System.setProperty("rocketmq.client.logRoot", "自定义路径");
        SpringApplication.run(XxlJobSpiderWebApplication.class, args);
    }

参考链接:
https://blog.csdn.net/xixingzhe2/article/details/124127361
https://blog.csdn.net/qq_38410795/article/details/121122513
https://blog.csdn.net/weixin_43931108/article/details/111316700

你可能感兴趣的:(Java,tomcat,rocketMQ,springboot)