在 SpringBoot 项目开发及线上运行中免不了使用日志,日志可以帮忙我们在开发和解决线上BUG时去定位问题,这篇文章主要带大家了解一下 SpringBoot 中日志如何使用及线上日志该怎么配置。
- 配置
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="undefined"/>
<!--用于生成一个标识,防止多个Docker容器映射到同一台宿主机上出现目录重复问题-->
<define name="index" class="org.golive.common.interfaces.utils.IpLogConversionRule"/>
<property name="LOG_HOME" value="/tmp/logs/${APP_NAME}/${index}"/>
<property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p] %-40.40logger{39} :%msg%n"/>
<!--控制台标准继续输出内容-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--日志输出的格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
</appender>
<!--INFO级别的日志,记录到对应的文件内-->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<!--滚动策略,日志生成的时候会按照时间来进行分类,例如2024-02-11日的日志,后缀就会有2024-02-11,每天的日志归档后的名字都不一样-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}</fileNamePattern>
<!--日志只保留1个月-->
<maxHistory>1</maxHistory>
</rollingPolicy>
<!--日志输出的格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}_error.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>1</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 根输出级别为INFO,控制台中将出现包含info及以上级别的日志-->
<!-- 日志输出级别 -->
<root level="INFO">
<!-- ref值与上面的appender标签的name相对应 -->
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
- logback.xml中使用IpLogConversionRule类获取IP,保证每个docker容器的日志挂载唯一性
import ch.qos.logback.core.PropertyDefinerBase;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ThreadLocalRandom;
/**
* 保证每个docker容器的日志挂载目录唯一性
*
*/
public class IpLogConversionRule extends PropertyDefinerBase {
@Override
public String getPropertyValue() {
return this.getLogIndex();
}
private String getLogIndex() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return String.valueOf(ThreadLocalRandom.current().nextInt(100000));
}
}
- DockerFile文件配置
FROM openjdk:17-jdk-alpine
VOLUME /tmp
ADD golive-user-provider-docker.jar app.jar
ENV JAVA_OPTS="\
-server \
-Xmx1g \
-Xms1g \
-Xmn256m"
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED -jar app.jar