(一)SpringBoot项目 如何集成「logback」「log4j」日志框架?

参考:

  • 图解Java日志体系
  • SpringBoot图文教程2—日志的使用「logback」「log4j」
  • slf4j+log4j结合使用的概念了解
  • https://blog.csdn.net/zheng0518/article/details/69558893
  • 整合log4j+sfl步骤案例: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
  • 整合logback+sfl步骤案例:https://www.jianshu.com/p/2e6f7f9db93b

文章目录

  • 一、什么是日志框架?
    • 1.0 slf4j、logback、log4j辨析?
    • 1.1 什么是日志?
    • 1.2 什么是日志级别?
    • 1.3日志的级别划分
  • 二、SpringBoot 集成 logback 日志
    • 2.1 日志配置我们一般都会做什么?
    • 2.2 在springboot项目中整合logback步骤
    • 2.3 logback独立配置文件了解
  • 三、SpringBoot 集成 log4j 日志
  • 四、Log4j的组成:
    • 4.0 Logger对象详解
    • 4.1 Log4j由三个重要的组成构成:
    • 4.2 Logger详解
    • 4.2 日志输出位置Appender详解:
    • 4.3 日志格式化器Layout
    • 4.4 log4j 全局方式配置示例 .properties版本
    • 4.5 log4j局部日志配置
  • 五、slf4j具体使用


一、什么是日志框架?

1.0 slf4j、logback、log4j辨析?

SLF4J 是接口。它为各种日志的实现框架 提供了一个简单统一的接口。

log4j、logback 都是日志的实现框架。
一般都是 联合来使用。slf4j + logback 或者 slf4j + log4j。主要原因是:可以使用SLF4J这个统一的API接口,解耦合。

1.1 什么是日志?

日志是 对程序的运行过程 进行一个记录。

例如:SpringBoot 项目跑起来的时候,在控制台会出现很多的信息。这些信息就是系统的日志。

1.2 什么是日志级别?

如上图的控制台 会出现很多的信息,在图的最左边有一列 INFO,这是什么呢?日志级别。
(一)SpringBoot项目 如何集成「logback」「log4j」日志框架?_第1张图片
在项目运行起来之后,会有很多的日志信息输出。

这些信息 包括你打印的“进入这个方法了” “出去这个方法了” 这些不重要的信息;
也包括 用户小明 被多扣了十块钱 这些重要的信息。

很明显信息之间的重要程度是不一样的,日志级别就是用来标记 信息重要程度的

1.3日志的级别划分

日志级别 由低到高 trace < debug < info < warn < error.

日志的级别除了区分信息的重要程度,还有一个特别重要的作用是 调整日志信息输出的多少
例如:在项目上线后,只需要输出 error 级别的日志信息就行了,方便运行出错后 排错。
而项目开发时,则设置为: info级别的信息 或者 debug级别的信息。

当我们设置了 整个项目的日志输出等级为Error时,代表只有Error和Error以上等级的日志信息才会被输出,其他 info debug 级别的日志就会输出。

【注意】SpringBoot 项目默认规定的日志等级就是INFO,所以比INFO等级低的信息都不能输出。

二、SpringBoot 集成 logback 日志

SpringBoot中默认集成的日志框架是 logback。位于Spring-boot-starter 依赖中。

logback是啥呢?logback 和更加常用的 log4j 都是日志的实现框架。
logbacklog4j 的改良版本。

2.1 日志配置我们一般都会做什么?

SpringBoot 默认设置的日志输出级别是info级别,,所以项目默认 只输出的info级别的日志信息。

如果想要修改默认配置,就在 application.properties 配置文件中修改。

常见的日志配置操作:

  • 1、根日志级别配置(项目中所有地方 输出日志的级别)
  • 2、具体某个包的日志级别(会覆盖根日志 级别)
  • 3、定义日志信息输出到文件。
  • 4、在控制台输出的日志的格式。

日志输出格式

  • %d:表示日期时间,
  • %thread:表示线程名,
  • %-5level:级别从左显示5个字符宽度
  • %logger{50}:表示logger名字最长50个字符,否则按照句点分割。
  • %msg:日志消息,
  • %n:是换行符

注意:具体包的日志级别的 优先级高于 整个项目的根日志级别,dao包我们定义为了 debug级别,这 时候尽管整个项目的日志级别是info但是 dao包相关的日志仍然按照debug级别输出。
以上就是 SpringBoot 项目中使用 logback 日志的正确姿势了。

2.2 在springboot项目中整合logback步骤

SpringBoot 项目默认已经集成了 logback日志,所以在 SpringBoot 中使用 logback 日志,不需要导jar包。

具体的整合使用参照:https://blog.csdn.net/qq_38737586/article/details/112300134

2.3 logback独立配置文件了解

如果在 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 集成 log4j 日志

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的组成:

4.0 Logger对象详解

配置Log4j环境就是指配置root Logger,包括把Logger为哪个级别,为它增加哪些Appender,以及为这些Appender设置Layout,等等。因为所有其他的Logger都是root Logger的后代,所以它们都继承了root Logger的性质。

4.1 Log4j由三个重要的组成构成:

日志记录器(Logger)输出端(Appenders)日志格式化器(Layout)

  • Logger:控制项目中具体的包 都使用什么隔离级别,给包 设置对应的日志级别
  • Appender:用来指定日志信息输出到哪个地方、以及以什么样的方式滚动。配置文件中可以同时配置多个Appender标签,即多个日志信息输出目的地。
  • Layout:则控制日志信息的 显示格式

4.2 Logger详解

获取 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");
    }
}

4.2 日志输出位置Appender详解:

日志输出位置的种类:

【常用】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:指定日志信息的最低输出级别,默认DEBUG
  • ImmediateFlush = true:表示所有消息都会被立即输出,设为false则不输出,默认true
  • Append = false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认true
  • File = 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把日志信息输出到数据库中。

4.3 日志格式化器Layout

日志格式化器:日志信息信息语句 的表现形式。

指定logger输出内容的格式:
可以配置在配置文件中,application.properties 配置为为:
log4j.appender.appenderName.layout = className

//className有如下3种选择。
有3种格式:

  • HTMLLayout:格式化日志输出为HTML表格形式。
  • SimpleLayout:以一种非常简单的方式格式化日志输出,它打印三项内容:级别-信息
  • 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(嵌套诊断环境)
% % :输出一个 "%" 字符

4.4 log4j 全局方式配置示例 .properties版本

我们来配置一些常用的日志输出吧:

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

4.5 log4j局部日志配置

以上介绍的配置都是全局的,整个工程的代码使用同一套配置,意味着所有的日志都输出在了相同的地方,你无法直接了当的去看数据库访问日志、用户登录日志、操作日志,它们都混在一起.

因此,需要为包甚至是类配置单独的日志输出.

出一个例子,为 “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

五、slf4j具体使用

参考: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 日志实现包等。

你可能感兴趣的:(日志处理,SpringBoot,项目开发必知知识点)