java spring 配置log_springboot的logback.xml配置和日志记录

最近在研究springboot的日志,所以记录一下,做一下总结。

几篇关于日志的文章:

日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节。但是,这丝毫不影响它在任何一个系统中的重要的地位。

为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生产环境一旦出现问题,预警系统就会通过邮件、短信甚至电话的方式实施多维轰炸模式,确保相关负责人不错过每一个可能的bug。

预警系统判断疑似bug大部分源于日志。比如某个微服务接口由于各种原因导致频繁调用出错,此时调用端会捕获这样的异常并打印ERROR级别的日志,当该错误日志达到一定次数出现的时候,就会触发报警。

try {

调用某服务

} catch(Exception e) {

LOG.error("错误信息", e);

}

所以日志至关重要,这篇就来介绍下在Spring Boot如何配置日志。

Spring Boot默认日志系统

Spring Boot默认使用LogBack日志系统,如果不需要更改为其他日志系统如Log4j2等,则无需多余的配置,LogBack默认将日志打印到控制台上。

1、如果要使用LogBack,原则上是需要添加dependency依赖的

org.springframework.boot

spring-boot-starter-logging

但是因为新建的Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖,

所以,无需额外添加依赖,配置logback-spring.xml就可以了。以logback-spring.xml命名,spring会自动识别加载。

2、如果需要切换Log4j2,那么在pom.xml中需要排除springboot自带的commons‐logging,然后再引入log4j2的依赖:

org.springframework.boot

spring-boot-starter-web

commons‐logging

commons‐logging

org.springframework.boot

spring-boot-starter-log4j2

然后再引入log4j.properties文件就可以了。

log4j.properties:

### set log levels ###

log4j.rootLogger = debug , stdout , D , E

### 输出到控制台 ###

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target = System.out

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} ===== %5p %c{ 1 }:%L - %m%n

#### 输出到日志文件 ###

#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

#log4j.appender.D.File = logs/log.log

#log4j.appender.D.Append = true

#log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志

#log4j.appender.D.layout = org.apache.log4j.PatternLayout

#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

#

#### 保存异常信息到单独文件 ###

#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

#log4j.appender.D.File = logs/error.log ## 异常日志文件名

#log4j.appender.D.Append = true

#log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!

#log4j.appender.D.layout = org.apache.log4j.PatternLayout

#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

日志级别

日志级别由低到高: trace < debug < info < warm < error ,设置的级别越低显示的日志级别的信息越多。

例如:如果设置的日志级别是info,那么此时,低于info级别的trace,debug日志不会显示。

springboot在不对日志进行任何设置的情况下,默认日志root级别是INFO,输出的是INFO级别以上的日志。

packagecom.ll;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)

@SpringBootTestpublic classSpringbootCacheApplicationTests {private static final Logger log = LoggerFactory.getLogger(SpringbootCacheApplicationTests.class);/*** 测试 日志级别:

* 级别由低到高: trace < debug < info < warm < error 设置的级别越低显示的日志信息越多。

* 可以调整输出的日志级别,只会显示高于设置级别的日志。*/@Testpublic voidtestLog() {

log.trace("这是track日志。。。");

log.debug("这是debug日志。。。");//spring 默认设置的级别是info级别,没有指定级别的情况下,会使用spring默认的root级别(显示的是info级别的信息)

log.info("这是info日志。。。");

log.warn("这是warm日志。。。");

log.error("这是error日志。。。");

}

}

控制台信息:

4cad54c535130cdce834dc1534256daa.png

只会输出INFO级别以上的日志信息,开发环境中,要显示打印sql语句等debug调试信息,要对日志级别进行设置。

日志的组成部分:

时间日期:精确到毫秒

日志级别:ERROR, WARN, INFO, DEBUG or TRACE

进程ID

分隔符:— 标识实际日志的开始

线程名:方括号括起来(可能会截断控制台输出)

Logger名:通常使用源代码的类名

日志内容

日志配置:

日志可以通过两种方式配置:

一、application.properties或者application.yml文件配置:

这种方式需要把所有的日志配置写在properties或者yml文件里面,配置迁移不方便,写的感觉也有点乱,很繁杂,对log4j2的支持也不好。推荐用第二种,logback的xml配置方便比较好,配置迁移复制粘贴,然后改一下里面的配置就好了。

简单列举一下:

logging.level.* = LEVEL

logging.level:日志级别控制前缀,*为包名或Logger名

LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

举例说明:

logging.level.com.ll=DEBUG  表示com.ll包下所有class以DEBUG级别输出(包含mapper所在的包,会打印sql语句)

logging.level.root=INFO    表示root日志以INFO级别输出

logging.path该属性用来配置日志文件的路径

logging.file该属性用来配置日志文件名,如果该属性不配置,默认文件名为spring.log

logging.path=/springboot/log在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;如果不配置,使用 spring.log 作为默认文件

logging.file=E:/springboot/log/spring.log可以指定完整的路径(logging.path和logging.file 配置一个即可)

另外还有日志的打印位置设置:

logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n

logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

logging.pattern.console

该属性用于定制日志输出格式。上述配置的编码中,对应符号的含义如下:

%d{HH:mm:ss.SSS}——日志输出时间

%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用

%-5level——日志级别,并且使用5个字符靠左对齐

%logger- ——日志输出者的名字

%msg——日志消息

%n——平台的换行符

appliacation.properties:

# com.ll包下所有class以DEBUG级别输出(包含mapper所在的包,会打印sql语句)

logging.level.com.ll=DEBUG

# root日志以INFO级别输出

logging.level.root=INFO

# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;如果不配置,使用 spring.log 作为默认文件#logging.path=/springboot/log

#可以指定完整的路径(logging.path和logging.file 配置一个即可)logging.file=E:/springboot/log/spring.log

#控制台日志格式logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread]%-5level %logger- %msg%n

#文件日志格式logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

二、logback的xml文件配置:

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

Log4j2:log4j2-spring.xml, log4j2.xml

JDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。

上面是默认的命名规则,并且放在src/main/resources下面即可。

如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,可以通过logging.config属性指定自定义的名字:ogging.config=classpath:logging-config.xm

虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日志配置,这个功能会很有用。

logback-spring.xml配置:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

${LOG_HOME}/${appName}.log

${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log

365

100MB

%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n

配置完logback-spring.xml,接下来需要做的就是在把Logger对象引入到需要记录日志的类了。

public static final Logger logger = LoggerFactory.getLogger(SysUserServiceImpl.class);

下面列举一个记录批量保存方法记录错误日志的例子:

packagecom.ll.service.impl;importjava.util.List;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Isolation;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.util.StringUtils;importcom.ll.bean.SysUser;importcom.ll.mapper.SysUserMapper;importcom.ll.service.SysUserService;importcom.ll.utils.MyException;

@Servicepublic class SysUserServiceImpl implementsSysUserService {public static final Logger logger = LoggerFactory.getLogger(SysUserServiceImpl.class);

@Autowired

SysUserMapper sysUserMapper;//开启事务

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,rollbackFor = MyException.class)

@Overridepublic int batchInsertUser(List userList) throwsMyException {// try{

sysUserMapper.batchInsertUser(userList);

}catch(Exception e) {/**推荐printStackTrace()打印堆栈错误信息这个方法保留,红色错误提示,开发的时候更方便查看错误信息*/e.printStackTrace();/**logger.error方法把异常错误e记录进日志文件,开发环境用logger.error方法结合printStackTrace()打印堆栈错误信息的方法就可以了*/logger.error("method:batchInsertUser,error:",e);/**因为logback-spring.xml的logger的level级别设置为error时,logger.info的消息不会打印,也不会记录进日志文件,所以不要用logger.info方法,开发环境用printStackTrace()打印堆栈错误信息即可。*/

//logger.info("method:batchInsertUser",e);

throw new MyException("批量新增失败!",e.getCause());

}return 1;

}

}

有时候logger.error不能完全地打印出网站的错误堆栈信息,只能打印这个错误是一个什么错误。

为什么?

看Logger.error源码

public void error(String msg, Throwable t);

public void error(String msg);

如果只传一个参数e进去,那么e就被认为是String类型(会自动调toString()方法把Exception转成String),而不是Exception类型。

如果想打印堆栈信息,那么必须传两个或以上参数,实际上就是为了调用public void error(String msg, Throwable t);

所以我们的写法可以是:

Logger.error(“xxx出错”,e); //第二个参数是e

而不是:

Logger.error(“xxx出错:”+e) 或 logger.error(e) 或logger.error(e.getMessage);

到此,springboot的slf4j简单日志门面,默认使用的logback-spring.xml配置和日志记录就完成了~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值