目录
4.2、通过 logback-spring.xml 进行自定义配置(推荐)
1、日志文件的作用
- 程序报错时可以发现并解决问题。
- 记录用户登录日志,分析用户是否是正常登录。
- 记录系统操作日志,方便数据恢复和定位操作人。
- 记录程序执行时间,方便为以后优化程序提供数序支持。
2、日志的使用
2.1、从程序中得到日志对象
例如,在自定义类(假设类名为LogController)中,在程序中使需要使用日志工厂 LoggerFactory 先获取日志对象(日志在程序运行期间只加载一次,并且不可变,需要使用static和final),如下:
//获取日志对象
private static final Logger log = LoggerFactory.getLogger(LogController.class);
Ps:logger 对象是属于 org.slf4j 包下!
2.2、使用日志
日志打印的方式有很多种,例如使用 error 方法,如下:
//打印日志
private void printLog() {
log.error("这是一个error");
}
执行效果如下:
日志里面这些都表示什么意思呢?
接着往下看~
2.3、日志格式
3、日志级别
3.1、这样的日志级别有什么用?
- 筛选出重要信息,例如在配置文件中设置级别为 warn ,那么你就只能看到warn以及比特级别更高的日志信息了(error、fatal)。
- 控制不同环境下的日志信息,例如开发环境需要很详细的信息,而生产环境为了性能和安全性就会输入尽量少的日志。
3.2、日志级别分类和使用
日志级别从高到低,如下:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
3.3、日志级别设置
日志输出的默认级别是 info ,如果想要手动配置,可以在配置配置文件中设置logging.level配置即可,如下:
logging:
level:
root: error
以上是对所有包下的日志级别有效(root也就是根目录),若想要设置指定某一包下的有效,就需要在level下加上路径(路径以java文件为起始位置),如下:
4、日志持久化的两种方式
4.1、通过 application.yml 配置日志
在生产环境下需要将日志信息保留下来,便于出现问题以后容易追溯问题,将日志保存下来这个活动叫做日志持久化。
如何进行日志持久化?我们只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名即可,如下
a)绝对路径
logging:
pattern:
dateformat: HH:mm:ss # 日期格式
level: # 监控哪个包下的日志
com:
example:
javanav: debug # 日志级别(低于他的就不显示了)
file: # 持久化保存
path: D:/logs # ⽇志保存⽬录
Ps:如果没有指定文件名,就会默认生成一个 spring.log 文件
b)相对路径:会在当前项目的根目录下生成这个日志文件(下面的配置就是在当前项目根目录下创建 logs 文件夹,最后日志就会生成在这个里面)
logging:
pattern:
dateformat: HH:mm:ss # 日期格式
level: # 监控哪个包下的日志
com:
example:
javanav: debug # 日志级别(低于他的就不显示了)
file: # 持久化保存
path: logs # ⽇志保存⽬录
Ps:在没有指定文件名两次保存或者指定相同文件名进行两次保存的情况下,第二次保存的日志信息会追加到第一次保存的文件下,而不是覆盖掉上一此保存的日志信息。值得注意的是日志文件的大小一般都有上限(文件太大,有可能导致加载过慢),当然也可以自己手动设置文件大小的上限
4.2、通过 logback-spring.xml 进行自定义配置(推荐)
如果需要进行更复杂的自定义配置,就需要使用到 logback 了.
Spring Boot
官方推荐优先使用带有- spring
的文件名作为你的日志配置(如使用logback-spring.xml
,而不是logback.xml
,命名为 logback-spring.xml
的日志配置文件,spring boot
可以为它添加一些 spring boot
特有的配置项(下面会提到)。
默认的命名规则,并且放在 src/main/resources
下面即可
如果你即想完全掌控日志配置,但又不想用logback.xml
作为Logback
配置的名字,application.yml
可以通过logging.config
属性指定自定义的名字:
logging.config=classpath:logging-config.xml
a)使用到的依赖就是 springboot starter 和 lombok 依赖.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
b)配置信息如下:
<configuration>
<!-- 用来定义变量,name 就是属性,value 就是值,可以在需要的地方引入 name,实现复用 -->
<!-- Ps: 这里实际上就是在配置日志文文件输出的位置 -->
<property name="LOG_HOME" value="logs"/>
<!-- 引入spirng boot默认的logback配置文件(主要用他来输出彩色的控制台) -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,
常用就是控制台输出策略和文件输出策略。
-->
<!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<charset>utf8</charset>
<!--默认格式输出: 使用彩色面板-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名和位置: 可以使用相对路径或者绝对路径,如果是相对路径,会直接在当前项目根目录下生成-->
<fileNamePattern>${LOG_HOME}/readJson.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!-- <totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--
root 标签是必须存在的,并且必须放在最后配置. 用来指定最基础的日志输出级别,只有一个level属性(级别最低是 info,否则报错)
可以包含零个或多个元素,appender-ref 就是在声明需要使用到哪些自定义配置,最后添加到这个logger。
-->
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
5、更简单的日志输出——lombok
5.1、对比
如果不使用lombok,我们创建和使用日志对象需要如下步骤:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody //返回的使页面不是文本
public class LogController {
//获取日志对象
private static final Logger log = LoggerFactory.getLogger(LogController.class);
//打印日志
@RequestMapping("/hi")
private void printLog() {
log.error("这是一个error");
}
}
如果使用lombok,我们创建和使用日志对象需要如下步骤:
a)首先需要添加如下依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
b)使用lombok:
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@Slf4j
public class LogEasyController {
@RequestMapping("/hi/easy")
private void printLog() {
log.error("这是一个error");
}
}
对比图:
5.2、lombok的实现原理
我们的Java程序在IDEA中执行完后,都会编译生成一个target文件,这个文件就是项目最终执行的代码(去掉注释等一系列工作后的文件),那么想要知道lombok的实现原理,就需要去观察这个文件~
也就是说lombok的实现原理就是在编译阶段加上了我们原本需要的代码~
Java程序运行原理:
使用Lombok后的Java运行原理:
5.3、lombok更多的注解说明
注解 | 作用 |
---|---|
@Getter | ⾃动添加 getter ⽅法 |
@Setter | 动添加 setter ⽅法 |
@ToString | ⾃动添加 toString ⽅法 |
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode ⽅法 |
@Slf4 | 添加⼀个名为 log 的⽇志,使⽤ slf4j |
@NoArgsConstructor | ⾃动添加⽆参构造⽅法 |
@AllArgsConstructor | ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法,final + @NonNull 的 属性为必需 |
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |