1、默认路径
项目添加RocketMQ以后启动项目时会在user.home
下创建一个rocketmq_client.log
日志文件,文件全路径是:${user.home}/logs/rocketmqlogs/rocketmq_client.log
。由于我们的服务器数据盘不在home路径下,会导致系统盘空间占用不断增大,所以需要配置日志目录到其他路径。
通过源码org.apache.rocketmq.client.log.ClientLogger
可以看到,在项目启动时会读取是否启动slf4j配置,读取的配置名称是:rocketmq.client.logUseSlf4j
,如果是则会直接获取logger名称为RocketmqClient,Appender名称为RocketmqClientAppender
的配置,以下是源码:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.apache.rocketmq.client.log;
import org.apache.rocketmq.logging.InternalLogger;
import org.apache.rocketmq.logging.InternalLoggerFactory;
import org.apache.rocketmq.logging.InnerLoggerFactory.InnerLogger;
import org.apache.rocketmq.logging.inner.Appender;
import org.apache.rocketmq.logging.inner.Layout;
import org.apache.rocketmq.logging.inner.Level;
import org.apache.rocketmq.logging.inner.Logger;
import org.apache.rocketmq.logging.inner.LoggingBuilder;
import org.apache.rocketmq.logging.inner.LoggingEvent;
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 = Boolean.parseBoolean(System.getProperty("rocketmq.client.logUseSlf4j", "false"));
public ClientLogger() {
}
private static synchronized Appender createClientAppender() {
String clientLogRoot = System.getProperty("rocketmq.client.logRoot", System.getProperty("user.home") + "/logs/rocketmqlogs");
String clientLogMaxIndex = System.getProperty("rocketmq.client.logFileMaxIndex", "10");
String clientLogFileName = System.getProperty("rocketmq.client.logFileName", "rocketmq_client.log");
String maxFileSize = System.getProperty("rocketmq.client.logFileMaxSize", "1073741824");
String asyncQueueSize = System.getProperty("rocketmq.client.logAsyncQueueSize", "1024");
String logFileName = clientLogRoot + "/" + clientLogFileName;
int maxFileIndex = Integer.parseInt(clientLogMaxIndex);
int queueSize = Integer.parseInt(asyncQueueSize);
Layout layout = LoggingBuilder.newLayoutBuilder().withDefaultLayout().build();
Appender rocketmqClientAppender = LoggingBuilder.newAppenderBuilder().withRollingFileAppender(logFileName, maxFileSize, maxFileIndex).withAsync(false, queueSize).withName("RocketmqClientAppender").withLayout(layout).build();
Logger.getRootLogger().addAppender(rocketmqClientAppender);
return rocketmqClientAppender;
}
private static InternalLogger createLogger(String loggerName) {
String clientLogLevel = System.getProperty("rocketmq.client.logLevel", "INFO");
boolean additive = "true".equalsIgnoreCase(System.getProperty("rocketmq.client.log.additive"));
InternalLogger logger = InternalLoggerFactory.getLogger(loggerName);
InnerLogger innerLogger = (InnerLogger)logger;
Logger realLogger = innerLogger.getLogger();
realLogger.addAppender(new ClientLogger.AppenderProxy());
realLogger.setLevel(Level.toLevel(clientLogLevel));
realLogger.setAdditivity(additive);
return logger;
}
public static InternalLogger getLog() {
return CLIENT_LOGGER;
}
static {
if (!CLIENT_USE_SLF4J) {
InternalLoggerFactory.setCurrentLoggerType("inner");
CLIENT_LOGGER = createLogger("RocketmqClient");
createLogger("RocketmqCommon");
createLogger("RocketmqRemoting");
} else {
CLIENT_LOGGER = InternalLoggerFactory.getLogger("RocketmqClient");
}
}
static class AppenderProxy extends Appender {
private Appender proxy;
AppenderProxy() {
}
protected void append(LoggingEvent event) {
if (null == this.proxy) {
this.proxy = ClientLogger.createClientAppender();
}
this.proxy.doAppend(event);
}
public void close() {
if (null != this.proxy) {
this.proxy.close();
}
}
}
}
2、修改路径
package com.ybw.rocketmq.demo;
import org.apache.rocketmq.client.log.ClientLogger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RocketmqDemoApplication {
public static void main(String[] args) {
System.setProperty(ClientLogger.CLIENT_LOG_USESLF4J,"true");
SpringApplication.run(RocketmqDemoApplication.class, args);
}
}
添加完以上代码后,然后在配置日志的输出,logback.xml作为日志输出,具体配置如下:
<!-- ROCKETMQ START -->
<appender name="RocketmqClientAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME:-c:/}logs/mq/rocketmq_client.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME:-c:/}logs/mq/rocketMQclient-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 日志文件最大尺寸 -->
<maxFileSize>200MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>10</MaxHistory>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%level %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%logger{0}] [%X{traceId}] [%msg]%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>
<logger name="RocketmqClient" additivity="false">
<!-- 这里可以按需配置日志级别 -->
<level value="ERROR" />
<appender-ref ref="RocketmqClientAppender"/>
</logger>
<!-- ROCKETMQ END -->
根据自己的情况配置日志级别。
3、日志级别
日志一共分成5个等级,从低到高分别是:
- DEBUG:程序调试bug时使用。
- INFO:程序正常运行时使用。
- WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误。
- ERROR:程序出错误时使用,如:IO操作失败。
- CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使用。
默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。
日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < CRITICAL。