log4j2 入门学习与总结

2023-10-30

log4j2【2.3】入门学习与总结

大纲:

  • log4j2 配置文件加载
  • log4j2 配置文件结构图
  • log4j2 配置文件说明
  • log4j2 Appenders.child.Filter.ThresholdFilter 的使用
  • log4j2 实战示例
  • log4j2 logger 加载规则

目录


一、log4j2 配置文件加载

log4j2 的配置文件只用 xml、json、jsn 三种格式,默认情况下由系统自动加载,系统加载 classpath 目录如下的配置文件:
- log4j-test.json 或者 log4j-test.jsn 文件
- log4j2-test.xml
- log4j-test.json 或者 log4j-test.jsn 文件
- log4j2.xml
加载优先级由上向下,且只加载其一。

二、log4j2 配置文件结构图

这里写图片描述

三、log4j2 配置文件说明

1、configration

字段 描述
status 日志级别 默认值为最高级别 OFF
monitorInterval 监控间隔,例如:monitorInterval=”600” 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置


2、Appenders 定义输出类型
1) Child

字段 描述
Layout 输出类型的模板、布局
Filters 过滤器,过滤掉不需要的日志


2)Filters.ThresholdFilter

字段 描述
level 输出级别,例:level=”info”,日志级别为info或者以上(匹配的界别)
onMatch DENY/ACCEPT 禁止或者接受(是否接受匹配)
onMismatch DENY/NEUTRAL (是否接受其他高于level的级别)


一般的组合为:

  • onMatch=”DENY” onMismatch=”NEUTRAL “
  • onMatch=”ACCEPT ” onMismatch=”DENY”

3、Loggers 注册日志输出对象
1) Logger 日志输出对象

字段 解释
name 输出对象名称
level 日志级别
additivity 是否冒泡,既在本层输出日志后是否需要在父对象上输出该日志,默认为 true

代码说明

<!-- 始祖日志输出对象 -->
<Root level="info">
    <AppenderRef ref="Appender3" />
</Root>
<!-- 父日志输出对象 -->
<logger level="warn" name="com.person" additivity="false">
   <AppenderRef ref="Appender1" />
</logger>
<!-- 继承了com.person 的子日志输出对象 -->
<logger level="info" name="com.person.man" additivity="true">
    <AppenderRef ref="Appender2" />
</logger>

在 com.person.man 包下面或者类下面执行以下代码

logger.info("man info");    // Appender1、Appender2 有输出
logger.error("man error");  // Appender1、Appender2 有输出
logger.warn("man warn");    // Appender1、Appender2 有输出
四、log4j2 Appenders.child.Filter.ThresholdFilter 的使用
<?xml version="1.0" encoding="UTF-8"?>
<!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL  -->
<!-- configure.monitorInterval 监控间隔
         指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->
<configuration status="off" monitorInterval="600"> 
  <properties>
    <property name="LOG_HOME">logs</property>
    <property name="ERROR_FILE_NAME">myError</property>
    <property name="WARN_FILE_NAME">myWarn</property>
    <property name="INFO_FILE_NAME">myInfo</property>
    <property name="DEBUG_FILE_NAME">myDebug</property>
  </properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} {%t} %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="infoLog" fileName="E:/info.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      <!-- 输出日志级别为 info 的日志 -->
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
    </File>
    <File name="warnLog" fileName="E:/warn.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      <!-- 输出日志级别为 warn 的日志 -->
        <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
    </File>
    <File name="errorLog" fileName="E:/error.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      <!-- 输出日志级别为 error 的日志 -->
        <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
    </File>
  </Appenders>
  <Loggers>
    <Root level="info">
        <AppenderRef ref="infoLog" />
        <AppenderRef ref="warnLog" />
        <AppenderRef ref="errorLog" />
    </Root>
  </Loggers>
</configuration>
五、log4j2 实战示例

1、根据日志级别输出到不同文件,按日期进行封存日志

<?xml version="1.0" encoding="UTF-8"?>
<!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL  -->
<!-- configure.monitorInterval 监控间隔
         指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->
<configuration status="off" monitorInterval="600"> 
  <properties>
    <property name="LOG_HOME">E:/webbase/logs</property>
    <property name="LOG_BACK_HOME">${LOG_HOME}/backup</property>
    <property name="ERROR_FILE_NAME">error</property>
    <property name="WARN_FILE_NAME">warn</property>
    <property name="INFO_FILE_NAME">info</property>
    <property name="DEBUG_FILE_NAME">debug</property>
  </properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} {%t} %-5level %logger{36} - %msg%n"/>
    </Console>
    <!-- 配置日志输出文件名字     追加读写 -->    
    <!-- Error console log -->
    <RollingFile name="ErrLog" fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${ERROR_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
        <!-- 输出格式 -->    
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
        <!-- 设置策略 -->  
        <Policies>    
            <!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:  
                interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,  
                    比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟  
                modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,  
                    则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,  
                    那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,  
                    之后的封存时间依次为08:00,12:00,16:00  
             -->  
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        </Policies> 
        <Filters>
         <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile> 

    <!-- Warn console log -->
    <RollingFile name="WarnLog" fileName="${LOG_HOME}/${WARN_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${WARN_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
        <!-- 输出格式 -->    
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
        <!-- 设置策略 -->  
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        </Policies> 
        <Filters>
          <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile> 
    <!-- Info console log -->
    <RollingFile name="InfoLog" fileName="${LOG_HOME}/${INFO_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
        <!-- 输出格式 -->    
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
        <!-- 设置策略 -->  
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        </Policies> 
        <Filters>
          <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile> 
    <!-- Debug console log -->
    <RollingFile name="DebugLog" fileName="${LOG_HOME}/${DEBUG_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${DEBUG_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
        <!-- 输出格式 -->    
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
        <!-- 设置策略 -->  
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        </Policies> 
        <Filters>
          <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile> 
  </Appenders>
  <Loggers>
    <Logger name="org.webbase" level="debug" additivity="true">
        <AppenderRef ref="DebugLog" />
        <AppenderRef ref="InfoLog" />
    </Logger>
    <Root level="warn">
        <AppenderRef ref="WarnLog" />
        <AppenderRef ref="ErrLog" />
        <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</configuration>

TimeBasedTriggeringPolicy

属性 解释
interval (integer)该属性是相对 RollingFile.filePattern 中的
%d{yyyy-MM-dd}值,例:
filePattern=”xxx%d{yyyy-MM-dd}xx” interval=”2” 表示将2天一个日志文件;
filePattern=”xxx%d{yyyy-MM-dd-HH}xx” interval=”1”表示一个小时一个日志文件
modulate (boolean)以0点为边界进行偏移计算
六、log4j2 logger 加载规则
  1. logger name 相同时,以 level 级别高的为准
  2. logger name = “org” 会被 name=”org.xxx” 继承
  3. logger 中的 additivity=”true” 表示子日志所获得的日志也会在父日志中出现,即使 父日志的 level 远高于子日志的 level
  4. 当子日志 level 大于 父日志时,父日志只能接收到子日志过滤后的日志
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

log4j2 入门学习与总结 的相关文章

  • ConsoleAppender 实例化不起作用:具有私有访问权限

    我的 ConsoleAppender 类实例化不起作用 import org apache logging log4j core appender ConsoleAppender public class Application priva
  • 是否有与 TestNG 连接的 log4j 附加程序?

    我使用 log4j 并希望通常在我的日志记录工具中结束的日志消息出现在我的单元测试期间 TestNG 创建的测试报告中 我认为这意味着 log4jAppender输出到 TestNGListener以及我的 Maven 项目的 src te
  • 鉴于我陷入了 SLF4J 和 java.util.Logging 的困境,最佳解决方案是什么?

    情况 我们使用带有异步附加程序的 SLF4j 和 Log4j 2 问题是我们还使用 JSF 它使用java util Logging 我看到各种关于使用性能的令人发指的警告jul to slf4j因为你不能就这么放弃java util Lo
  • 捕获 log4j 输出

    我们正在使用log4j2广泛地存在于我们的系统中 并对其进行配置log4j2 xml 现在我需要一个可以运行的新应用程序jobs 我想单独捕获时间 X 和 Y 之间产生的所有日志并将其放入数据库中 我们框架的正常日志记录应该照常发生 记录到
  • log4j:记录包,但不包括其子包

    您好 我想排除某些子包被我的一个记录器记录 因为它们正在被另一个记录器记录 例如 com mysite app logger1 com mysite app news logger2 com mysite app events logger
  • logger.log 未记录到 alfresco.log

    我正在尝试在与 Alfresco 中的模板页面相对应的 javascript 文件中使用 logger log Hello 我设置了以下内容 在custom log4j properties中 覆盖log4j properties log4
  • 从 log4j.Logger 获取 Logger 的通用方法

    而不是在每个类上指定类名 log Logger getLogger Foo class log Logger getLogger Bar class log Logger getLogger Test class 使用可以吗 log Log
  • 停止从依赖项向控制台显示记录器输出

    我的 Java 项目中有一些 Maven 依赖项 它们使控制台输出与冗余日志信息变得混乱 我想禁用此类日志记录 设置additivity财产给false可能有帮助 但无法正确使用它 我正在寻找一个log4j xml仅打印日志输出的配置 wa
  • log4j编码utf8

    我使用 Java 和 Log4j 我想记录一个带有德语特殊字符的字符串 例如 等 但在我的日志文件中它看起来像这样
  • 来自 Kafka Producer 的控制台消息过多

    如何控制 Kafka 生产者或消费者的控制台日志记录级别 我在 Scala 中使用 Kafka 0 9 API 每次send on the KafkaProducer被调用时 控制台给出如下输出 这是否表明我没有KafkaProducer设
  • Log4j:如何配置最简单的文件日志记录?

    我的故事 我想做一个像最简单的 log4j 记录器一样简单的东西 它将行记录到文件中 我找到了几个具有某些功能的示例 但不是一个真正有效的基本 通用的示例 也没有一个解释每一行如何工作的示例 问题 有人可以提供一份吗 先决条件 我已经知道该
  • 将 System.out.println 记录到单个应用程序的日志文件

    我们在 tomcat 上有多个应用程序 它们使用 System out println 语句记录到 catalina out 有一个应用程序会创建大量日志语句 因此我想将这些应用程序输出记录到单独的日志文件中 我创建了一个 log4j xm
  • 如何让log4j记录到文件并打印到控制台

    我可以将日志发送到控制台 但似乎无法将其发送到日志文件 这是我的properties file log4j rootLogger DEBUG LOG stdout log4j appender stdout org apache log4j
  • maven install 仅在第二次尝试后抛出“打开 zip 文件时出错”

    我尝试在我的项目上运行 Maven install 并带有一些依赖项
  • 我需要 log4j 1.2 和 2.5 共存于同一个 web 应用程序中

    我有一个 java web 应用程序 它使用 Crystal 的 Business Objects 运行时来运行以该技术编码的报告 问题在于 Crystal 的猴子直接引用了 log4j 1 2 类中的方法 此方法不是 log4j 1 2
  • 用户主目录中的 log4j 日志文件

    我正在开发一个可以在 OSX 和 Windows 上运行的应用程序 我希望将日志写入用户主目录 对于 OSX 它将位于 Users Library Application Support MyApp log 目录下 而在 Windows 下
  • 如何在 log4j 中启用包级别日志记录

    谁能告诉我 log4j 中的包级别日志记录是什么 以及如何实现这一点 今天我的面试问题无法回答 即使我在谷歌中也没有找到好的解决方案 太感谢了 包级别日志记录是 log4j 的标准日志记录 使用 log4j 配置 您可以指定包和关联的级别
  • 在 Spark java 应用程序中使用 log4j2

    我正在尝试使用 log4j2我的 Spark 工作中的记录器 基本要求 log4j2 配置位于类路径之外 因此我需要明确指定其位置 当我直接在 IDE 中运行代码而不使用spark submit log4j2效果很好 但是 当我使用以下命令
  • 从 Glassfish 取消部署 Grails 应用程序会发生类不变性违规

    我有一个在 Glassfish 中运行的 Grails 应用程序 但是当我取消部署时 它会出现 违反类不变性 快速查看堆栈跟踪并在网络上搜索报告 这是 Log4j 的问题 我当时使用的是最新的log4jlog4j 1 2 16 jar 任何
  • JBoss 7.2 版本使用什么日志记录?

    java 中可以使用多种日志记录变体 最流行的是 log4j 和 JDK 日志记录 我想知道 JBoss Application Server 7 2 版本默认使用什么日志记录 通过查看模块或配置文件很难找到所使用的记录器 如果有人可以在这

随机推荐

  • 电容实际等效模型(容抗、感抗、品质因数Q)

    来自 https blog csdn net Albert992 article details 104346051
  • 腾讯音乐第三道编程题

    2023 4 13号的第三道编程笔试题 题目描述 给一个数字n 构成n n 1 2大小的数组 包含1个1 2个2 n个n 最后输出的数组相邻的两个数字不相同 输出的数组可能不唯一 例如 输入 4 输出 4 3 4 3 4 3 4 2 1 2
  • 【项目实战】C语言+easyX带你实现:找方块

    每天一个编程小项目 提升你的编程能力 程序介绍 该程序是仿照最近网上的找方块游戏编写的 虽然没有仿照的一模一样 但是也实现了他的一些功能 个人觉得可玩性还是挺高的 是一个不错的娱乐放松的游戏 编写简介 该游戏的编写还是挺容易的 可以大致分为
  • echarts 柱状图颜色设置

    作者 船长在船上 主页 来访地址船长在船上的博客 简介 高级前端开发工程师 专注前端开发 欢迎咨询交流 共同学习 感谢 如果觉得博主的文章不错或者对你的工作有帮助或者解决了你的问题 可以关注 支持一下博主 如果三连收藏支持就会更好 在这里博
  • 初识C语言函数(一)

    1 函数是什么 在计算机科学中 子程序 英语 Subroutine procedure function routine method subprogram callable unit 是一个大型程序中的某部分代码 由一个或多个语句块组成
  • a+b 的简单问题

    a b problem 添加链接描述 include
  • React Hooks学习--useReducer,useMemo和useRef

    一 useReducer function ReducerDemo const count dispatch useReducer state action gt switch action case add return state 1
  • H5 缓存机制浅析 - 移动端 Web 加载性能优化

    腾讯 Bugly 特约作者 贺辉超 1 H5 缓存机制介绍 H5 即 HTML5 是新一代的 HTML 标准 加入很多新的特性 离线存储 也可称为缓存机制 是其中一个非常重要的特性 H5 引入的离线存储 这意味着 web 应用可进行缓存 并
  • U盘产生快捷方式病毒

    u盘不小心染了病毒 文件都变成了快捷方式 真实的源文件都变成了隐藏文件 看着这么多快捷方式真是不开心 这个病毒的机制也很简单 它在u盘里放了一个survival vbe文件 就感染了u盘 然后在电脑的c盘放两个survival vbe文件
  • SSH使用篇:Windows登录Ubuntu虚拟机&设置免密登录

    目录 一 ssh的安装与启动 1 安装 2 启动服务器的SSH服务 二 口令登录 1 登录命令 2 验证过程 3 登录失败 1 服务器变更 2 服务器IP变化 三 免密登录 公钥登录 大致的三步 0 准备工作 不一定要弄 1 客户端生成公私
  • 【java】获取属性名工具

    背景 在编码时经常会用到同名的属性名字符串 比如 用相同的属性名做为 map 中的键 在 mybatis 中 根据属性名的下划线字符串来拼接 sql 查询条件 需要修改属性名时 如果是用字符串硬编码的 引用的地方越多 修改越困难 但是如果用
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    转载注明 http dwz win gHc最近网上出现一个美团面试题 一个线程OOM后 其他线程还能运行吗 我看网上出现了很多不靠谱的答案 这道题其实很有难度 涉及的知识点有jvm内存分配 作用域 gc等 不是简单的是与否的问题 由于题目中
  • 向日葵远程控制端 for Mac

    向日葵远程控制端 for Mac是Mac平台上一款免费的远程桌面控制软件 向日葵远程控制软件免费版支持Mac OS X 10 10 3以上系统 相比客户端的向日葵远程软件 这款控制端功能更加齐全 向日葵客户端仅支持远程桌面 而向日葵控制端则
  • 虚拟主机也是虚拟服务器,虚拟主机和云主机之间的区别是什么

    其实在云计算不断发展的今天 虚拟主机和云主机之间的竞争 也越来越强烈了 此时不少人问虚拟主机和云主机之间的区别是什么 小编表示目前云主机在市场的应用中的优势越来越明显了 很多个人站长和企业们 也都是会使用云主机 因此大家就不妨看看虚拟主机和
  • MIPI CSI接口调试方法: data rate计算

    mipi DPHY 的规格书里对 data rate 有定义上下限值 最低 data rate为 80M bps 最高为 2500M bps 由于mipi 传输时是双采样 这样的话 实际的差分时钟的上下限就是 40MHz 1250 MHz
  • mac 安装adb工具

    1 安装homebrew 在终端输入下面的命令 ruby e curl fsSL https raw githubusercontent com Homebrew install master install 2 安装adb brew in
  • conda install & pip install区别 & 查看当前环境下包的情况

    conda可以方便开发管理python环境 包可以conda 安装有时使用pip整理一下不同点 conda 创建环境 conda create name a conda env python 3 6 名为a conda env python
  • SVG图标配置

    在开发项目的时候我们经常会用到svg矢量图 而且我们使用SVG以后 页面上加载的不再是图片资源 这对页面性能来说也是个很大的提升 项目背景 vue3 vite ts 安装依赖 npm install vite plugin svg icon
  • 202320读书笔记|《宋词》——竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生

    202320读书笔记 宋词 竹杖芒鞋轻胜马 谁怕 一蓑烟雨任平生 宋词 韩震主编 偶然从书友那加入书架的书 宋词挺喜欢李清照的词以及知否的 菩萨蛮 诗集 词 俳句 短歌我都很喜欢 是轻松有趣又简短的 这本书里有一些是上学时候背过的 看到的时
  • log4j2 入门学习与总结

    log4j2 2 3 入门学习与总结 大纲 log4j2 配置文件加载 log4j2 配置文件结构图 log4j2 配置文件说明 log4j2 Appenders child Filter ThresholdFilter 的使用 log4j