内容简介:对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。相信很多人听说过首先
对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。相信很多人听说过 slf4j
, log4j
, logback
, JDK Logging
等跟日志框架有关的词语,所以这里也简单介绍下他们之间的关系。
关系
首先 slf4j
可以理解为规则的制定者,是一个抽象层,定义了日志相关的接口。 log4j
, logback
, JDK Logging
都是 slf4j
的实现层,只是出处不同,当然使用起来也就各有千秋,这里放一张网上的图更明了的解释了他们之间的关系:
可以看到 logback
是直接实现的 slf4j
,而其他的中间还有一个适配层,至于原因也很简单,因为 logback
和 slf4j
的作者是一个人。关于这几个框架详细介绍信息,在网上找到一篇讲解的通俗易懂的文章,感兴趣的朋友可以了解下 【传送门】
为什么使用slf4j+logback
我使用这个框架是因为一开始接触的时候就用的这个,后来在网上了解到 slf4j
+ logback
也确实当下最流行的日志框架,并且自己用着也确实很顺手,也就一直用了下来,关于这个框架相比于其它日志框架的优势,因为我没用过其它的框架,这里也就不做那误人子弟的事了,也只是在网上做过了解,这里给出一篇介绍的比较详细的博文 【传送门】
在Spring boot中使用slf4j+logback日志框架
添加配置文件
在 Spring boot
使用是非常方便的,不需要我们有什么额外的配置,因为 Spring boot
默认支持的就是 slf4j
+ logback
的日志框架,想要灵活的定制日志策略,只需要我们在 src/main/resources
下添加配置文件即可,只是默认情况下配置文件的命名需要符合以下规则:
- logback.xml
- logback-spring.xml
其中 logback-spring.xml
是官方推荐的, 并且只有使用这种命名规则,才可以配置不同环境使用不同的日志策略这一功能。
配置文件详解
首先介绍配置文件的关键节点:
框架介绍
<configuration>
:根节点,有三个属性:
-
scan
:当配置文件发生修改时,是否重新加载该配置文件,两个可选值true
orfalse
,默认为true
。 -
scanPeriod
:检测配置文件是否修改的时间周期,当没有给出时间单位时默认单位为毫秒,默认值为一分钟,需要注意的是这个属性只有在scan
属性值为true
时才生效。 -
debug
:是否打印loback
内部日志信息,两个可选值true
orfalse
,默认为false
。
根节点 <configuration>
有三个重要的子节点,正是这三个子节点的不同组合构成配置文件的基本框架,使得 logback.xml
配置文件具备很强的灵活性:
-
<appender>
:定义日志策略的节点,一个日志策略对应一个<appender>
,一个配置文件中可以有零个或者多该节点,但一个配置文件如果没有定义至少一个<appender>
,虽然程序不会报错,但就不会有任何的日志信息输出,也失去了意义,该节点有两个必要的属性:-
name
:指定该节点的名称,方便之后的引用。 -
class
:指定该节点的全限定名,所谓的全限定名就是定义该节点为哪种类型的日志策略,比如我们需要将日志输出到控制台,就需要指定class
的值为ch.qos.logback.core.ConsoleAppender
;需要将日志输出到文件,则class
的值为ch.qos.logback.core.FileAppender
等,想要了解所有的appender
类型,可以查阅官方文档 【传送门】
-
-
<logger>
:用来设置某个包或者类的日志打印级别,并且可以引用<appender>
绑定日志策略,有三个属性:-
name
:用来指定受此<logger>
约束的包或者类。 -
level
:可选属性,用来指定日志的输出级别,如果不设置,那么当前<logger>
会继承上级的级别。 -
additivity
:是否向上级传递输出信息,两个可选值true
orfalse
,默认为true
。
-
在该节点内可以添加子节点 <appender-ref>
,该节点有一个必填的属性 ref
,值为我们定义的 <appender>
节点的 name
属性的值。
-
<root>
:根<logger>
一个特殊的<logger>
,即默认name
属性为root
的<logger>
,因为是根<logger>
,所以不存在向上传递一说,故没有additivity
属性,所以该节点只有一个level
属性。
介绍了根节点的三个主要的子节点,下面再介绍两个不那么重要但可以了解的子节点:
-
<contextName>
:设置上下文名称,每个<logger>
都关联到<logger>
上下文,默认上下文名称为default
,但可以使用设置成其他名字,用于区分不同应用程序的记录,一旦设置,不能修改,可以通过%contextName
来打印日志上下文名称,一般来说我们不用这个属性,可有可无。 -
<property>
:用来定义变量的节点,定义变量后,可以使${}
来使用变量,两个属性,当定义了多个<appender>
的时候还是很有用的:name value
好了,介绍了上边的节点我们就已经可以搭建一个简单的配置文件框架了,如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 一般根节点不需要写属性了,使用默认的就好 --> <configuration> <contextName>demo</contextName> <!-- 该变量代表日志文件存放的目录名 --> <property name="log.dir" value="logs"/> <!-- 该变量代表日志文件名 --> <property name="log.appname" value="eran"/> <!--定义一个将日志输出到控制台的appender,名称为STDOUT --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 内容待定 --> </appender> <!--定义一个将日志输出到文件的appender,名称为FILE_LOG --> <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender"> <!-- 内容待定 --> </appender> <!-- 指定com.demo包下的日志打印级别为INFO,但是由于没有引用appender,所以该logger不会打印日志信息,日志信息向上传递 --> <logger name="com.demo" level="INFO"/> <!-- 指定最基础的日志输出级别为DEBUG,并且绑定了名为STDOUT的appender,表示将日志信息输出到控制台 --> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
上面搭建了框架,定义了一个输出到控制台的 ConsoleAppender
以及输出到文件的 FileAppender
,下面来细说这两个最基本的日志策略,并介绍最常用的滚动文件策略的 RollingFileAppender
,这三种类型的日志策略足够我们的日常使用。
输出到控制台的 ConsoleAppender
的介绍:
先给出一个 demo
:
<!--定义一个将日志输出到控制台的appender,名称为STDOUT --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender>
ConsoleAppender
的功能是将日志输出到控制台,有一个 <encoder>
节点用来指定日志的输出格式,在较早以前的版本还有一个 <layout>
节点也是相同的作用,但是官方推荐使用 encoder
节点,所以这里我们介绍 encoder
节点即可。
<encoder>
节点介绍
该节点主要做两件事:
- 把日志信息转换成字节数组
- 将字节数组写到输出流
该节点的子节点 <pattern>
作用就是定义日志的格式,即定义一条日志信息包含哪些内容,例如当前时间,在代码中的行数线程名等。需要哪些内容由我们自己定义,按照 %+转换符
的格式定义,下面列出常用的转换符:
-
%date{}
:输出时间,可以在花括号内指定时间格式,例如-%data{yyyy-MM-dd HH:mm:ss}
,格式语法和java.text.SimpleDateFormat
一样,可以简写为%d{}
的形式,使用默认的格式时可以省略{}
。 -
%logger{}
:日志的logger名称,可以简写为%c{}
,%lo{}
的形式,使用默认的参数时可以省略{}
,可以定义一个整形的参数来控制输出名称的长度,有下面三种情况:- 不输入表示输出完整的
<logger>
名称 - 输入
0
表示只输出<logger>
最右边点号之后的字符串 - 输入其他数字表示输出小数点最后边点号之前的字符数量
- 不输入表示输出完整的
-
%thread
:产生日志的线程名,可简写为%t
-
%line
:当前打印日志的语句在程序中的行号,可简写为%L
-
%level
:日志级别,可简写为%le
,%p
-
%message
:程序员定义的日志打印内容,可简写为%msg
,%m
-
%n
:换行,即一条日志信息占一行
介绍了常用的转换符,我们再看看上边的例子中我们定义的格式:
<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>
日志的格式一目了然,可以看出我们在最前面加了 [eran]
的字符串,这里是我个人的使用习惯,一般将项目名统一展现在日志前边,而且在每个转换符之间加了空格,这更便于我们查看日志,并且使用了 >>
字符串来将 %msg
分割开来,更便于我们找到日志信息中我们关注的内容,这些东西大家可以自己按照自己的喜好来。
输出到文件的 FileAppender
先给出一个 demo
:
<!--定义一个将日志输出到文件的appender,名称为FILE_LOG --> <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender"> <file>D:/test.log</file> <append>true</append> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender>
FileAppender
表示将日志输出到文件,常用几个子节点:
-
<file>
:定义文件名和路径,可以是相对路径 , 也可以是绝对路径 , 如果路径不存在则会自动创建 -
<append>
:两个值true
和false
,默认为true
,表示每次日志输出到文件走追加在原来文件的结尾,false
则表示清空现存文件 -
<encoder>
:和ConsoleAppender
一样
显而易见,样例中我们的日志策略表示,每次将日志信息追加到 D:/test.log
的文件中。
滚动文件策略 RollingFileAppender
介绍
按时间滚动 TimeBasedRollingPolicy
demo
如下:
<appender name="ROL-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 只保留近七天的日志 --> <maxHistory>7</maxHistory> <!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender>
RollingFileAppender
是非常常用的一种日志类型,表示滚动纪录文件,先将日志记录到指定文件,当符合某种条件时,将日志记录到其他文件,常用的子节点:
-
<rollingPolicy>
:滚动策略,通过属性class
来指定使用什么滚动策略,最常用是按时间滚动TimeBasedRollingPolicy
,即负责滚动也负责触发滚动,有以下常用子节点:-
<fileNamePattern>
:指定日志的路径以及日志文件名的命名规则,一般根据日志文件名+%d{}.log
来命名,这边日期的格式默认为yyyy-MM-dd
表示每天生成一个文件,即按天滚动yyyy-MM
,表示每个月生成一个文件,即按月滚动 -
<maxHistory>
:可选节点,控制保存的日志文件的最大数量,超出数量就删除旧文件,比如设置每天滚动,且<maxHistory>
是7,则只保存最近7天的文件,删除之前的旧文件 -
<encoder>
:同上 -
<totalSizeCap>
:这个节点表示设置所有的日志文件最多占的内存大小,当超过我们设置的值时,logback
就会删除最早创建的那一个日志文件。
-
以上就是关于 RollingFileAppender
的常用介绍,上面的 demo
的配置也基本满足了我们按照时间滚动 TimeBasedRollingPolicy
生成日志的要求,下面再介绍一种常用的滚动类型 SizeAndTimeBasedRollingPolicy
,即按照时间和大小来滚动。
按时间和大小滚动 SizeAndTimeBasedRollingPolicy
demo
如下:
<appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 单个文件的最大内存 --> <maxFileSize>100MB</maxFileSize> <!-- 只保留近七天的日志 --> <maxHistory>7</maxHistory> <!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender>
仔细观察上边 demo
中的 <fileNamePattern>
会发现比 TimeBasedRollingPolicy
中定义的 <fileNamePattern>
多了 .%i
的字符,这个很关键,在 SizeAndTimeBasedRollingPolicy
中是必不可少的。
上边的 demo
中多了一个 <maxFileSize>
节点,这里介绍下,其他的节点上边已经解释过,这里就不再赘述。
<maxFileSize>
:表示单个文件占用的最大内存大小,当某个文件超过这个值,就会触发滚动策略,产生一个新的日志文件。
日志过滤
级别介绍
在说级别过滤之前,先介绍一下日志的级别信息:
TRACE DEBUG INFO WARN ERROR
上述级别从上到下由低到高,我们开发测试一般输出 DEBUG
级别的日志,生产环境配置只输出 INFO
级别甚至只输出 ERROR
级别的日志,这个根据情况而定,很灵活。
过滤节点 <filter>
介绍
过滤器通常配置在 Appender
中,一个 Appender
可以配置一个或者多个过滤器,有多个过滤器时按照配置顺序依次执行,当然也可以不配置,其实大多数情况下我们都不需要配置,但是有的情况下又必须配置,所以这里也介绍下常用的也是笔者曾经使用过的两种过率机制:级别过滤器 LevelFilter
和临界值过滤器 ThresholdFilter
。
在此之前先说下 <filter>
的概念,首先一个过滤器 <filter>
的所有返回值有三个,每个过滤器都只返回下面中的某一个值:
DENY NEUTRAL ACCEPT
级别过滤器 LevelFilter
过滤条件:只处理 INFO
级别的日志,格式如下:
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
<level> <onMatch> <onMismatch>
就如上边的 demo
中的配置一样,设置了级别为 INFO
,满足的日志返回 ACCEPT
即立即处理,不满足条件的日志则返回 DENY
即丢弃掉,这样经过这一个过滤器就只有 INFO
级别的日志会被打印出输出。
临界值过滤器 ThresholdFilter
过滤条件:只处理 INFO
级别之上的日志,格式如下:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter>
当日志级别等于或高于临界值时,过滤器返回 NEUTRAL
,当日志级别低于临界值时,返回 DENY
。
带过滤器的 <Appender>
下面给出一个带过滤器的 <Appender>
:
<appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 单个文件的最大内存 --> <maxFileSize>100MB</maxFileSize> <!-- 只保留近七天的日志 --> <maxHistory>7</maxHistory> <!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> <!-- 只处理INFO级别以及之上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- 只处理INFO级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
上边的 demo
中,我们给按时间和大小滚动 SizeAndTimeBasedRollingPolicy
的滚动类型加上了过滤条件。
异步写入日志 AsyncAppender
都知道,我们的日志语句是嵌入在程序内部,如果写入日志以及程序执行的处于一个串行的状态,那么日志的记录就必然会阻碍程序的执行,加长程序的响应时间,无疑是一种极为损耗效率的方式,所以实际的项目中我们的日志记录一般都用异步的方式来记录,这样就和主程序形成一种并行的状态,不会影响我们程序的运行,这也是我们性能调优需要注意的一个点。
AsyncAppender并不处理日志,只是将日志缓冲到一个BlockingQueue里面去,并在内部创建一个工作线程从队列头部获取日志,之后将获取的日志循环记录到附加的其他appender上去,从而达到不阻塞主线程的效果。因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来写日志。
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold >0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref ="FILE_LOG"/> </appender>
常用节点:
-
<discardingThreshold>
:默认情况下,当BlockingQueue
还有20%
容量,他将丢弃TRACE
、DEBUG
和INFO
级别的日志,只保留WARN
和ERROR
级别的日志。为了保持所有的日志,设置该值为0
。 -
<queueSize>
:BlockingQueue
的最大容量,默认情况下,大小为256
。 -
<appender-ref>
:添加附加的<appender>
,最多只能添加一个
<logger>
和 <root>
节点介绍
上边花费了很长的篇幅介绍了 <appender>
的相关内容,现在来详细介绍下 <logger>
节点以及 <root>
节点的相关内容。
上文已经简单介绍了 <logger>
节点的属性以及子节点,这里我们就举例来说明在 logback-spring.xml
文件中,该节点到底扮演怎样的角色,以及他的运行原理,看下边的 demo
:
首先在这里给出项目结构:
下面定义两个 <logger>
以及 <root>
:
<!-- logger1 --> <logger name="com.example" level="ERROR"> <appender-ref ref="STDOUT" /> </logger> <!-- logger2 --> <logger name="com.example.demo.controller" level="debug"> <appender-ref ref="STDOUT" /> </logger> <!-- 指定最基础的日志输出级别为DEBUG,并且绑定了名为STDOUT的appender,表示将日志信息输出到控制台 --> <root level="INFO"> <appender-ref ref="STDOUT" /> </root>
当存在多个 <logger>
时,会有父级子级的概念,日志的处理流程是先子级再父级,当然 <root>
是最高级别,怎样区分级别大小呢,根据 name
属性指定的包名来判断,包名级别越高则 <logger>
的级别越高,跟我们定义 <logger>
的顺序无关。
上边我们定义了 logger1
和 logger2
,很明显看出 logger1
是 logger2
的父级,以本例给出多个 <logger>
与 <root>
之间的执行流程图:
流程图看着一目了然,这里就不再赘述,只是在实际的项目中我们一般都不让 <logger>
输出日志,统一放在 <root>
节点中输出,所以一般不给 <logger>
节点添加 <appender>
,当然这个按实际需要可以灵活配置。
配置 profile
profile
即根据不同的环境使用不同的日志策略,这里举例开发和生产环境:
<!-- 开发环境输出到控制台 --> <springProfile name="dev"> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </springProfile> <!-- 生产环境输出到文件 --> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="FILE_LOG" /> </root> </springProfile>
可以看到我们只需要在 <root>
节点的外边再套一层 <springProfile>
就可以了,并且指定 name
属性的值,在配置文件里边配置好之后,怎么启用,这里介绍两种方式:
-
执行
jar
包时添加参数:java -jar xxx.jar --spring.profiles.active=prod
-
在项目的
application.properties
配置文件中添加:spring.profiles.active=prod
整合
最后将所有的模块整合在一起形成一个完整的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--定义一个将日志输出到控制台的appender,名称为STDOUT --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%contextName]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender> <!--定义一个将日志输出到文件的appender,名称为FILE_LOG --> <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender"> <file>D:/test.log</file> <append>true</append> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender> <!-- 按时间滚动产生日志文件 --> <appender name="ROL-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 只保留近七天的日志 --> <maxHistory>7</maxHistory> <!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> </appender> <!-- 按时间和文件大小滚动产生日志文件 --> <appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>D:/logs/test.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 单个文件的最大内存 --> <maxFileSize>100MB</maxFileSize> <!-- 只保留近七天的日志 --> <maxHistory>7</maxHistory> <!-- 用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志 --> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern> </encoder> <!-- 只处理INFO级别以及之上的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- 只处理INFO级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 异步写入日志 --> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold >0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref ="FILE_LOG"/> </appender> <!-- 指定com.demo包下的日志打印级别为DEBUG,但是由于没有引用appender,所以该logger不会打印日志信息,日志信息向上传递 --> <logger name="com.example" level="DEBUG"></logger> <!-- 这里的logger根据需要自己灵活配置 ,我这里只是给出一个demo--> <!-- 指定开发环境基础的日志输出级别为DEBUG,并且绑定了名为STDOUT的appender,表示将日志信息输出到控制台 --> <springProfile name="dev"> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </springProfile> <!-- 指定生产环境基础的日志输出级别为INFO,并且绑定了名为ASYNC的appender,表示将日志信息异步输出到文件 --> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="ASYNC" /> </root> </springProfile> </configuration>
代码中使用
终于到最后一步了,上边介绍了怎么配置 logback-spring.xml
配置文件,下面介绍怎么在项目中引入日志对象,以及怎么使用它输出日志,直接上代码:
package com.example.demo.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; @RestController public class TestLog { private final static Logger log = LoggerFactory.getLogger(TestLog.class); @RequestMapping(value="/log",method=RequestMethod.GET) public void testLog() { log.trace("trace级别的日志"); log.debug("debug级别日志"); log.info("info级别日志"); log.warn("warn级别的日志"); log.error("error级别日志"); } }
在每一个需要使用日志对象的方法里边都要定义一次 private final static Logger log = LoggerFactory.getLogger(xxx.class);
其中 xxx
代指当前类名,如果觉得这样很麻烦,也可以通过 @Slf4j
注解的方式注入,但是这种方式需要添加 pom
依赖并且需要安装 lombok
插件,这里就不概述了,需要了解的朋友可以自己 google
。
结语
有差不多一个月的时间没有更新了,春节期间休息没写,节后一直加班,每天到家都差不多十点多了,从上周开始每天抽点时间写完这一篇博客,自认为写的还算详细,一方面是自己的加深印象,因为这一类的配置文件在实际的项目中不会每次都去配置,就拷贝粘贴一直用的,很多概念也早就忘记了,借着这次机会自己再巩固下,分享出来希望能对更多的人有点帮助吧。
以上所述就是小编给大家介绍的《Spring boot学习(七)Spring boot配置slf4j+logback日志框架》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- ssm框架配置文件说明
- LMForm - iOS表单配置框架
- 开发框架数据库配置的几种应用场景
- 使用IntelliJ IDEA开发SpringMVC网站(二)框架配置
- Go日志框架zap与lumberjack简单配置封装
- 携程配置中心框架 Apollo Node.Js 版本客户端
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective C# 中文版
Bill Wagner / 李建忠 / 人民邮电出版社 / 2007-5 / 49.00元
本书围绕一些关于C#和.NET的重要主题,包括C#语言元素、.NET资源管理、使用C#表达设计、创建二进制组件和使用框架等,讲述了最常见的50个问题的解决方案,为程序员提供了改善C#和.NET程序的方法。本书通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容,为其在不同情况下使用最佳构造提供指导。 本书适合各层次的C#程序员阅读,同时可以推荐给高校教......一起来看看 《Effective C# 中文版》 这本书的介绍吧!