1、日志配置
Spring Boot 默认使用 SLF4J+Logback 记录日志
1.1、日志级别
trace<debug<info<warn<error<fatal
序号 | 日志级别 | 说明 |
1 | trace | 追踪,指明程序运行轨迹 |
2 | debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用 |
3 | info | 输出重要的信息,使用较多 |
4 | warn | 警告,使用较多 |
5 | error | 错误信息,使用较多 |
1.2、日志格式化
序号 | 输出格式 | 说明 |
1 | %d{yyyy-MM-dd HH:mm:ss, SSS} | 日志生产时间,输出到毫秒的时间 |
2 | %-5level | 输出日志级别,-5 表示左对齐并且固定输出 5 个字符,如果不足在右边补 0 |
3 | %logger 或 %c | logger 的名称 |
4 | %thread 或 %t | 输出当前线程名称 |
5 | %p | 日志输出格式(日志等级) |
6 | %message 或 %msg 或 %m | 日志内容,即 logger.info(“message”) |
7 | %n | 换行符 |
8 | %class 或 %C | 输出 Java 类名 |
9 | %file 或 %F | 输出文件名 |
10 | %L | 输出错误行号 |
11 | %method 或 %M | |
12 | %l | 输出语句所在的行数, 包括类名、方法名、文件名、行数 |
13 | hostName | 本地机器名 |
14 | hostAddress | 本地 ip 地址 |
1.3、Spring Boot 日志默认级别
Spring Boot启动时随机抓取一条日志:
2023-04-04 14:16:39.094 INFO 14464 --- [ restartedMain] c.hqyj.mqreceiver.MqReceiverApplication : No active profile set, falling back to 1 default profile: "default"
通过控制台输出结果可知,Spring Boot 日志默认级别为 info,日志输出内容默认包含以下元素:
- 时间日期
- 日志级别
- 进程 ID
- 分隔符:—
- 线程名:方括号括起来(可能会截断控制台输出)
- Logger 名称
- 日志内容
1.4、application.properties配置
#日志级别 logging.level.com.hqyj.springboot=trace #使用相对路径的方式设置日志输出的位置(项目根目录目录\my-log\mylog\spring.log) logging.file.name=F:/springboot/logging/springboot.log #绝对路径方式将日志文件输出到 logging.file.path=F:/springboot/logging #控制台日志输出格式 logging.pattern.console=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} [%L] ${hostName} - %msg%n #日志文件输出格式 logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n
- logging.level.root=info指定整个系统的默认日志级别是info,日志级别统一化
- logging.level.com.zimug.boot.launch.controller=debug,指定某个特定的package的日志级别是debug,日志级别个性化。优先级角度,个性配置大于统一配置。
- logging.file.path将日志输出到指定目录,如果不指定logging.file.name,日志文件的默认名称是spring.log。配置了logging.file.name之后,logging.file.path配置失效。
- 无论何种设置,Spring Boot都会自动按天分割日志文件,也就是说每天都会自动生成一个新的log文件,而之前的会自动打成GZ压缩包。
1.5、日志文件大小
- 可以设置
logging.file.max-size=10MB分割的每个日志的文件最大容量,超过这个size之后日志继续分隔。 - 可以设置保留的日志时间
logging.file.max-history=10,以天为单位 - logging.pattern.file输出到文件中的日志的格式
- logging.pattern.console控制台输出日志的格式,为了在控制台调试时候显示效果更清晰,为日志增加了颜色。red、green等等
yml与xml的结合
########## 日志 配置 - START ########## spring: profiles: active: dev my: info: appName: springboot logging: config: classpath:logback-spring.xml # logback日志配置 yh: logFileHome: # 各个环境的配置文件目录 dev: F:/springboot/logging test: /www/wwwroot/yhApps/logs/ pro: /www/wwwroot/yhApps/logs/ pattern: "%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" maxHistory: 10 # 最大保存10个(天)的历史文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>springboot</contextName> <!-- 文件输出格式 --> <!--<property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />--> <springProperty scope="context" name="pattern" source="logging.yh.pattern"/> <!--最大历史日志文件数量--> <springProperty scope="context" name="maxHistory" source="logging.yh.maxHistory"/> <!--应用名称--> <springProperty scope="context" name="appName" source="my.info.appName"/> <!-- dev文件路径 --> <springProperty scope="context" name="devLogHome" source="logging.yh.logFileHome.dev"/> <!-- test文件路径 --> <springProperty scope="context" name="testLogHome" source="logging.yh.logFileHome.test"/> <!-- pro文件路径 --> <springProperty scope="context" name="proLogHome" source="logging.yh.logFileHome.pro"/> <!-- 开发环境 --> <springProfile name="dev"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${pattern}</pattern> </encoder> </appender> <!-- 每天产生一个文件 --> <appender name="CONSOLE-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 文件名称 --> <fileNamePattern>${devLogHome}/${appName}_log/debug.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 文件最大保存历史数量 --> <MaxHistory>${maxHistory}</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${pattern}</pattern> </layout> </appender> <logger name="com.hqyj" level="info"/> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE-FILE"/> </root> </springProfile> <!-- 测试环境 --> <springProfile name="test"> <!-- 每天产生一个文件 --> <appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 文件名称 --> <fileNamePattern>${testLogHome}/${appName}_log/info.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 文件最大保存历史数量 --> <MaxHistory>100</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${pattern}</pattern> </layout> </appender> <root level="info"> <appender-ref ref="TEST-FILE"/> </root> </springProfile> <!-- 生产环境 --> <springProfile name="pro"> <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${proLogHome}/${appName}_log/warn.%d{yyyy-MM-dd}.log</fileNamePattern> <MaxHistory>100</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${pattern}</pattern> </layout> </appender> <root level="warn"> <appender-ref ref="PROD_FILE"/> </root> </springProfile> </configuration>
1.6、在日志中添加IP
1.6.1、增加java文件,获取IP
/** * 日志中获取IP */ public class LogIpConfig extends ClassicConverter { private static String hostAddress; static{ try { hostAddress = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } } @Override public String convert(ILoggingEvent iLoggingEvent) { return hostAddress; } }
xml添加以下的代码:
<conversionRule conversionWord="hostAddress" converterClass="com.hqyj.springboot.common.LogIpConfig"> </conversionRule>
将日志格式修改成以下的格式
pattern: "%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] [%hostAddress] -| %msg%n"
2、Java代码中打印日志
使用@Slf4j注解引入日志
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @Slf4j @SpringBootTest class MqReceiverApplicationTests { @Test void contextLoads() { String user = "zhangsan"; log.info("Hello {}" , user); } }
效果:
2023-04-04 14:29:33.891 INFO 8224 — [ main] c.h.m.MqReceiverApplicationTests : Hello zhangsan