Spring Boot项目使用slf4j+logback打印日志


多读多写多记录,多学多练多思考。----------- Banana.Banuit(香柚帮)


IDEA使用Maven构建微服务架构SpringBoot:https://blog.csdn.net/likun_li/article/details/88887293

日志记录对于一个工程来说是必不可少的,它能快速让你发现项目出现了什么问题,然后做出相应的对策和解决方案,那么下边大香蕉就说说在一个构建好Spring Boot工程中怎么使用slf4j+logback打印日志,由于spring-boot-starter-parent下边的spring-boot-dependencies里边已经引入了slf4j和logback的相关依赖,所以不用我们再去引入了,只需要配置logback就可以了,真的是超级方便。

 

 1. 在resources目录下创建logback-spring.xml文件

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">

	<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->

	<contextName>logback</contextName>
	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
	<!-- 日志存放目录 -->
	<property name="LOG_HOME" value="D:/dev/logs/questions" />

	<!-- 彩色日志 -->
	<!-- 彩色日志依赖的渲染类 -->
	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

	<!--
		%p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
		%r:输出自应用启动到输出该日志讯息所耗费的毫秒数
		%t:输出产生该日志事件的线程名
		%f:输出日志讯息所属的类别的类别名
		%c:输出日志讯息所属的类的全名
		%d:输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}
		%l:输出日志事件的发生位置,即输出日志讯息的语句在他所在类别的第几行。
		%m:输出代码中指定的讯息,如log(message)中的message
		%n:输出一个换行符号
	-->
	<!-- 彩色日志格式 -->
	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


	<!--
		Appender: 设置日志信息的去向,常用的有以下几个
			ch.qos.logback.core.ConsoleAppender (控制台)
			ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
			ch.qos.logback.core.FileAppender (文件)
	-->
	<!--输出到控制台-->
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>info</level>
		</filter>
		<encoder>
			<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
			<!-- 设置字符集 -->
			<charset>UTF-8</charset>
		</encoder>
	</appender>


	<!--输出到文件-->

	<!-- 时间滚动输出 level为 DEBUG 日志 -->
	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${LOG_HOME}/log_debug.log</file>
		<!--日志文件输出格式-->
		<encoder>
			<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符 -->
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
			<charset>UTF-8</charset> <!-- 设置字符集 -->
		</encoder>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 日志归档 -->
			<fileNamePattern>${LOG_HOME}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<!-- 除按日志记录之外,还配置了日志文件不能超过100M,若超过100M,日志文件序号+1 -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!--日志文件保留天数-->
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<!-- 此日志文件只记录debug级别的 -->
		<!-- LevelFilter: 级别过滤器,根据日志级别进行过滤 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>debug</level>
			!-- 用于配置符合过滤条件的操作 ACCEPT:日志会被立即处理,不再经过剩余过滤器 -->
			<onMatch>ACCEPT</onMatch>
			<!-- 用于配置不符合过滤条件的操作 DENY:日志将立即被抛弃不再经过其他过滤器 -->
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

	<!-- 时间滚动输出 level为 INFO 日志 -->
	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${LOG_HOME}/log_info.log</file>
		<!--日志文件输出格式-->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
			<charset>UTF-8</charset>
		</encoder>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 每天日志归档路径以及格式 -->
			<fileNamePattern>${LOG_HOME}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!--日志文件保留天数-->
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<!-- 此日志文件只记录info级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>info</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

	<!-- 时间滚动输出 level为 WARN 日志 -->
	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${LOG_HOME}/log_warn.log</file>
		<!--日志文件输出格式-->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_HOME}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!--日志文件保留天数-->
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<!-- 此日志文件只记录warn级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>warn</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>


	<!-- 时间滚动输出 level为 ERROR 日志 -->
	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${LOG_HOME}/log_error.log</file>
		<!--日志文件输出格式-->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_HOME}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!--日志文件保留天数-->
			<maxHistory>15</maxHistory>
		</rollingPolicy>
		<!-- 此日志文件只记录ERROR级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

	<!--
		<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
		<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
		name:用来指定受此logger约束的某一个包或者具体的某一个类。
		level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
			  还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
			  如果未设置此属性,那么当前logger将会继承上级的级别。
		addtivity:是否向上级logger传递打印信息。默认是true。
		<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
	-->
	<!--<logger name="org.springframework.web" level="info"/>-->
	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
	<!--
		使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
		第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
		第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
	 -->


	<!--
		root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
		level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
		不能设置为INHERITED或者同义词NULL。默认是DEBUG
		可以包含零个或多个元素,标识这个appender将会添加到这个logger。
	-->

	<!--开发环境:打印控制台-->
	<springProfile name="dev">
		<logger name="com.banuit.questions" level="debug"/>
	</springProfile>

	<!-- 日志输出级别 开发环境DEBUG 生产环境INFO -->
	<root level="DEBUG">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="DEBUG_FILE" />
		<appender-ref ref="INFO_FILE" />
		<appender-ref ref="WARN_FILE" />
		<appender-ref ref="ERROR_FILE" />
	</root>

	<!--生产环境:输出到文件-->
	<!--<springProfile name="pro">-->
	<!--<root level="info">-->
	<!--<appender-ref ref="CONSOLE" />-->
	<!--<appender-ref ref="DEBUG_FILE" />-->
	<!--<appender-ref ref="INFO_FILE" />-->
	<!--<appender-ref ref="ERROR_FILE" />-->
	<!--<appender-ref ref="WARN_FILE" />-->
	<!--</root>-->
	<!--</springProfile>-->

</configuration>

2. 配置好logback.xml之后就写一个方法测试一下吧。

在java目录下的com.banuit.questions.controller下创建HelloController.java文件

package com.banuit.questions.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 经典Hello World
 * @author banana
 * @date 2019/7/17 16:16
 */
@RestController
@RequestMapping(value = "/hello")
public class HelloController {

    /*
    (1)出于资源利用的考虑,用static修饰的变量归这个类使用,不论这个类实例化多少个,大家用的都是同一个static变量
    而日志记录的是当前类的日志,不是每个实例的日志,所以一个类只要一个Logger就可以了
    (2)用final修饰不做修改的变量,表示一种编程习惯,表示该类的Logger只是记录该类的信息,否则日志会无法提供可以令人信服的记录
    */
    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

    @RequestMapping(value = "/say",method = RequestMethod.GET)
    public String say() throws Exception{
        logger.info("[say方法start][大家跟我说Hello World][入参无]");
        long methodStartTime = System.currentTimeMillis();

        String everybodySay = "Hello World!";
        Thread.sleep(1000);             //睡眠1s,为了更直观的查看方法耗时

        long methodEndTime = System.currentTimeMillis();
        logger.info("[say方法end][大家跟我说Hello World][出参:everybodySay={}][方法耗时:{}秒]",everybodySay,(methodEndTime-methodStartTime)/1000F);
        return everybodySay;
    }
}

3. 启动项目,在浏览器输入http://localhost:8080/hello/say,分别查看控制台输出日志和文档日志。

页面

控制台

 文档日志,配置文件里边保存在D:/dev/logs/questions文件夹下

打开log_info.log

 附上一篇Java日志框架详解,有助于大家了解各个日志框架

https://blog.csdn.net/kingmax54212008/article/details/82805548

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用logback打印日志非常简单,只需要以下几个步骤: 1. 添加依赖 在pom.xml文件中添加logback的依赖 ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` 2. 配置logback.xml 在src/main/resources下新建logback.xml文件,配置logback日志输出格式和输出位置等信息。 例如,以下是一个简单的logback.xml配置文件: ```xml <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="com.example" level="DEBUG"/> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration> ``` 其中,`appender`定义了日志输出的方式,这里使用的是`ConsoleAppender`,即输出到控制台;`encoder`定义了日志的输出格式;`logger`定义了日志输出的级别,这里设置为DEBUG级别;`root`定义了日志输出的根级别,这里设置为INFO级别。 3. 在应用程序中使用logback 在需要打印日志的类中使用logback即可,例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); public void doSomething() { logger.debug("Debug log"); logger.info("Info log"); logger.warn("Warn log"); logger.error("Error log"); } } ``` 这里使用了`LoggerFactory.getLogger()`方法获取Logger对象,然后使用`debug()`、`info()`、`warn()`和`error()`等方法输出不同级别的日志信息。 以上就是在Spring Boot使用logback打印日志的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值