一、常用日志框架介绍
1.1 应用中引入框架的必要性
在日常应用开发中,经常会进行日志的记录,如果仅仅使用 System.out.println();进行日志的打印输出,弊端是尤其明显的。
1.无法指定日志输出的地址,不利于日志的查看;
2.在服务器上部署应用时,则无法实时查看应用的运行情况等
引入日志框架主要目的就是为了更好的进行日志的管理,也便于在应用的正常运行过程中更好地监测运行情况等
1.2 常用的日志框架
Log4j :Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件
基金会的一个项目。 Log4j是几种Java日志框架之一。
Log4j 2 :Apache Log4j 2是apache开发的一款Log4j的升级产品。
Commons Logging :Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons
Logging,后更名为Commons Logging。
Slf4j :类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging
Facade for Java,缩写Slf4j)。
Logback: 一套日志组件的实现(Slf4j阵营)。
因为 slf4j 的优势与便捷,在日常的项目开发中,也使用最广。
二、SpringBoot整合slf4j
在构建了springboot工程项目后,如果在项目中已经引入了lombok依赖,则无需再引入额外的依赖
(**注:**如果对构建springboot工程项目有疑问的话,可以查看此专栏下的第一篇 – springboot项目的构建)
2.1 项目中已经引入lombok
此时,则只需要在需要打印日志的java类上加 @Slf4j 注解,便可开启
使用 log.info()、log.warn()、log.error()等根据不同的日志级别进行日志的打印输出
log.info("入参为: {} ",textMessage);
2.2 项目中未引入lombok
此时,则需要引入slf4j的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
在需要进行日志输出的类中创建出日志对象
@RestController
public class HelloWorld {
@Autowired
private HelloService helloService;
//在getLogger方法中传入该类的class对象
private final static Logger log = LoggerFactory.getLogger(HelloWorld.class);
@GetMapping("/hello")
public String sayHello(){
//根据不同的日志级别进行日志输出
log.info("hello world!")
return helloService.sayHello();
}
}
三、日志的输出管理
在项目中为了更好的进行日志管理、查看等,我们需要将日志输出到指定位置的文件中,此时,需要在项目中进
行相关的配置。
在resources目录下创建名为 logback.xml文件
<configuration scan="false" scanPeriod="60 seconds" debug="true">
<!--日志文件主目录:这里是当前目录下的logs目录下-->
<property name="LOG_HOME" value="./logs/"/>
<property name="maxHistory" value="30"/>
<property name="LOG_PATTERN" value="%d{HH:mm:ss:SSS}[%-5p] [%X{event}|%X{id}|%X{number}] %m %n"/>
<contextName>spring.application.name</contextName>
<!--设置日志输出为文件 根据日志级别进行不同级别日志文件的输出-->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}info.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}info.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<immediateFlush>true</immediateFlush>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}error.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件路径:这里%d{yyyyMMdd}表示按天分类日志-->
<fileNamePattern>${LOG_HOME}error.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<immediateFlush>true</immediateFlush>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="DEBUG">
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<!-- 多环境配置 按照active profile选择分支 -->
<springProfile name="dev">
<!--root节点 全局日志级别,用来指定最基础的日志输出级别 我本地测试,只记录error级别日志-->
<root level="info">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
<!-- 子节点向上级传递 局部日志级别
<logger level="WARN" name="org.springframework"/>
<logger level="WARN" name="com.netflix"/>
<logger level="DEBUG" name="org.hibernate.SQL"/>-->
</springProfile>
<springProfile name="test">
<!--root节点 全局日志级别,用来指定最基础的日志输出级别 我本地测试,只记录error级别日志-->
<root level="info">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
<!-- 子节点向上级传递 局部日志级别
<logger level="WARN" name="org.springframework"/>
<logger level="WARN" name="com.netflix"/>
<logger level="DEBUG" name="org.hibernate.SQL"/>-->
</springProfile>
<springProfile name="prod">
</springProfile>
</configuration>