解决RocketMQ客户端日志问题
由于该日志打印过多导致占内存,本来想要完全关闭日志,但经过多次测试,没有找到方法,于是选择了另一种方式,通过配置日志级别和修改日志路径的方式,以此减去很多没有意义的日志,减少内存消耗。由于业务项目是个老项目,用到的是tomcat,所以一开始想着在启动脚本添加一些配置项,这里衍生了两种方式修改tomcat安装目录下的bin文件夹里的catalina.sh由于这个方式修改了bin文件下的配置,不推荐,
题外话
如果各位客官有需要开发一些小小需求,可以私我哦,承接小需求开发,或问题定位(仅限java),价格私聊哈
前言:由于项目使用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
- DEBUG:程序调试bug时使用。
- INFO:程序正常运行时使用。
- WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误。
- ERROR:程序出错误时使用,如:IO操作失败。
- CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使用。
2. rocketMQ客户端日志配置
由于该日志打印过多导致占内存,本来想要完全关闭日志,但经过多次测试,没有找到方法,于是选择了另一种方式,通过配置日志级别和修改日志路径的方式,以此减去很多没有意义的日志,减少内存消耗。
2.1 tomcat项目-启动命令添加配置项
由于业务项目是个老项目,用到的是tomcat,所以一开始想着在启动脚本添加一些配置项,这里衍生了两种方式
-
修改tomcat安装目录下的bin文件夹里的catalina.sh
由于这个方式修改了bin文件下的配置,不推荐,这里也不细讲 -
添加系统环境变量JAVA_OPTS(需要有root权限)
由于catalina.sh脚本里面提供了一些系统变量让我们增加自己的启动命令
#在/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
更多推荐


所有评论(0)