1、日志体系
1、日志体系示意图:Java 日志从入门到实战
- 日志框架:
- SpringBoot—>SLF4J + logback
- 最常用—> java common logging(JCL) + log4j
2、日志级别:
序号 | 日志级别 | 说明 |
---|---|---|
1 | trace | 追踪,指明程序运行轨迹。 |
2 | debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用。 |
3 | info | 输出重要的信息,使用较多。 |
4 | warn | 警告,使用较多。 |
5 | error | 错误信息,使用较多。 |
- 一般设置为debug就够用了!
3、概述:
Log 日志,主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等,也有利于将这些信息进行持久化(如果不将日志信息保存到文件或数据库,则信息便会丢失)。
- **日志:**就是介绍一个过程和经历的详细记录。
- **项目日志:**就是项目开发过程的详细记录,一般由项目经理记录。
- **代码里的日志:**就是程序员记录某个开发过程的详细情况,这是项目里每个程序员需要做的工作。
4、作用:
(1)查看程序当前运行状态
如果想了解程序当前的运行情况,我们通过实时查看应用日志的输出,就能进行分析。
比如,你在浏览器里输入一个 action 地址,该 url 负责执行一些批量处理,action 运行后,假设处理比较耗时,你再浏览器里无法直接看到程序的执行结果,此时,你可以打开系统日志,通过从日志输出信息就能轻松地分析该 url 的执行情况。
(2)查看程序历史运行轨迹
如果想了解历时程序的运行情况,我们通过查看应用历时日志的输出,就能进行分析。
比如,你想了解下上周周末用户访问量,你可以打开系统上周周末的日志记录,进行分析。你想了解昨天的某个定时任务是否正常执行,你可以打开昨天的系统日志,精确查找该定时任务的输出信息,从而判断定时任务是否执行。
(3)排查系统问题
排查系统问题是程序员最熟悉的味道了,在项目维护过程中,出了任何问题,都需要程序员去进行排查。此时,如果没有清楚明了的日志记录,想要核查出问题的原因,难于上青天。
一个优秀的程序员一定是个日志记录高手,如果日志记录的好,处理得当,排查问题则易如反掌。
大家有没有遇到一种场景,一个问题发生了,有的人能迅速定位问题并解决,有的人搞了半天,还没发现问题的产生原因。其实快速定位问题的人一定记录了详细的日志,因此当问题发生的时候,通过核查问题发生时候的日志,就能快速的找出问题产生的原因。
(4)优化系统性能
通过记录程序运行的时间,就能判断程序从执行开始到执行结束消耗的时间,从而判断系统性能是否达标,为系统性能优化提供判断依据。
(5)安全审计的基石
网络安全越来越受到大家的关注,所以系统安全目前是项目过程非常重要的一个环节,安全审计也是系统中非常重要的部分。
通过系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全隐患。
比如,大家平时都在做运营系统,其中运营人员在通过界面处理一些数据的时候,如果没有清楚的日志操作记录,一条数据被删除或者修改,你是无法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会一目了然。
综上:一个系统是否容易维护,很大程度上是基于程序员在程序开发过程中的代码日志是怎么记录的。
2、SpringBoot日志配置及输出
1、统一日志框架Spring Boot统一日志框架
通常一个完整的应用下会依赖于多种不同的框架,而且它们记录日志使用的日志框架也不尽相同,例如,Spring Boot(slf4j+logback),Spring(commons-logging)、Hibernate(jboss-logging)等等。
解决步骤:
- 排除应用中的原来的日志框架;
- 引入替换包替换被排除的日志框架;
- 导入 SLF4J 实现。
2、Spring Boot 提供的默认日志配置
- 测试日志输出【*】
package net.biancheng.www;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLoggingApplicationTests {
Logger logger = LoggerFactory.getLogger(getClass());
/**
* 测试日志输出
* SLF4J 日志级别从小到大trace>debug>info>warn>error
*/
@Test
void logTest() {
//日志级别 由低到高
logger.trace("trace 级别日志");
logger.debug("debug 级别日志");
logger.info("info 级别日志");
logger.warn("warn 级别日志");
logger.error("error 级别日志");
}
}
通过控制台输出结果可知,Spring Boot 日志默认级别为 info,日志输出内容默认包含以下元素:
(1)时间日期 —> (2)日志级别 —> (3)进程 ID —>(4)分隔符:— —> (5)线程名:方括号括起来(可能会截断控制台输出) —> (6)Logger 名称 —> (7)日志内容
3、配置文件详细规则SpringBoot项目通过yml文件配置日志
- logging.level 日志级别
- logging.file.path 绝对路径方式将日志文件地址
- logging.pattern.console #控制台日志输出格式
- logging.pattern.file #日志文件输出格式
- 简单配置文件
#日志级别
logging.level.net.biancheng.www=trace
#使用相对路径的方式设置日志输出的位置(项目根目录目录\my-log\mylog\spring.log)
#logging.file.path=my-log/myLog
#绝对路径方式将日志文件输出到 【项目所在磁盘根目录\springboot\logging\my\spring.log】
logging.file.path=/spring-boot/logging
#控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n
#日志文件输出格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n
- 完整配置文件【*】
# 服务端口
server:
port: 8080
# 服务名称
spring:
application:
name: myDemo-server
# 日志配置
logging:
# 日志级别
level:
root: info
file:
# 日志文件名格式
name: /logs/${spring.application.name}.log
pattern:
# 日志记录格式[组件名称] [时间戳] [日志级别] [类名.方法名] [消息文本]
file: myDemo %d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n
# 控制台日志输出格式
console: "%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
logback:
rollingpolicy:
# 根据文件大小归档,超过2KB自动归档,次日启动服务时也会自动归档
file-name-pattern: /logs/%d{yyyyMMdd}/${spring.application.name}.out.log.%d{yyyy-MM-dd}.%i.gz
# 最大日志文件大小(默认为10MB,这里为了测试归档,暂时设置为2KB)
max-file-size: 2KB
# 要保留的日志备份的总大小(默认为0B)
total-size-cap: 1GB
# 保存存档日志文件的最大天数(默认为7天)
max-history: 20
序号 | 输出格式 | 说明 |
---|---|---|
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 地址 |