参考:
SLF4J
是接口。它为各种日志的实现框架 提供了一个简单统一的接口。
log4
j、logback
都是日志的实现框架。
一般都是 联合来使用。slf4j + logback
或者 slf4j + log4j
。主要原因是:可以使用SLF4J这个统一的API接口,解耦合。
日志是 对程序的运行过程 进行一个记录。
例如:SpringBoot 项目跑起来的时候,在控制台会出现很多的信息。这些信息就是系统的日志。
如上图的控制台 会出现很多的信息,在图的最左边有一列 INFO,这是什么呢?日志级别。
在项目运行起来之后,会有很多的日志信息输出。
这些信息 包括你打印的“进入这个方法了” “出去这个方法了” 这些不重要的信息;
也包括 用户小明 被多扣了十块钱 这些重要的信息。
很明显信息之间的重要程度是不一样的,日志级别就是用来标记 信息重要程度的。
日志级别 由低到高 trace < debug < info < warn < error
.
日志的级别除了区分信息的重要程度,还有一个特别重要的作用是 调整日志信息输出的多少。
例如:在项目上线后,只需要输出 error 级别的日志信息就行了,方便运行出错后 排错。
而项目开发时,则设置为: info级别的信息 或者 debug级别的信息。
当我们设置了 整个项目的日志输出等级为Error时,代表只有Error和Error以上等级的日志信息才会被输出,其他 info debug
级别的日志就会输出。
【注意】:SpringBoot
项目默认规定的日志等级就是INFO
,所以比INFO等级低的信息都不能输出。
SpringBoot中默认集成的日志框架是 logback
。位于Spring-boot-starter
依赖中。
logback是啥呢?logback
和更加常用的 log4j
都是日志的实现框架。
logback
是 log4j
的改良版本。
SpringBoot
默认设置的日志输出级别是info
级别,,所以项目默认 只输出的info
级别的日志信息。
如果想要修改默认配置,就在 application.properties
配置文件中修改。
常见的日志配置操作:
日志输出格式
%d
:表示日期时间,%thread
:表示线程名,%-5level
:级别从左显示5个字符宽度%logger{50}
:表示logger名字最长50个字符,否则按照句点分割。%msg
:日志消息,%n
:是换行符
注意:具体包的日志级别的 优先级高于 整个项目的根日志级别,
dao
包我们定义为了debug
级别,这 时候尽管整个项目的日志级别是info
,但是
dao包相关的日志仍然按照debug级别输出。
以上就是 SpringBoot 项目中使用 logback 日志的正确姿势了。
SpringBoot 项目默认已经集成了 logback日志,所以在 SpringBoot 中使用 logback 日志,不需要导jar包。
具体的整合使用参照:https://blog.csdn.net/qq_38737586/article/details/112300134
如果在 SpringBoot 中想要用一个单独的配置文件来对logback
日志进行设置,而不使用application.yml
配置文件设置的话,也非常简单,只需要在项目的 src / resources
目录下导入 logback-spring.xml
配置文件即可。
配置文件示例如下:
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> [%p] %d{yyyy-MM-dd HH:mm:ss} %m %npattern>
layout>
appender>
<root level="INFO">
<appender-ref ref="stdout"/>
root>
<logger name="com.lu.dao" level="DEBUG"/>
configuration>
SpringBoot 中推荐使用logback
,但若想切换成log4j
日志实现的话,请看下面。
日志切换的切换不需要 修改 application 配置文件中的日志配置,只需要将 logback 的依赖切换为 log4j 即可
1.将logback的依赖排除
2.导入log4j的依赖
具体整合步骤参照:https://blog.csdn.net/qq_35599414/article/details/108536129?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
配置Log4j环境就是指配置root Logger,包括把Logger为哪个级别,为它增加哪些Appender,以及为这些Appender设置Layout,等等。因为所有其他的Logger都是root Logger的后代,所以它们都继承了root Logger的性质。
日志记录器(Logger)
,输出端(Appenders)
和 日志格式化器(Layout)
。
Logger
:控制项目中具体的包 都使用什么隔离级别,给包 设置对应的日志级别,Appender
:用来指定日志信息输出到哪个地方、以及以什么样的方式滚动。配置文件中可以同时配置多个Appender标签,即多个日志信息输出目的地。Layout
:则控制日志信息的 显示格式 。获取 root Logger(根Logger)对象来进行日志打印:
根Logger 对象是全局的一个 root对象
,,我们若是想 为某个包 甚至是类 配置单独的日志输出,可以在配置文件中进行 单独配置,单独使用代码调用。参照 ##4.5。
可以通过以下语句获得:
public static Logger Logger.getLogger(Class clazz)
//clazz 是当前类的Class对象。
其中调用Logger.getLogger(Class clazz)是目前 获取Logger对象最理想的方法。
package log4j;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4jTest {
public static void main(String[] args) {
Logger logger = Logger.getLogger(Log4jTest.class);
//使用默认的配置信息,不需要写log4j.properties
BasicConfigurator.configure();
//设置日志输出级别为info,这将覆盖配置文件中设置的级别
logger.setLevel(Level.INFO);
//下面的消息将被输出
logger.info("this is an info");
logger.warn("this is a warn");
logger.error("this is an error");
logger.fatal("this is a fatal");
}
}
日志输出位置的种类:
【常用】a:org.apache.log4j.ConsoleAppender
:将日志信息输出到控制台。
Threshold = WARN
:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush =true
:表示所有消息都会被立即输出,设为false则不输出,默认值是true
*Target =System.err
:默认值是System.out
b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。
【常用】c:org.apache.log4j.DailyRollingFileAppender
:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。 (按天滚动日志)
Threshold = WARN
:指定日志信息的最低输出级别,默认DEBUGImmediateFlush = true
:表示所有消息都会被立即输出,设为false则不输出,默认trueAppend = false
:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认trueFile = D: / logs / logging.log4j
:指定当前消息输出到logging.log4j文件DatePattern = '.' yyyy - MM
:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件 名为logging.log4j
,前一个月的日志文件名为logging.log4j.yyyy - MM
。
另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
1 ) ‘.’ yyyy - MM:每月
2 ) ‘.’ yyyy - ww:每周
3 ) ‘.’ yyyy - MM - dd:每天
4 ) ‘.’ yyyy - MM - dd - a:每天两次
5 ) ‘.’ yyyy - MM - dd - HH:每小时
6 ) ‘.’ yyyy - MM - dd - HH - mm:每分钟
d:org.apache.log4j.RollingFileAppender
:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。 (按照文件大小滚动日志)
Threshold = WARN
:指定日志信息的最低输出级别,默认DEBUG
ImmediateFlush = true
:表示所有消息都会被立即输出,设为false则不输出,默认true
Append = false
:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认true
File = D: / logs / logging.log4j
:指定消息输出到logging.log4j文件
MaxFileSize = 100KB
:后缀可以是KB,MB或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j. 1 文件
MaxBackupIndex = 2
:指定可以产生的滚动文件的最大数,例如,设为 2 则可以产生logging.log4j. 1 ,logging.log4j. 2 两个滚动文件和一个logging.log4j文件
e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
f::org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中。
日志格式化器:日志信息信息语句 的表现形式。
指定logger输出内容的格式:
可以配置在配置文件中,application.properties
配置为为:
log4j.appender.appenderName.layout = className
//className有如下3种选择。
有3种格式:
PatternLayout
(最常用的配置):ConversionPattern = % m % n
:设定以怎样的格式显示消息。% p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL
% d:输出日志时间点的日期或时间,默认格式为ISO8601,可以指定格式如: % d{yyyy / MM / dd HH:mm:ss,SSS}
% r:输出自应用程序启动到输出该log信息耗费的毫秒数
% t:输出产生该日志事件的线程名
% l:输出日志事件的发生位置,相当于 % c. % M( % F: % L)的组合,包括类全名、方法、文件名以及在代码中的行数
% c:输出日志信息所属的类目,通常就是类全名
% M:输出产生日志信息的方法名
% F:输出日志消息产生时所在的文件名
% L:输出代码中的行号
% m:输出代码中指定的具体日志信息
% n:输出一个回车换行符,Windows平台为 "rn" ,Unix平台为 "n"
% x:输出和当前线程相关联的NDC(嵌套诊断环境)
% % :输出一个 "%" 字符
我们来配置一些常用的日志输出吧:
log4j.rootLogger = DEBUG,console,dailyFile,rollingFile,logFile
log4j.additivity.org.apache = true
# 控制台(console) 控制台console日志输出器
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.ImmediateFlush = true
log4j.appender.console.Target = System.err
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
# 日志文件(logFile) 文件logFile日志输出器
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold = DEBUG
log4j.appender.logFile.ImmediateFlush = true
log4j.appender.logFile.Append = true
log4j.appender.logFile. File = D: / logs / log.log4j
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
# 滚动文件(rollingFile) 滚动文件rollingFile日志输出器
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold = DEBUG
log4j.appender.rollingFile.ImmediateFlush = true
log4j.appender.rollingFile.Append = true
log4j.appender.rollingFile. File = D: / logs / log.log4j
log4j.appender.rollingFile.MaxFileSize = 200KB
log4j.appender.rollingFile.MaxBackupIndex = 50
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
# 定期滚动日志文件(dailyFile) 定期滚动文件dailyFile日志输出器
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold = DEBUG
log4j.appender.dailyFile.ImmediateFlush = true
log4j.appender.dailyFile.Append = true
log4j.appender.dailyFile. File = D: / logs / log.log4j
log4j.appender.dailyFile.DatePattern = '.' yyyy - MM - dd
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
以上介绍的配置都是全局的,整个工程的代码使用同一套配置,意味着所有的日志都输出在了相同的地方,你无法直接了当的去看数据库访问日志、用户登录日志、操作日志,它们都混在一起.
因此,需要为包甚至是类配置单独的日志输出.
出一个例子,为 “com.demo.test”
包指定日志输出器appender “test”
,“com.demo.test”包下所有类的日志都将输出到/log/test.log
文件。
log4j.logger.com.demo.test = DEBUG,test
log4j.appender.test = org.apache.log4j.FileAppender
log4j.appender.test. File = / log / test.log
log4j.appender.test.layout = org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
也可以让同一个类输出不同的日志
1.1 为达到这个目的,需要在这个类中实例化两个logger
private static Log logger1 = LogFactory.getLog( "myTest1" );
private static Log logger2 = LogFactory.getLog( "myTest2" );
1.2 然后分别配置:
log4j.logger.myTest1 = DEBUG,test1
log4j.additivity.myTest1 = false
log4j.appender.test1 = org.apache.log4j.FileAppender
log4j.appender.test1. File = / log / test1.log
log4j.appender.test1.layout = org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
log4j.logger.myTest2 = DEBUG,test2
log4j.appender.test2 = org.apache.log4j.FileAppender
log4j.appender.test2. File = / log / test2.log
log4j.appender.test2.layout = org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern = % d{yyyy - MM - dd HH:mm:ss} [ % p] % m % n
参考:https://blog.csdn.net/qq_41947226/article/details/79800296
如下这样,就可使用 logger
对象进行日志输出。
Logger logger = LoggerFactory.getLogger(calss.class); //当前类名称
slf4j只提供了debug、warn、info、error等几个简单的接口,但由于slf4j只是接口
,其具体实现是有对应的实现类完成。所以在在使用slf4j时都是和相应日志实现一起使用。
常用的使用有:slf4j+log4j、slf4j+Logback等
slf4j原理很简单,他只提供一个核心slf4j api
(就是slf4j-api.jar包(引入Lombok依赖即可)),这个包只有日志的接口,并没有实现,所以如果要使用就得再给它提供一个实现了些接口的日志包,比 如:log4j,logback,jdk log
日志实现包等。