springboot整合logback

1. 什么是日志?
一个著名的日志是怎么产生的
架构师必备,带你弄清混乱的JAVA日志体系

2.SpringBoot的日志整合:

​ Spring Boot使用Commons Logging进行所有内部日志记录,但将底层日志实现保持打开状态。为Java Util Logging,Log4J2和 Logback提供了默认配置 。在每种情况下,记录器都预先配置为使用控制台输出,并提供可选的文件输出。默认情况下,如果您使用“Starters”,则使用Logback进行日志记录

默认情况下,springboot 整合了logback以及slf4j无需另外引入依赖


2.1 添加配置文件 logback-spring.xml在resource路径下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
		</filter>
		<encoder>
			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>

	<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高, 所以我们使用下面的策略,可以避免输出 Error 的日志-->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<!--过滤 Error-->
			<level>ERROR</level>
			<!--匹配到就禁止-->
			<onMatch>DENY</onMatch>
			<!--没有匹配到就允许-->
			<onMismatch>ACCEPT</onMismatch>
		</filter>
		<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
		<!--<File>logs/info.spring-boot-demo-logback.log</File>-->
		<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
			<FileNamePattern>logs/info.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
			<!--只保留最近90天的日志-->
			<maxHistory>90</maxHistory>
			<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
			<!--<totalSizeCap>1GB</totalSizeCap>-->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
				<maxFileSize>2MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
		<!--<maxFileSize>1KB</maxFileSize>-->
		<!--</triggeringPolicy>-->
		<encoder>
			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
	</appender>

	<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>Error</level>
		</filter>
		<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
		<!--<File>logs/error.spring-boot-demo-logback.log</File>-->
		<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
			<FileNamePattern>logs/error.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
			<!--只保留最近90天的日志-->
			<maxHistory>90</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
				<maxFileSize>2MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<encoder>
			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
	</appender>

	<root level="info">
		<appender-ref ref="CONSOLE"/>
		<appender-ref ref="FILE_INFO"/>
		<appender-ref ref="FILE_ERROR"/>
	</root>
</configuration>

2.2 日志等级
  • 将日志分为不同的等级

    • TRACE, DEBUG, INFO, WARN, ERROR

    • 如果一条的日志的打印级别大于 logger 的有效级别,该条日志才可以被打印出来。这条规则总结如下:

      基本选择规则

      日志的打印级别为 p,Logger 实例的级别为 q,如果 p >= q,则该条日志可以打印出来。

      各级别的排序为:TRACE < DEBUG < INFO < WARN < ERROR

    • trace
      指程序流程记录日志,LOG的最低层次,这种等级一般不推荐常规使用,
      常规的调试信息推荐使用 Debug,输岀的信息只有研发人员需要关注,用于最细致的程序逻辑跟踪,一般在频繁的循环中需要记录程序的流程或状态时使用,比如监测调度框架的跟踪记录,常规情况下禁止使用此级别

    • Debug
      指调试日志,主要用来详细跟踪程序的执行逻辑以及部分状态信息,常规使用,这些日志一般只需要开发人员、测试人员和实施人员关注,信息尽量详细,
      可以提供当前程序段相关的数据,便于问题分析。通常情况下发布版本的Log配置文件是不允许 Debug之下(包括)的等级信息输出的,一般在以下情况使用

      • 程序流程或逻辑分支跟踪
      • 数据或程序状态跟踪
      • 程序调用时参数传递不合法等日志(一般也要抛岀非法参数异常)
      • 某些会抛出异常但在业务上不算为错误的地方,比如在探测监测某些资源时,可能会抛出异常,但是不算为错误,因为是在探测
    • info
      指信息类的日志,这些信息需要提供给用户、普通技术支持人员查看,信息要求直观易读,能望文生义,一般在以下情况使用

      • 系统运行跟踪日志,比如用户登陆和重要操作等记录
      • 重要程序模块的调用,比如加载某模块,使用某功能等
      • 资源使用记录,比如调用某文件或打印机等
    • warn
      指警告日志,一般指程序运行出现了某些异常,这些异常不会影响业务功能的正常使用,但需要引起注意,针对所有人,更倾向内部技术人员,信息里可以提供当前程序段里一些关键的数据,根据情况可以打印程序中的 Exception堆栈,便于问题分析,但不影响程序业务功能执行,一般在以下情况下使用

      • 程序运行出现异常,但这些异常不影响业务正常使用;
      • 某些应该存在的资源不存在了,但是不影响程序功能的正常运行
    • error
      指错误日志,指程序运行出现了某些错误,这些错误会导致某些业务功能的中断,信息关注者为所有人,信息里可以提供当前程序段里一些关键但非保密的数据,打印程序中 Exception堆栈,一般在以下情况:

      • 使用资源使用错误,导致业务功能无法完成
      • 调用API的方法时有异常抛出,而且异常无法处理(也不能抛出)并影响业务功能

2.3 日志参数化编写
  • 一个参数
    logger.debug("The new entry is {}", entry);
  • 二个参数
 logger.debug("The new entry is {}, It replaces {}.", entry, oldEntry);
  • 三个参数
 Object[] paramArray = {newVal, below, above};
 logger.debug("Value {} was inserted between {} and {}.", paramArray);

2.4 实际开发案例

第一种写法:

private Logger logger = LoggerFactory.getLogger(this.getClass());

logger.info("用户信息:{}",adminUser);
logger.error("报错如下:{}",e);

第二种写法:

@Slf4j
public class Test {
	public void test(){
		log.info("用户信息:{}",adminUser);
		log.error("报错如下:{}",e);
	}
}

Debug > 面向技术

1、程序执行逻辑,分支: 
log.debug("设备SNP访问失败,将进入 NetBios采集");
2.执行结果统计、状态信息:
logr.debug("线程池创建成功,初始化线程数:{}",pool.getPoolSize());

Info > 面向业务

1、业务模块运行日志:
log.info("性能快照模块已启动");
2、业务运行结果:
log.info("本轮性能快照共采集{}个结点",total);

Warn 有错误,但不影响功能

打开配置文件时,发现配置文件不存在或错误,所以建立一个默认配置文件项:
log.warn("配置文件conf/jdbc. properties不存在,将建立并使用默认配置");

Error 有错误,将影响功能

1、程序异常退出:
log.error("无法连接数据库,程序即将退出");
2、执行交换机绑定,由于某种原因,绑定错误:
log.error("设备SNMP访问超时,无法执行绑定");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值