欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
日志是我们系统必备的功能之一,可以帮助我们开发人员定位系统的异常、错误以及运行流程的重要的工具。今天老顾就来介绍一下Spring boot的默认的logback日志框架。
java开发日志处理是发现和调试bug所必不可少的,现在企业中常用的日志组件有哪些呢?JCL 、 JUL、 SLF4j、Log4j、 Log4j2 、 Logback、 jboss-loggin 等,是不是很乱,很多开发人员对日志框架理解的不够透彻,一般日志是配套出现的,一般是由一个日志门面和一个日志实现配套使用。
日志门面:是日志实现的抽象层。
日志实现:具体的日志功能的实现。
为什么不直接使用日志实现,而是又弄了一个叫日志门面的东西?
因为日志实现,可能会有一些代码的优化和改动,避免影响用户在项目中的使用,使用日志门面这些统一的接口,假设在实现层代码做了更改,用户在项目中使用日志而调用的接口等等都是不会受影响的。
在实际使用中,是选择一个抽象层的日志门面搭配一个底层日志实现来使用的。
SpringBoot中默认选择的搭配是:slf4j+logback
下面分别了解一下以上提到的各种门面和实现。
JCL:最后一次版本更新停在了2014年,后来没有继续维护更新,一般不考虑选用。
slf4j:这里提一下日志实现里面的log4j和logback,这两个实现和门面slf4j都是同一个人写的,他先写了log4j后,觉得性能可以再做优化,又写了logback,为了有更加适配的门面,自己又为log4j和logback量身打造了门面slf4j。所以这三者里面最优的搭配当然是slf4j+logback。
JUL:是java.util.logging包下提供的日志实现。实现简陋,很多地方受到开发者的吐槽,所以 首先排除
jboss-loggin:自诞生之初,就不是为了服务大众,不受到什么青睐。
log4j2:log4j问世之后,apache公司发现了日志市场,自家也开发了一款叫log4j2的产品。
下面老顾就介绍如何配置和使用 SLF4j + logback
先上一段测试代码
在这里 ,我们需要在每个类中创建一个 Logger对象,并且使用当前类的类名来创建,那么 这个类名存在的意义在哪里?我们可以先运行 第一个测试,看下结果
是不是少了个debug日志,下面会介绍,不急
由上图可知,我们的类名在日志中是为了方便我们找到异常是在哪个类中,进行锁定。因此,使用类名创建的logger的作用就是在这里,但是如果我们需要在每个类中都这样的创建一个logger对象,不方便,因此可以通过一个注解来帮我们实现那就是@Slf4j ,该注解就可以帮我们自动创建一个log对象。
使用 @Slf4j注解需要两点
1.安装lombok插件,可上网查阅
2.添加 lombok的依赖
org.projectlombok lombok provided
修改代码
上面的日志输出方式,是默认方式;怎么设置日志输出,我们来看看怎么配置?
日志可以通过两种方法配置,一种是application.yml配置,一种是lobback-spring.xml配置。
application.yml配置
这种配置方法 配置项较少,一般有以下属性配置
1. 配置输出格式 为 时间 - 消息 换行
logging: pattern: console: "%d - %msg%n"
2. 配置日志输出位置
logging: path: /Users/gujiachun/Downloads
运行后,我们可以看到Downloads下生成了一个文件spring.log这文件是spring生成
3. 配置日志输出文件 ,这样可以指定日志输出到哪个文件
logging: file: /Users/gujiachun/Downloads/test.log
我们可以看到在Downloads生成了test文件
这里注意:我们可以配置日志保存位置,以及具体输出的文件,如果同时配置的话,会使用我们指定的file为主
4. 配置日志 输出级别
日志一般主要看重的有5个级别,优先级如 DEBUG,而springboot默认配置是INFO级别,所以我们测试代码中写了三行,在结果中我们只看到了info 和 error,因为debug优先级比info低,所以我们看不到。
那么我们配置一下格式 logging.level.包名或类名: 级别 即可, 举例如下
logging: pattern: console: "%d - %msg%n" file: /Users/gujiachun/Downloads/test.log level: #这里可以是包名也可以是类名 com.rainbow.goods.test: debug
运行后,我们可以看到 原来只能看到 info 和 error 的,现在的debug也可以看到
一、我们先把application.yml的关于日志的注释掉,新建一个文件logback-spring.xml,为什么要取这个名字呢,Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),如果我们想自定义名字,可以在 application.yml中通过logging.config=classpath:/xxx.xml等方式配置。
二、注意几个 xml节点的含义
1、根节点包含的属性
scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认true 。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false
2、子节点
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。可以包含零个或多个元素,标识这个appender将会添加到这个loger。
3、子节点 设置上下文名称
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过 %contextName 来打印日志上下文名称,一般来说我们不用这个属性,可有可无。
4、子节点 设置变量
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
5、子节点
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。控制台输出 ConsoleAppender
6、子节点五
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 。 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。
name :用来指定受此loger约束的某一个包或者具体的某一个类。
level :用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity :是否向上级loger传递打印信息。默认是true。
简要说明
appender:配置项,规则,通过这个节点内容配置,我们可以配置输出位置(控制台,文件),输出格式等
root:根节点,表明整个项目基本的日志级别,里面可以应用多个appender规则
在上面的 logback-spring.xml中,appender配置了一个规则, ConsoleAppender表明日志输出到控制台,layout表明输出格式,root节点配置表明该项目基础的日志级别为info,引入 控制台输出的规则,那么我们运行看结果
从结果上来看,配置的是 info级别,所以 debug的没有输出,现在如果我想把日志输出到文件怎么处理呢,可以使用如下配置,添加一个 appender规则,由于日志可能比较多,一般是按照日期来输出日志,因此如下配置了每天一个日志到指定位置
启动执行
如果我们想把info的日志和error的日志区分到两个文件放置,该怎么写呢?
我们可以新建一个规则,结构如上图,只是在里面添加了一个过滤器,使用的是范围过滤,也就是拦截Error级别的信息,如下
启动执行
运行后,我们可以在Downloads下的error.log中看到 里面只有一条记录,关于error的记录,但是我们在info的那个文件中,依旧有info和error的信息,那么如果将info提取出来呢? 能不能也想这样添加一个过滤器呢,测试一下,经过测试我们发现没有作用,因为拦截info,error还是会显示,因为error的优先级高,那么我们可以利用LevelFilter方法来处理,如下
运行后,发现确实实现了 info 和 error的日志分开,但是 在上图例子中,虽然我们排除了 error,但是除开info,如果我们还有 warn级别的日志信息,还是会输出在 info.log文件中,因为warn优先级比info高,但是我们只是拦截了error而已。
以上介绍了logback的基本用法,下一篇老顾会介绍多环境下的使用,以及生产环境如何配置,谢谢!!!
---End---
ELK:(ELK 由 ElasticSearch 、 Logstash 和 Kiabana 三个开源工具组成),Elasticsearch用于存储日志信息,Logstash用于收集日志,Kibana用于图形化展示。上一节我们介绍了如何使用docker-compose搭建ELK日志分析系统。传送门:传说中的ELK日志分析系统,手把手教你...
glog简介 glog是著名的google开源C++日志库glog(https://github.com/google/glog)的golang版本,glog是一个轻量级的日志库,上手简单不需要配置文件并且稳定高效,可以自定义控制的内容比较少。 glog主要有以下几个特点: 1. glog有四种日志等级INFO < WARING...
应用场景 该配置文件用于ATS用作反向代理模式,访问日志被server域名分隔。比如,我想将sohu和ifeng的域名的日志分别记在两个不同的日志文件中,其它的日志统一记在默认的日志文件中。 配置 为了将不同源站的HTTP transaction记录在不同的日志文件中,你必须在log_hosts.config中列举出每...
缘起 近来因为公司项目需要,阅读了一部分ATS logging system的源码实现,越发觉得logs_xml.config文件的配置非常重要,而我目前只是实践了一点它的皮毛。为此,根据自己的理解,翻译了官网的这篇文档,以作备忘。 logs_xml.config文件定义了自定义日志文件格式,过滤器和处理选项。文件格式采用x...
英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...
展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...
前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...
【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...
点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...
ue4商城资源 Car Configurator Template 汽车配置器模板 ue4商城资源 Car Configurator Template 汽车配置器模板 Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Car Configurator Template 4...
一直在尝试一些写代码方便,阅读代码也很方便的工具,因为使用的是Mac,所以阅读源码上面sourceInsight就没办法用了。 从vscode – sublime – clion 想要可配置性强一点,软件轻一点,也能提供足够的便捷操作,不论是写代码还是快速索引源码,都希望在检索上面节省足够的时间。 vscode 和 sublime...
每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译。出现问题,还得重新回到windows端,这个过程太耗费时间。 vim作为唯一能够和windos 下的source insight一争高低的linux端的源码阅读器,只要将它短时间内合理利用...
使用ubuntu(18.04) 作为软路由器连接互联网 背景: 最近要用ubuntu机器作为中继路由,需要配置一下,但是内网外网网上找了一圈,五花八门的,照着做没有一个靠谱的,遇到的问题也没有任何说明,遂写一篇教程以记录一下 功能说明: 简单来说,就是用其他机器的网络上互联网, 比如可以用其他机器的wifi上网等等场景 示意...
Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件(pom.xml 文件中)