打印日志,很普通的功能,java 里的日志框架很多 (因为历史久吧), 对于多数人选择一种主流方式记录 log 就行,这里介绍使用 logback 。(如果有自己的偏好,用自己的没问题)
spring-boot 默认集成了 logback, 不需要添加依赖。
- 首先添加 src/resources/logback.xml 配置文件,内容类似:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--设置存储路径变量-->
<property name="log_home" value="./logs"/>
<property name="app" value="mars" />
<!--控制台输出appender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--设置输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread] %logger{50}:%L - %msg%n</pattern>
<!--设置编码-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--文件输出,时间窗口滚动-->
<appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->
<File>${log_home}/${app}.log</File>
<!--文件滚动模式-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩-->
<FileNamePattern>${log_home}/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>10</MaxHistory>
<!--按大小分割同一天的-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread] %logger{50}:%L - %msg%n</pattern>
<!--设置编码-->
<charset>UTF-8</charset>
</encoder>
<!-- 设置某种 log 的输出级别, 避免干扰 -->
<logger name="io.micrometer.datadog" level="ERROR"/>
</appender>
<!--指定基础的日志输出级别-->
<root level="INFO">
<!--appender将会添加到这-->
<appender-ref ref="console"/>
<appender-ref ref="timeFileOutput"/>
</root>
<logger name="net.sf.ehcache" level="ERROR"/>
<logger name="io.micrometer.datadog" level="ERROR"/>
</configuration>
- 在 application.yml 里使用 logback.xml
# src/resources/application.yml
logging:
config: classpath:logback.xml
3. 在 logback.xml 定义了一个 log 存储目录, , 在当前项目下建一个 logs 文件夹。这里只在 gitee 的项目里上传 logs 文件夹,不上传 log 文件也到 gitee。
有个技巧,在 logs 文件夹加中建一个空文件 ./logs/.empty
在 .gitignore 文件忽略 ./logs 文件夹,但不忽略 .empty 文件
.gitignore
# .gitignore, 忽略 logs 文件夹,除 .empty 文件
/logs/*
!/logs/.empty
4. 在代码里打印一下log
@CrossOrigin
@RestController
public class InfoController {
Logger logger = LoggerFactory.getLogger(getClass());
...
@GetMapping("/")
public Map<String, Object> info() {
logger.info("access info endpoint (/)");
...
}
}
启动一下项目 mvn clean spring-boot:run
看一下 log 输出
2025-01-04 18:51:56 | INFO | [http-nio-8083-exec-2] c.v.saber.mars.controller.InfoController:29 - access info endpoint (/)
相关源码 gitee.com/yren/mars