springboot整合log4j2日志框架1

知者何南  论坛元老 | 2024-12-29 20:16:58 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

一  log4j基本知识
1.1 log4j的日志级别
1.2 log4j的日志文件结构*
1.2.1 概述
1.2.2 详解
1.3 log4j的日志格式化api
1.3.1 api详解
1.3.2 演示案例
 1.3.3 演示案例
1.4 log4j中onmatch和onmismatch的区别*
1.4.1 案例
1.4.2 onmatch的api
1.5 logback,log4j2和slf4j的区别
1.6 log4j2的非常日志格式配置
1.7 log4j2的异步日志配置
1.8 log4j2的日志滚动和逾期计谋配置
1.9 log4j2设置颜色
1.9.1 设置颜色
1.9.2 设置颜色方式
1.9.3 设置颜色案例
1.10 log4j2的配置使用
1.11 log4j2中includeLocation=true
1.12 log4j2中日志格式化和日志分片
1.13 log4j2中扫除包和依靠包

一  log4j基本知识

1.1 log4j的日志级别

Log4j界说了8个级别的log(撤除OFF和ALL,可以说分为6个级别),优先级依次为:All,trace,debug,info,warn,error,fatal,off。
当日志级别设置为某个值的时间,低于它的日志信息将不会被记载,只有高于设置的级别的信息会被记载。
【ALL】:最低等级的,用于打开所有日志记载。
【Trace】:很低日志级别,一样平常很少使用
【Debug】:debug级别的主要输出调试性子的内容,该级别日志主要用于在开发、测试阶段输出,该级别的日志应尽可能地细致,便于在开发、测试阶段出现问题或者非常时,对齐进行分析。
【Info】:INFO日志主要记载体系关键信息,旨在保存体系正常工作期间关键运行指标,开发人员可以将初始化体系配置、业务状态变化信息,或者用户业务流程中的核心处置惩罚记载到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试情况将日志级别调成 INFO,然后通过 INFO 级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有效的排盘问题的信息。
【warn】:warn级别的主要输出警告性子的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时,在warn级别时应输出较为细致的信息,以便于过后对日志进行分析。
【error】:error级别主要对于一些不可预知的信息,如,错误,非常等,比如,在catch快中捕获的网络通信,数据库毗连等非常,如果非常对体系的整个流程影响不大,可以使用warn级别日志输出。在输出error级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、非常对象的数据时,必要将该对象一并输出。
【fatal】:指出每个严重的错误变乱,将会导致应用程序的退出,这个级别比力高了。重大错误,这种级别你可以直接停止程序了。【1】https://blog.csdn.net/wsskl/article/details/137580290
【OFF】:最高等级的,用于关闭所有日志记载。
1.2 log4j的日志文件结构*

1.2.1 概述

Log4j的日志文件主要结构:Loggers(记载器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志种别,日志要输出的地方和日志以何种形式输出
1.properties: 界说一些变量,如日志格式,路径等。
2.Appenders:界说日志输出的目标位置,如控制台,文件等。
3.Loggers:界说日志记载器,控制日志的输出级别和目标。
4.filters:界说过滤条件,控制日志输出。
此中<configuration>标签的status属性用于设置log4j2自身jar里代码的日志输出级别。将status设置为debug可以得到更详细的内部日志输出,这对于调试和问题排查非常有帮助。

5.完整的结构

1.2.2 详解

Loggers(记载器):Loggers组件被分为7个级别,优先级从低到高:all、debug、info、warn、error、fatal、off。任何一个级别只输出本级别以及它级别以上的级别内容。
Appends(输出源):Log4j允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等。
Layout(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。
1根节点Configuration有两个属性status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以界说多个 Appender和Logger):
status用来指定log4j本身的打印日志的级别。
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
2.Appenders节点,常见的有三种子节点:Console、RollingFile、File:
1)Console节点用来界说输出到控制台的Appender
   name:指定 Appender 的名字
   target:SYSTEM_OUT 或SYSTEM_ERR,一样平常只设置默认:SYSTEM_OUT
   PatternLayout:输特别式,不设置默认为%m%n
2)File节点用来界说输出到指定位置的文件的Appender
    name:指定Appender的名字
    fileName:指定输出日志的目的文件带全路径的文件名
    PatternLayout:输特别式,不设置默认为%m%n
3)RollingFile节点用来界说超过指定大小自动删除旧的创建新的的Appender
name:指定Appender的名字
fileName:指定输出日志的目的文件带全路径的文件名
PatternLayout:输特别式,不设置默认为%m%n
filePattern:指定新建日志文件的名称格式
Policies:指定滚动日志的计谋,就是什么时间进行新建日志文件输出日志
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动计谋,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调解时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动计谋,size 属性用来界说每个日志文件的大小。
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
3.Loggers节点,常见的有两种Root和Logger:
1)root节点用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root日志输出
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender子节点的ref属性也就是前面的RollingFile中指定的name名称,子节点的level也是日志输出级别。
2)logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR。
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
name:用来指定该 Logger所适用的类或者类所在的包全路径,继续自 Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继续自 Root如果指定了,那么会在指定的这个Appender和 Root的Appender中都会输出,此时我们可以设置 Logger的 additivity="false"只在自界说的 Appender中进行输出。
案例配置:

1.3 log4j的日志格式化api

1.3.1 api详解




  log4j - 输特别式控制, PatternLayout参数寄义以及详细配置 - frank_cui - 博客园 
1.3.2 演示案例

1.检察 %l

2. 检察%L

2. 检察%L

3检察%msg

 1.3.3 演示案例

%L,%line:显示日志输出的代码所在的行数。Log4j在输出行号时会查抄堆栈信息,是耗时的操纵。
%c{precision},%logger{precision}:
logger名称,precision可以是一个正整数、负整数、"1."、"1.1.."、"."等格式,用于指定输出的logger的名称的层级和详细水平。

%C{precision},%class{precision}:输出调用者的权限定类名,precision的规则与logger名称的用法相同。Log4j在输出类名时会查抄堆栈信息,是耗时的操纵,建议使用%c{precision}或%logger{precision}代替。
%d{pattern},%date{pattern}:输出日志变乱的时间,pattern常常包罗若干对包罗时间/日期格式(SimpleDateFormat)的花括号。


%m,%msg:输出应用中自界说的日志内容;
%M,%method:输出方法名。Log4j在输出行号时会查抄堆栈信息,是耗时的操纵;
%n:输出当前运行平台所用的换行符,一样平常放在末端;
%p|level{level=label, level=label, ...},%p|level{length=n}%p|level{lowerCase=true|false}:
输出日志的级别。可以每个日志级别指定别名,如%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I},%level{length=1}也可以实现同样的效果,如果length的值超过了日志级别的名称,那么使用正常的日志级别名称。
level=label和length=n可以组合使用,如%level{ERROR=Error, length=2}为ERROR级别指定了别名,为其他日志级别限定了长度。别的,还可以指定级别的大小写。
%T,%tid,%threadId:输出日志的线程号,非常有必要;

%t,%tn,%thread,%threadName:输出日志的线程名称,雷同于线程号作用相同,可选择此中一个。https://blog.csdn.net/qq_34253002/article/details/129821103

1.4 log4j中onmatch和onmismatch的区别*

1.4.1 案例

表现匹配级别info以上的则输出,info级别以下的不匹配则忽略。

1.4.2 onmatch的api

OnMatch和onMismatch都有3个属性值,分别为ACCEPT,deny和neutal
Onmatch
Onmismatch
Accept:匹配该级别以上
Accept:匹配该级别以下
Deny:不匹配该级别以上
Deny:不匹配该级别以下
Neutral:该级别以上的,由下一个filter处置惩罚,如果当前是最后一个,则表现匹配该级别以上。
该级别以及以下的,由下一个filter处置惩罚,如果当前是最后一个,则不匹配该级别以下的。
Log4j2的onMatch和onMismatch属性值详解-CSDN博客
在log4j2中,日志级别从低到高依次为: all,trace,debug,info,warn,error,fatal,off。
当设置onMismatch=neutal时,当前过滤器不会对日志变乱做出接受或拒绝的决定,而是将变乱传递给下一个过滤器处置惩罚,如果当前过滤器是最后一个那么不匹配当前日志级别以下的变乱将被忽略。
比方,第一个过滤器level设置为error且onmatch为deny,onmismatch=accept,这意味着会输出error以下级别(warn,info,debug,trace)的日志,
当onmismatch=netral,则这些日志变乱会继续传递给下一个过滤器处置惩罚,而不是被当前过滤器直接处置惩罚或者忽略掉。
1.5 logback,log4j2和slf4j的区别

1)SLF4J: 是一个日志门面(抽象层),不是具体实现;提供统一的日志接口,允许用户在部署时选择不同的日志实现;支持多个日志实现:logback、log4j、java.util.logging等
2)Log4j: Apache的开源日志实现;Log4j 1.x已经停止维护;Log4j 2.x是完全重写的版本
3)Logback; Log4j首创人开发的新一代日志框架;作为Log4j的继续者,是SLF4J的原生实现。深入解析Java日志框架:Logback、Log4j 2与SLF4J的区别与使用指南_slf4j logback-CSDN博客4)保举使用方案:
1. SLF4J + Logback(首选)
2. SLF4J + Log4j2(备选)
5)为什么选用log4j2
相比与其他的日志体系,log4j2丢数据这种情况少;disruptor技能,在多线程情况下,性能高于logback等10倍以上;利用jdk1.5并发的特性,镌汰了死锁的发生;https://blog.csdn.net/weixin_44001965/article/details/143703014
对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用。如log4j2 + slf4j这样的组合来进行日志输出。这样做的最大好处,就是业务层的开发不必要关心底层日志框架的实现及细节,在编码的时间也不必要考虑日后更换框架所带来的成本。这也是日志接口(门面模式)所带来的好处。
Log4j2使用详解
1.6 log4j2的非常日志格式配置

https://blog.csdn.net/sz85850597/article/details/120572827


1.7 log4j2的异步日志配置

https://blog.51cto.com/1936625305/11823448
<loggers>
    <!--includeLocation 打印行号,如果这里不设置,就算%L 也不会打印行号-->
    <AsyncRoot level="DEBUG" includeLocation="true" >
        <AppenderRef ref="CONSOLE"/>
    </AsyncRoot>
    <AsyncLogger name="com.luna" level="INFO" includeLocation="true" >
        <appender-ref ref="FILE-INFO"/>
        <appender-ref ref="FILE-ERROR"/>
    </AsyncLogger>
    <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" >
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE-INFO"/>
    </AsyncLogger>
</loggers>
1.8 log4j2的日志滚动和逾期计谋配置

<!--http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFileAppender-->
    <!--
    name:FILE-INFO  appender 名字可以自界说,logger引用使用
    fileName:当前日志名称,如果是多级目次,则会自动创建
    filePattern:归档日志格式
    -->
    <RollingRandomAccessFile name="FILE-INFO"
                             fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log"
                             filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz">
        <!--
            minLevel:最小日志级别
            maxLevel:最大日志级别
            onMatch:匹配成功汲取
            onMismatch:匹配失败丢弃
        -->
        <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        <!--
            pattern:日志格式
            charset:日志字符编码
        -->
        <atternLayout pattern="${PATTERN}" charset="${CHARSET}" />
        <olicies>
            <!--每天滚动一次,interval的单位 取决于filePattern 我这里界说的是dd(天)也就是每天会产生一个新的日志文件 -->
            <TimeBasedTriggeringPolicy interval="1"/>
            <!--或者日志文件达到10KB 滚动一次-->
            <SizeBasedTriggeringPolicy size="10KB"/>
        </Policies>
        <!--日志删除计谋-->
        <!--DefaultRolloverStrategy 默认的max=7 代表的是dd(天)最多产生7个文件,多余自动删除,但是我们会自己界说删除计谋所以要屏蔽这个配置,如果不屏蔽这个配置,则当天日志最多只有7个 -->
        <!--源码:org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder.build ,当fileIndex=nomax,不在使用max变量 -->
        <DefaultRolloverStrategy fileIndex="nomax">
            <!--basePath:从此处扫描必要删除的日志基本路径,maxDepth:要访问的日志目次最大级别数,默认是1  -->
            <!--比方我们的日志是/data/logs/app/app-info.log,basePath=/data/logs,maxDepth=2 恰好能访问到app-info.log -->
            <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2">
                <!--删除,正则匹配到文件名-->
                <IfFileName glob="*-info.*.log.gz"/>
                <!--删除,日志距离现在多长变乱,P1D代表是1天-->
           <!--http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html-->
                <IfLastModified age="1D"/>
            </Delete>
        </DefaultRolloverStrategy>
    </RollingRandomAccessFile>
详细配置:https://blog.51cto.com/1936625305/11823448

1.9 log4j2设置颜色

1.9.1 设置颜色

SpringBoot整合Log4j2日志框架 - Evan1024 - 博客园  整个log4j2框架
    <Console name="consoleAppender" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--设置日志格式及颜色-->
            <atternLayout
                    pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
                     noConsoleNoAnsi="false"/>
        </Console>
<Console name="consoleAppender" target="SYSTEM_OUT">
<!--设置日志格式及颜色-->
<atternLayout 
pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"   disableAnsi="false" noConsoleNoAnsi="false"/>
</Console>
1.9.2 设置颜色方式

修改日志配置中pattern属性, 通过%style{xxxx}{styleValue1,styleValue2}和%highlight{}可以很轻易修改日志样式。设置属性disableAnsi为false,表现开启Ansi,这样才会输出有样式的日志。
https://mp.weixin.qq.com/s/jN9h2FjSQKPXv8mkShkJ_g
方式1:style{pattern}{ANSI style}
%style{%d{ISO8601}}{black} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg%n%throwable}{green}
方式2:highlight{pattern}{style}
%highlight{%d [%t] %-5level: %msg%n%throwable}
%highlight{%d [%t] %-5level: %msg%n%throwable}{STYLE=Logback}

1.9.3 设置颜色案例

%style{%throwable}{red} 非常信息标红色
<atternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %style{%L}{red} %M - %msg%style{%throwable}{red}%n"  disableAnsi="false" noConsoleNoAnsi="false"/>

案例截图如下:https://mp.weixin.qq.com/s/yYzFN7OTMh9IO8x_LaGLWg

1.10 log4j2的配置使用

https://cloud.tencent.com/developer/article/2332025

使用了Lombok提供的@Log4j2注解,自动天生了一个名为log的Logger对象。在类中的方法中通过log对象记载了相应的日志信息。

1.11 log4j2中includeLocation=true

在includeLocation=true的作用确保日志输出中包罗类的路径和行号信息,对于调式和定位问题非常有帮助。如下图
<AsyncLogger name=”st” level=”debug” includeLocation=”true”>
</AsyncLogger>
当设置为false时,不再输出行号信息。

1.12 log4j2中日志格式化和日志分片

1.日志格式化
2.日志分片:https://mp.weixin.qq.com/s/-a3tvoOo_3ppX68fP92FOA

1.13 log4j2中扫除包和依靠包

1.扫除包
log4j与log4j2性能对比及log4j升级至log4j2方案
<exclusions>
    <!-- log4j 干系包 -->
    <exclusion>
        <artifactId>log4j</artifactId>
        <groupId>log4j</groupId>
    </exclusion>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j</artifactId>
    </exclusion>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <!-- log4j 的springboot starter -->
    <exclusion>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <groupId>org.springframework.boot</groupId>
    </exclusion>

    <!-- logback 干系包 -->
    <exclusion>
        <artifactId>logback-classic</artifactId>
        <groupId>ch.qos.logback</groupId>
    </exclusion>
    <exclusion>
        <artifactId>logback-core</artifactId>
        <groupId>ch.qos.logback</groupId>
    </exclusion>

    <!-- slf4j 干系包 -->
    <exclusion>
        <artifactId>slf4j-log4j12</artifactId>
        <groupId>org.slf4j</groupId>
    </exclusion>
     <exclusion>
        <artifactId>log4j-to-slf4j</artifactId>
        <groupId>org.apache.logging.log4j</groupId>
    </exclusion>
    <exclusion>
        <artifactId>slf4j-api</artifactId>
        <groupId>org.slf4j</groupId>
    </exclusion>
2.新增包
<!-- log4j2的api、core和web包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- slf4j与log4j2的毗连包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- log4j与log4j2的毗连包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- log4j2支撑完全异步模式的关键api -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>
<!-- slf4j本身的api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
3.框架对应的包名
在log4j版本,Logger的包路径是org.apache.log4j。
在log4j2版本,Logger的包路径是org.apache.logging.log4j
4替换日志配置文件。
在log4j版本,配置文件为log4j.xml或者log4j.properties。
在log4j2版本,配置文件为log4j2.xml。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表