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

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2、spring集成log4j2

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

  <!-- 添加log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

日志配置可以通过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示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

<Appenders>
    <!-- 配置控制台输出 -->
    <Console name="consoleAppender" >
    </Console>
</Appenders>

<!-- 配置logger -->
<Loggers>
    <Root level="info">
        <AppenderRef ref="consoleAppender"/>
    </Root>
</Loggers>
</Configuration>

案例

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() {

        /*

            入门案例:
                springboot日志具体实现
                    级别测试
                    默认是info级别
                    logback的风格输出(默认使用的是logback的日志实现)


         */
        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() {

        /*

            使用log4j2的日志实现
            观察桥接器是否起作用
            结果:仍然是slf4j+logback
            证明桥接器是起作用的

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


    }

    @Test
    public void test03() {

        /*

            application.properties(yml)是springboot的核心配置文件(用来简化开发使用)

            我们也可以通过该配置文件,修改日志相关的配置

         */
        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() {

        /*

            将日志输出到文件中
                使用logging.file.path来配置文件路径下的文件夹(logging.file直接配置文件的形式已经过时,不使用)
                在配置的文件夹下,日志文件生成的名字为spring.log

         */
        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() {

        /*

            如果是需要配置日志拆分等相对高级的功能
            那么application.properties就达不到需要了
            需要使用日志实现相应的配置文件

            例如我们现在使用的是logback日志实现
            那么就需要在类路径resources下,配置logback.xml

            由于log4j2性能的强大
            当今市场上越来越多的项目选择使用slf4j+log4j2的组合
            springboot默认使用的是slf4j+logback的组合
            我们可以将默认的logback替换成为log4j2

            1.启动器依赖,间接的依赖logback
                所以需要将之前的环境中,logback的依赖去除掉
            2.添加log4j2依赖
            3.将log4j2的配置文件log4j2.xml导入到类路径resources下面

         */

        /*Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);

        for (int i = 0; i < 2000; i++) {

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

        }*/

        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依赖


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

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;
/**
 * @author liql
 * @date 2022/3/20
 */

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依赖

  <!--log4j2 的日志门面-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.12.1</version>
        </dependency>
        <!--log4j2 的日志实现-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>

4.3 log4j2 的使用

package com.li;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
 * @author liql
 * @date 2022/3/20
 */
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 Files\Java\jdk1.8.0_45\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=57169:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar;D:\idea2019work\ceshilog\target\classes;E:\MAVEN2\localRepo\junit\junit\4.12\junit-4.12.jar;E:\MAVEN2\localRepo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\MAVEN2\localRepo\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;E:\MAVEN2\localRepo\org\apache\logging\log4j\log4j-core\2.12.1\log4j-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

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">  <!--status可有可无,表示是log4j2自身的日志打印级别-->
   <!--定义appender   target="SYSTEM_ERR" 表示打印的日志为红色字体-->  
    <appenders>
        <Console name="consoleAppender" target="SYSTEM_ERR">
        </Console>
    </appenders>

    <Loggers>
        <root level="info">
            <!--引用appender-->
            <AppenderRef ref="consoleAppender"></AppenderRef>
        </root>
    </Loggers>

</Configuration>


4.4 log4j2集成日志门面slf4j

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

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

		<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.12.1</version>
        </dependency>
        
 3.导入log4j2的日志门面
 <!-- log4j2日志门面 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.12.1</version>
        </dependency>
 4.导入log4j2的日志实现
   <!-- log4j2日志实现 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>

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

package com.li;


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

/**
 * @author liql
 * @date 2022/3/20
 */
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文件

   <!-- 异步日志依赖 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.7</version>
        </dependency>

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

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error"> <!--status 可有可无,表示是log4j2自身的日志打印级别-->


    <!--

        配置全局通用属性

    -->
    <properties>
        <property name="logDir">D://test</property>
    </properties>

    <!-- 配置appender -->

    <Appenders>

        <!-- 配置控制台输出 -->
        <Console name="consoleAppender" target="SYSTEM_OUT">

        </Console>

        <!-- 配置文件输出-->
        <File name="fileAppender" fileName="${logDir}//log4j2.log">

            <!-- 配置文件输出格式 -->
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>

        </File>

        <!--
            按照指定规则来拆分日志文件

            fileName:日志文件的名字
            filePattern:日志文件拆分后文件的命名规则
                        $${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
                                    例如:2021-01-01这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
                                          2021-01-02这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
          rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
                        为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
        -->
        <RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
                        filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">

            <!-- 日志消息格式 -->
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>

            <Policies>

                <!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
                <OnStartupTriggeringPolicy/>

                <!-- 按照文件的大小进行拆分 -->
                <SizeBasedTriggeringPolicy size="10KB"/>

                <!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
                <TimeBasedTriggeringPolicy/>

            </Policies>

            <!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
            <DefaultRolloverStrategy max="30"/>

        </RollingFile>

        <!-- 配置异步日志 -->
        <!--<Async name="myAsync">

            &lt;!&ndash; 将控制台输出做异步的操作 &ndash;&gt;
            <AppenderRef ref="consoleAppender"/>

        </Async>-->

    </Appenders>


    <!-- 配置logger -->
    <Loggers>

        <!-- 自定义logger,让自定义的logger为异步logger -->
        <!--

            includeLocation="false"
            表示去除日志记录中的行号信息,这个行号信息非常的影响日志记录的效率(生产中都不加这个行号)
            严重的时候可能记录的比同步的日志效率还有低

            additivity="false"
            表示不继承rootlogger

        -->
        <AsyncLogger name="com.bjpowernode" level="trace"
                            includeLocation="false" additivity="false">

            <!-- 将控制台输出consoleAppender,设置为异步打印 -->
            <AppenderRef ref="consoleAppender"/>

        </AsyncLogger>

        <!-- 配置rootlogger -->
        <Root level="trace">

            <!-- 引用Appender -->
            <!--<AppenderRef ref="consoleAppender"/>-->
            <!--<AppenderRef ref="fileAppender"/>-->
            <!--<AppenderRef ref="rollingFile"/>-->
            <!--<AppenderRef ref="myAsync"/>-->
            <AppenderRef ref="consoleAppender"/>
        </Root>

    </Loggers>

</Configuration>

5 、logback的xml配置示例

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

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--

        配置文件通用属性
        <property name="" value=""></property>
        所谓配置文件中的通用属性是为了让接下来的配置更加方便引用
        通过以${name}的形式,方便的取得value值
        通过取得的value值可以做文件的其他配置而使用

    -->

    <!--

        我们在此可以先做日志输出格式相关的配置
        %-10level  级别 案例为设置10个字符,左对齐
        %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
        %c  当前类全限定名
        %M  当前执行日志的方法
        %L  行号
        %thread 线程名称
        %m或者%msg    信息
        %n  换行

        以property的形式将日志输出格式配置成为文件的通用的属性
        那么下面我们配置的输出方式中,就可以重复的引用该配置(以下的配置,对于输出格式就不用配置多次了)

    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
    <property name="pattern1" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>

    <!-- 配置文件的输出路径 -->
    <property name="logDir" value="D://test"></property>

    <!-- 配置文件的appender 普通文件-->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">

        <!-- 引入文件位置 -->
        <file>${logDir}/logback.log</file>

        <!-- 设置输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>

    </appender>

    <!-- 配置控制台appender -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">

        <!--

            表示对于日志输出目标的配置
            默认:System.out 表示以黑色字体输出日志
            设置:System.err 表示以红色字体输出日志

        -->
        <target>
            System.err
        </target>

        <!--

            配置日志输出格式
            手动配置格式的方式
            直接引入上述的通用属性即可

        -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <!-- 格式引用通用属性配置 -->
            <pattern>${pattern}</pattern>

        </encoder>

    </appender>

    <!-- 配置文件的appender html文件 -->
    <appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">

        <file>${logDir}/logback.html</file>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

            <layout class="ch.qos.logback.classic.html.HTMLLayout">

                <pattern>${pattern1}</pattern>

            </layout>

        </encoder>

    </appender>

    <!-- 配置文件的appender 可拆分归档的文件 -->
    <appender name="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 输入格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!-- 引入文件位置 -->
        <file>${logDir}/roll_logback.log</file>

        <!-- 指定拆分规则 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

            <!-- 按照时间和压缩格式声明文件名 压缩格式gz -->
            <fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>

            <!-- 按照文件大小来进行拆分 -->
            <maxFileSize>1KB</maxFileSize>

        </rollingPolicy>

    </appender>

    <!-- 配置控制台的appender 使用过滤器 -->
    <appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">

        <target>
            System.err
        </target>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>

        <!-- 配置过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">

            <!-- 设置日志的输出级别 -->
            <level>ERROR</level>

            <!-- 高于level中设置的级别,则打印日志 -->
            <onMatch>ACCEPT</onMatch>

            <!-- 低于level中设置的级别,则屏蔽日志 -->
            <onMismatch>DENY</onMismatch>

        </filter>

    </appender>

    <!-- 配置异步日志 -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="consoleAppender"/>
    </appender>

    <!--

        日志记录器
        配置root logger
        level:配置日志级别

        可以同时配置多个appender,做日志的多方向输出

    -->
    <root level="ALL">

        <!-- 引入appender -->
        <!--<appender-ref ref="roll"/>-->
        <!--<appender-ref ref="consoleFilterAppender"/>-->
        <!--<appender-ref ref="consoleAppender"/>-->
        <appender-ref ref="asyncAppender"/>
    </root>

    <!--

        additivity="false"
        表示不继承rootlogger

    -->
    <logger name="com.bjpowernode" level="info" additivity="false">

        <!-- 在自定义logger中配置appender -->
        <appender-ref ref="consoleAppender"/>

    </logger>

</configuration>


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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值