栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring、springboot集成 log4j日志、log4j2日志以及slf4j

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring、springboot集成 log4j日志、log4j2日志以及slf4j

1、查看pringboot自带的日志框架

新建一个springboot 工程,查看依赖树

通过查看依赖树可以发现,springboot自带被loggong管理的log4j 、logback等日志相关的依赖。为了不影响测试结果,手动排除掉龙宫依赖

        
            org.springframework.boot
            spring-boot-starter
            
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            
        
2、spring集成log4j2

springboot集成log4j2 与spring集成的步骤一样,
先排除掉springboot自带的日志依赖,然后引入log42依赖

  
        
            org.springframework.boot
            spring-boot-starter-log4j2
        

日志配置可以通过application.properties后者yaml文件进行配置

#日志级别
logging.level.com.li=info 
#日志输出格式  打印到控制台
logging.pattern.console=%d{yyyy-MM-dd} [%level] -%m%n
#将日志输出到文件  springbootlog为生成的文件名
logging.file.path=D:/test/springbootlog

同时也可以在resource目录下新建 log4j2.xml配置文件进行配置。如果xml与properties同时存在,日志级别和格式以xml配置的为准。
如果对log的功能要求比较复杂,则使用xml方式进行配置。
xml配置与spring继承log4j2的写法一样,可以参考spring集成log4j2的xml示例





    
    
    




    
        
    


案例
package com.bjpowernode.springbootlog;

import org.apache.logging.log4j.LogManager;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootlogApplicationTests {

    @Test
    public void test01() {

        
        Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");

    }

    @Test
    public void test02() {

        
        org.apache.logging.log4j.Logger logger = LogManager.getLogger(SpringbootlogApplicationTests.class);
        logger.info("info信息");


    }

    @Test
    public void test03() {

        
        Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }

    @Test
    public void test04() {

        
        Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }

    @Test
    public void test05() {

        

        

        Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");

    }


}































3、log4j介绍 3.1组件说明
log4j1的组件:Log4j主要由 Loggers (日志记录器)、Appenders(输出控制器)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出以及输出级别(JUL做日志级别Level)
Appenders 指定日志的输出方式(输出到控制台、文件等);
Layout 控制日志信息的输出格式。
3.2 日志级别

log4j常用的日志级别有4种:DEBUG < INFO < WARN < ERROR,分别用来指定这条日志信息的重要程度,Log4j输出日志的规则是:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
所有级别

日志级别说明:
                Log4j提供了8个级别的日志输出,分别为
                ALL 最低等级 用于打开所有级别的日志记录
                TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
                DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
                INFO 消息的粗粒度级别运行信息
                WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
                        注意,有些信息不是错误,但是这个级别的输出目的就是为了给程序员以提示
                ERROR 系统的错误信息,发生的错误不影响系统的运行
                        一般情况下,如果不想输出太多的日志,则使用该级别即可
                FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
                        如果这种级别的错误出现了,表示程序可以停止运行了
                OFF 最高等级的级别,用户关闭所有的日志记录

                其中debug是我们在没有进行设置的情况下,默认的日志输出级别
3.3 、Loggers 日志记录器

Loggers:与log4j1时的定义一样。
日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名,如com.bjpowernode.log4j.XX, Logger的名字大小写敏感,其命名有继承机制父类的logger会影响子类的logger的功能:

在这里插入代码片

Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接 或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。
com.xx…og4j.XX 儿子
com.xx.log4j 父亲
com.xx爷爷


Root logger
上辈所做的日志属性设置,会直接的影响到子辈
root logger的明明规则
log4j.rootLogger=日志级别,appender1,appender3,appender3
在写appender的名字的时候,不要加appender的前缀

log4j.rootLogger=trace,console ##console 即为appender的名字
#appender
log4j.appender.console=org.apache.log4j.ConsoleAppender

自定义logger的命名: 前缀(log4j.logger)+“点包名全限定类名”

#log4j.logger为前缀 org.apache为包名:
#表示org.apache包下的日志按error级别输出
log4j.logger.org.apache=error

通过测试结果:

       从输出位置来看,控制台输出了信息,日志文件也输出了信息
       所以可以得出结论,如果根节点的logger和自定义父logger配置的输出位置是不同的
       则取二者的并集,配置的位置都会进行输出操作 
       如果二者配置的日志级别不同,以按照我们自定的父logger的级别输出为主
       即:appender取并集 ,级别以自定义logger的级别为准
log4j.rootLogger=error,console
log4j.logger.com.li=debug,console
3.4 appenders 输出控制器

定义日志输出到不同的地方, 常用Appenders:

ConsoleAppender 
将日志输出到控制台 
FileAppender 
将日志输出到文件中 
DailyRollingFileAppender 
将日志输出到一个日志文件,并且每天输出到一个新的文件 
RollingFileAppender 
将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件 
JDBCAppender 
把日志信息保存到数据库中

appender的命名方式 : 前缀(log4j.appender)+名字 : log4j.appender.name1

#配置appender输出方式 输出到控制台 console是名字,等号右面是配置appender的类型
log4j.appender.console=org.apache.log4j.ConsoleAppender
3.5 layout格式控制器

v有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
常用Layouts:

 HTMLLayout 
格式化日志输出为HTML表格形式 
SimpleLayout 
简单的日志输出格式化,打印的日志格式如默认INFO级别的消息
``PatternLayout 
最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式,
 就是用默认的转换格式`

layout命名规则:前缀+".layout",此处的前缀为appender名字
如 下面是一个appender 和一个 layout

#配置appender输出方式 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式log4j.appender.console为layout的前缀
log4j.appender.console.layout=org.apache.log4j.PatternLayout

自定义layout

log4j.rootLogger=error,console
log4j.logger.com.li=debug
log4j.appender.console=org.apache.log4j.ConsoleAppender
#自定义layout的 下面两行都要有
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 自定义layout的格式
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n

日志输出格式说明

%m 输出代码中指定的日志信息
%p 输出优先级,及 DEBUG、INFO 等
%n 换行符(Windows平台的换行符为 "n",Unix 平台为 "n")
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出打印语句所属的类的全名
%t 输出产生该日志的线程全名
%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%% 输出一个 "%" 字符
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不
会有空格
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉
3.6 log4j依赖

    log4j
    log4j
    1.2.17

3.7 使用log4j

配置文件放在resource目录下,并以 log4j2.properties名义,spring会自动识别该配置文件并装载。
在使用log4j时如果不配置配置文件 则会提示

log4j:WARN No appenders could be found for logger (com.li.Test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

如果不想写properties配置,还可以使用log4j默认的配置文件,只需要在代码中加入一行
BasicConfigurator.configure() 用来初始化配置即可。

package com.li;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;


public class Test {

    @org.junit.Test
    public void test(){
        BasicConfigurator.configure();//初始化配置
        Logger logger = Logger.getLogger(Test.class);
        logger.info("haha");
    }
}

BasicConfigurator.configure()初始化的原理是加载了一个默认的rootlogger和一个appender ,以及一个默认的PatternLayout

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.apache.log4j;

public class BasicConfigurator {
    protected BasicConfigurator() {
    }

    public static void configure() {
        Logger root = Logger.getRootLogger();
        root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
    }

    public static void configure(Appender appender) {
        Logger root = Logger.getRootLogger();
        root.addAppender(appender);
    }

    public static void resetConfiguration() {
        LogManager.resetConfiguration();
    }
}

3.7.2支持的配置文件的种类

3.8 通过配置文件properties的方式来使用log4j

在resource目录下 新加一个文件: log4j.properties
通过上面对组件的说明,各个组件的功能已经明确,下面给出一个properties配置的示例

#配置根节点logger
log4j.rootLogger=trace,console

#配置自定义logger
log4j.logger.com.bjpowernode.log4j.test=info,file

#配置apache的logger
log4j.logger.org.apache=error

#配置appender输出方式 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n

#配置appender输出方式 输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
#配置输出到文件中的格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.file.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.file.encoding=UTF-8


#RollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.rollingFile.file=D://test//log4j.log
log4j.appender.rollingFile.encoding=UTF-8
#指定日志文件内容大小
log4j.appender.rollingFile.maxFileSize=1MB
#指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex=5


#DailyRollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.dailyRollingFile.file=D://test//log4j.log
log4j.appender.dailyRollingFile.encoding=UTF-8
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd HH-mm-ss

#配置appender输出方式 输出到数据库表
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=123456
log4j.appender.logDB.Sql=INSERT INTO tbl_log(name,createTime,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')

4、 log4j2 4.1 log4j2 简介

Log4j2包含基于LMAX Disruptor库的下一代异步记录器。在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低。
在稳态日志记录期间,Log4j2 在独立应用程序中是无垃圾的,在Web应用程序中是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应性能。
log4j2里的组件与log4j1 的组件基保持一致。

4.2 log4j2依赖
  
        
            org.apache.logging.log4j
            log4j-api
            2.12.1
        
        
        
            org.apache.logging.log4j
            log4j-core
            2.12.1
        
4.3 log4j2 的使用
package com.li;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {
    @org.junit.Test
    public void test1(){
        Logger logger = LogManager.getLogger(Test.class);
//        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
}

在没有配置 配置文件的情况下,log4j2的默认打印级别为error,且回提示 No Log4j 2 configuration file found.Using default configuration

"C:Program FilesJavajdk1.8.0_45binjava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5libidea_rt.jar=57169:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5pluginsjunitlibjunit-rt.jar;C:Program FilesJavajdk1.8.0_45jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_45jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_45jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_45jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_45jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_45jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_45jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_45jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_45jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_45jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_45jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_45jrelibjce.jar;C:Program FilesJavajdk1.8.0_45jrelibjfr.jar;C:Program FilesJavajdk1.8.0_45jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_45jrelibjsse.jar;C:Program FilesJavajdk1.8.0_45jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_45jrelibplugin.jar;C:Program FilesJavajdk1.8.0_45jrelibresources.jar;C:Program FilesJavajdk1.8.0_45jrelibrt.jar;D:idea2019workceshilogtargetclasses;E:MAVEN2localRepojunitjunit4.12junit-4.12.jar;E:MAVEN2localRepoorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;E:MAVEN2localRepoorgapachelogginglog4jlog4j-api2.12.1log4j-api-2.12.1.jar;E:MAVEN2localRepoorgapachelogginglog4jlog4j-core2.12.1log4j-core-2.12.1.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.li.Test,test2
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
12:30:28.316 [main] ERROR com.li.Test - error信息

Process finished with exit code 0
4.3 log4j2 配置文件

log4j2 也支持多种配置文件,但一般使用xml作为配置文件。
在 resource目录下创建 log4j2.xml 文件作为配置文件,spring项目会自动加载。
xml中有许多标签,
:写输出的方式
:日志记录器
标签的使用流程大致为 定义appender,在logger中引用appender


  
     
    
        
        
    

    
        
            
            
        
    




4.4 log4j2集成日志门面slf4j

调用原理: slf4j门面会调用log4j2的门面,然后再有log4j2门面调用log4j2的日志实现
slf4j-api -> log4j-api ->log4j-core
导入步骤

 1.导入slf4j的日志门
       
            org.slf4j
            slf4j-api
           2.0.0-alpha1
        
 
 2.导入log4j2的适配器 
 适配器版本貌似要与log4j2版本保持一致,不然会报错(未严格测试)

		
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.12.1
        
        
 3.导入log4j2的日志门面
 
        
            org.apache.logging.log4j
            log4j-api
            2.12.1
        
 4.导入log4j2的日志实现
   
        
            org.apache.logging.log4j
            log4j-core
            2.12.1
        

由于地层使用的log4j2的日志实现,所以依然需要提供log4j2.xml 配置文件

package com.li;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Test {
    @org.junit.Test
    public void test1(){
        Logger logger = LoggerFactory.getLogger(Test.class);
//        logger.fatal("fatal信息");


        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
}

log4j2的xml文件参考示例

如果想使用异步日志 需添加异步依赖和配置properties文件

   
        
            com.lmax
            disruptor
            3.3.7
        

properties文件
在resource目录下新建一个
log4j2.component.properties 文件

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

 


    
    
        D://test
    

    

    

        
        

        

        
        

            
            

        

        
        

            
            

            

                
                

                
                

                
                

            

            
            

        

        
        

    


    
    

        
        
        

            
            

        

        
        

            
            
            
            
            
            
        

    


5 、logback的xml配置示例

在resource目录下创建logback.xml 文件




    

    
    
    

    
    

    
    

        
        ${logDir}/logback.log

        
        
            ${pattern}
        

    

    
    

        
        
            System.err
        

        
        

            
            ${pattern}

        

    

    
    

        ${logDir}/logback.html
        

            

                ${pattern1}

            

        

    

    
    

        
        
            ${pattern}
        
        
        ${logDir}/roll_logback.log

        
        

            
            ${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz

            
            1KB

        

    

    
    

        
            System.err
        

        
            ${pattern}
        

        
        

            
            ERROR

            
            ACCEPT

            
            DENY

        

    

    
    
        
    

    
    

        
        
        
        
        
    

    
    

        
        

    




该文章参考动力节点在b站上的视频

传送门 https://www.bilibili.com/video/BV1Mb4y1Z74W?p=100&spm_id_from=pageDriver

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号