1.打印日志的目的
在日常开发中,会遇到不同的异常,日志方便我们去排查处理。
2.SpringBoot的日志
在SpringBoot的web启动依赖中包含
有关于logging中的三个框架。分别为slf4j
、logback
、log4j
3.slf4j、logback、log4j三者有何关系
3.1 slf4j (Simple logging Facade for Java)
意为简单日志门面,它只是一个接口,不实现日志的具体功能,为日志系统提供一套标准的调用api。日志的格式,记录级别,输出方式等功能都要通过具体的日志系统来完成,日志系统有log4j、logback、java.util.logger等。
3.2 为什么使用slf4j
- slf4j只是一个提供统一接口的api,实现调用和具体实现的分离,如:之前使用的lombok,因需求需更换为log4j,只需更换jar包即可
- slf4j日志输出时可以使用{}占位符,如,logger.info(“testlog: {}”, “test”),而如果只使用log4j做日志输出时,只能以logger.info(“testlog:”+“test”)这种形式,前者要比后者在性能上更好,后者采用+连接字符串时就是new 一个String 字符串,在性能上就不如前者。
3.2 log4j(log for java)
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
3.3 logback
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现(即直接实现了slf4j的接口,而log4j并没有直接实现,所以就需要一个适配器slf4j-log4j12.jar),logback一共有以下几个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
总结
slf4j提供其接口,log4j、logback等日志系统具体实现,
4.Spring的日志搭配
SpringBoot2.x以后,默认采用slf4j+logback实现日志功能;具体实现如:
@RestController
public class LogController {
@Autowired
private UserServiceImpl userService;
@Autowired
private UserContfiguration userContfiguration;
private static Logger logger = LoggerFactory.getLogger(LogController.class);
@GetMapping("/log")
public String logTest(){
logger.trace("====trace====");
logger.debug("====debug====");
logger.info("====info====");
logger.warn("====warn====");
logger.error("====error====");
return "log";
}
}
5.日志级别
tarce > debug > info > warn > error
注:
SpringBoot默认级别为:info
logger.trace("====trace====");
logger.debug("====debug====");
logger.info("====info====");
logger.warn("====warn====");
logger.error("====error====");
6.日志配置
6.1 配置日志级别
全局配置
# 指定日志级别,将springboot日志级别改为debug
logging:
level:
root: debug
局部配置
# 指定日志级别,将springboot日志级别改为debug
logging:
level:
com
liyi: debug
6.2 日志文件和格式配置
日志输出文件:默认为关闭
在开发中建议大家是打开,不打开也没有关闭,你可以项目发布制定日志输出的文件:
nohup java -jar xxxx.jar >>log.txt &
使用path
的方式
logging:
level:
root: debug
file:
# 如果不想把日志存放在logging.file.path目录下,可以采用name来重新定义存储的位置和日志文件的名称
name: /www/logs/pro.log
pattern:
# file 是指日志文件中日志的格式
file: "【liyi-file】%d{yyyy/MM/dd-HH:mm:ss} -- [%thread] %-5level %logger{50} -- %M - %msg%n"
# console是控制台的日志的格式
# console: "【liyi-console】%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger{50} --%M- %msg%n"
日志格式:
%c 输出logger名称
%C 输出类名
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M或%method 输出所在方法名
%l 输出完整的错误位置, 包括类名、方法名、文件名、行数
%p 该条日志的优先级
%replace{pattern}{regex}{substitution} 将pattern的输出结果pattern按照正则表达式regex替换成substitution
7.lombok优化日志
在lombok中提供两个日志注解:Slf4j
和Log4j2
,建议开发使用Log4j
前提:安装lombok插件和导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
具体实现:
@Slf4j
@Service
public class UserServiceImpl {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private Integer age;
@Value("${user.addr}")
private String addr;
public UserInfo getUserInfo() {
return new UserInfo(name, age, addr);
}
public void testLog(UserInfo userInfo) {
try {
System.out.println(1/0);
log.info("当前支付的用户是:{},地址:{},年龄是:{}", userInfo.getName(), userInfo.getAddr(), userInfo.getAge());
} catch (Exception ex) {
log.error("获取用户信息异常,异常是:{}",ex.getMessage());
}
}
}
8.在开发中日志级别隔离
开发环境建议:debug或info
生产环境建议:error
application-dev.yml
开发环境:一般就在控制台打印即可,写文件着实没有任何意义。 日志级别是:debug
server:
port: 9999
# 指定日志级别 把springboot的所有日志修改成为debug
logging:
level:
root: debug
pattern:
# console是控制台的日志的格式
console: "【liyi-console】%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger{50} --%M- %msg%n"
application-prod.yml
开发环境:一般就在控制台打印即可,写文件着实没有任何意义。 日志级别是:error
server:
port: 80
# 指定日志级别 把springboot的所有日志修改成为debug
logging:
level:
root: error
file:
# 如果不想把日志存放在logging.file.path目录下,可以采用name来重新定义存储的位置和日志文件的名称
name: /www/logs/kuangstudypro.log
pattern:
# file 是指日志文件中日志的格式
file: "【KuangStudy-file】%d{yyyy/MM/dd-HH:mm:ss} -- [%thread] %-5level %logger{50} -- %M - %msg%n"
application.yml
# 环境激活
spring:
profiles:
active: dev
##该博客的中心思想是养成总结写博客的习惯…