log4j2.xml介绍和使用

news2025/1/15 13:09:33

log4j2.xml是什么

log4j2.xml 是用于配置 Apache Log4j 2 的 XML 格式配置文件。Log4j 2 是一个用于 Java 应用的流行日志框架,提供灵活的日志管理和配置。在 log4j2.xml 文件中,可以配置日志记录的格式、级别、目的地等。

下面是一些主要节点和属性的详细说明:

  1. Configuration(配置):
  • 根节点,所有其他节点都位于此节点下。
  • 可以包含属性如 status(设置log4j框架本身的日志级别,如 TRACE、DEBUG)、monitorInterval(配置文件的热加载时间间隔,单位为秒)。
  1. Appenders(附加器):
  • 定义日志的输出目的地,比如文件、控制台、数据库等。
  • 常见的Appender有:Console(控制台)、File(文件)、RollingFile(滚动文件)、Socket(网络套接字)、JDBC(数据库)等。
  1. Loggers(记录器):
  • 定义日志记录的策略。
  • 根记录器(Root Logger):应用中所有日志的父记录器,可以定义全局日志级别和Appender。
  • 自定义记录器:可以为不同的类或包定义不同的日志级别和Appender。
  1. Properties(属性):
  • 用于定义全局属性,这些属性可以在配置文件中的其他地方引用。
  1. Filters(过滤器):
  • 控制哪些日志消息将被记录或丢弃。
  • 可以应用于 Configuration、Appender、Logger 级别。
  1. Layouts(布局):
  • 定义日志消息的格式。
  • 常见的Layout有:PatternLayout(允许自定义消息格式)、HtmlLayout(生成HTML格式的日志)、JsonLayout(生成JSON格式的日志)等。
  1. AppenderRefs(Appender引用):
  • 在 Loggers 节点下,通过 AppenderRef 节点引用一个或多个 Appenders,定义哪些 Appender 应该被用来记录日志。
  1. Logger(记录器):
  • name:定义Logger的名称,通常是相关联的Java类或包的名称。
  • level:定义日志级别,如 TRACE、DEBUG、INFO、WARN、ERROR、FATAL。
  • additivity:布尔值,控制日志是否向上级Logger传递,默认为true。

Appenders 节点详解

  • Console:用于定义输出日志到控制台的配置。可以通过 target 属性选择输出到标准输出(SYSTEM_OUT)或错误输出(SYSTEM_ERR),通常我们使用默认的 SYSTEM_OUT。PatternLayout 用于设置日志的输出格式,默认为 %m%n。
  • File:这个节点让我们能将日志直接输出到指定的文件中。我们需要设置 fileName 属性来指明日志文件的保存位置和文件名。同样,PatternLayout 允许我们自定义日志的格式。
  • RollingFile:相较于 File,RollingFile 添加了日志文件滚动的功能,即当日志文件达到一定条件时,自动创建新文件继续记录日志,避免单一文件过大。我们通过 filePattern 来设置新日志文件的命名规则。Policies 下的子节点如 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 分别根据时间和文件大小来触发滚动。DefaultRolloverStrategy 用于控制同一目录下最多保留的日志文件数量。
  • ThresholdFilter:这是一个可选属性,用来基于日志级别过滤日志记录。onMatch 和 onMismatch 属性允许我们精细控制日志的接受或拒绝规则。

Loggers 节点详解

  • Root:定义全局的日志记录策略,即如果没有为特定的类或包指定 Logger,就会默认使用 Root 的配置。level 属性确定了全局的日志级别。
  • Logger:用于为特定的类或包定义日志记录策略,可以单独设置日志级别和输出目的地(Appender)。name 属性指定了该 Logger 应用于哪个类或包,而 AppenderRef 子节点则指定了日志应该输出到哪个 Appender。如果希望日志仅输出到指定的 Appender 而不是同时输出到 Root 定义的 Appender,可以将 additivity 设置为 false。

SpringBoot项目中使用

pom.xml引入需要的依赖

<properties>
  <!-- spring-boot 版本 -->
  <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
  <!-- log4j2 版本 -->
  <log4j.version>2.17.0</log4j.version>
</properties>


<!--web依赖        -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>${spring-boot.version}</version>
</dependency>

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

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>${log4j.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>${log4j.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>${log4j.version}</version>
</dependency>

配置文件 log4j2.xml

log4j2.xml 文件放在resources目录下

img

log4j2.xml 文件配置如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
  <properties>
    <property name="LOG_HOME">./logs</property>
  </properties>
  <Appenders>
    <!--*********************控制台日志***********************-->
    <Console name="consoleAppender" target="SYSTEM_OUT">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
      <!--设置日志格式及颜色-->
      <PatternLayout
        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" charset="UTF-8"/>
    </Console>

    <!--*********************文件日志***********************-->
    <!--all级别日志-->
    <RollingFile name="allFileAppender"
      fileName="${LOG_HOME}/all.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log">
      <!--设置日志格式-->
      <PatternLayout>
        <pattern>%d %p %C{} [%t] %m%n</pattern>
      </PatternLayout>
      <Policies>
        <!-- 设置日志文件切分参数 -->
        <!--<OnStartupTriggeringPolicy/>-->
        <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
        <SizeBasedTriggeringPolicy size="100MB"/>
        <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
        <TimeBasedTriggeringPolicy/>
      </Policies>
      <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>

    <!--debug级别日志-->
    <RollingFile name="debugFileAppender"
      fileName="${LOG_HOME}/debug.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
      <Filters>
        <!--过滤掉info及更高级别日志-->
        <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
      </Filters>
      <!--设置日志格式-->
      <PatternLayout>
        <pattern>%d %p %C{} [%t] %m%n</pattern>
      </PatternLayout>
      <Policies>
        <!-- 设置日志文件切分参数 -->
        <!--<OnStartupTriggeringPolicy/>-->
        <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
        <SizeBasedTriggeringPolicy size="100MB"/>
        <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
        <TimeBasedTriggeringPolicy/>
      </Policies>
      <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>

    <!--info级别日志-->
    <RollingFile name="infoFileAppender"
      fileName="${LOG_HOME}/info.log"
      filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
      <Filters>
        <!--过滤掉warn及更高级别日志-->
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <!--<DefaultRolloverStrategy max="20"/>-->
        </RollingFile>

        <!--warn级别日志-->
        <RollingFile name="warnFileAppender"
                     fileName="${LOG_HOME}/warn.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--过滤掉error及更高级别日志-->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!--error及更高级别日志-->
        <RollingFile name="errorFileAppender"
                     fileName="${LOG_HOME}/error.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <!--设置日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 设置日志文件切分参数 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
                <SizeBasedTriggeringPolicy size="100MB"/>
                <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>

        <!--json格式error级别日志-->
        <RollingFile name="errorJsonAppender"
                     fileName="${LOG_HOME}/error-json.log"
                     filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
            <JSONLayout compact="true" eventEol="true" locationInfo="true"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <logger name="org.springframework" level="info"/>
        <logger name="org.mybatis" level="info"/>
        <logger name="org.apache" level="info"/>
        <!-- 根日志设置 -->
        <Root level="INFO">
            <AppenderRef ref="allFileAppender" level="all"/>
            <AppenderRef ref="consoleAppender" level="debug"/>
            <AppenderRef ref="debugFileAppender" level="debug"/>
            <AppenderRef ref="infoFileAppender" level="info"/>
            <AppenderRef ref="warnFileAppender" level="warn"/>
            <AppenderRef ref="errorFileAppender" level="error"/>
            <AppenderRef ref="errorJsonAppender" level="error"/>
        </Root>
    </Loggers>

</Configuration>

重新运行后可以看到日志文件

img

控制台日志

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内容管理平台原来对企业这么重要,看完收藏!

“内容为王”&#xff0c;这是当今数字化时代的一个重要真理。不论是创业新贵、还是行业巨头&#xff0c;纷纷开始深入理解和应用内容管理平台&#xff08;Content Management System&#xff0c;简称CMS&#xff09;&#xff0c;以便更好的管理其大量的内容和信息。 那么&…

网络安全从业人员何去何从

从2024年1月1日开始到今天&#xff0c;基本没有真正放下自己休息过一天。可能很多人会说是卷&#xff0c;其实真正的原因是压力。不仅仅是生活压力还有行业压力。 今年这个行业让很多人开始感到了迷茫&#xff0c;不仅是股市的低迷&#xff0c;更多的来自于各大公司不断的因为…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…

Stable-Diffusion的WebUI部署实战

1、环境准备及安装 1.1、linux环境 # 首先&#xff0c;已经预先安装好了anaconda&#xff0c;在这里新建一个环境 conda create -n sdwebui python3.10 # 安装完毕后&#xff0c;激活该环境 conda activate sdwebui# 安装 # 下载stable-diffusion-webui代码 apt install wget…

String 底层是如何实现的?

1、典型回答 String 底层是基于数组实现的&#xff0c;并且数组使用了 final 修饰&#xff0c;不同版本中的数组类型也是不同的&#xff1a; JDK9 之前&#xff08;不含JDK9&#xff09; String 类是使用 char[ ]&#xff08;字符数组&#xff09;实现的但 JDK9 之后&#xf…

C#版开源免费的Bouncy Castle密码库

前言 今天大姚给大家分享一款C#版开源、免费的Bouncy Castle密码库&#xff1a;BouncyCastle。 项目介绍 BouncyCastle是一款C#版开源、免费的Bouncy Castle密码库&#xff0c;开发人员可以通过该项目在他们的 C# 应用程序中使用 Bouncy Castle 提供的各种密码学功能&#x…

如何使用 Langchain、Ollama 和 Streamlit 构建 RAG

一、先决条件&#xff1a;您需要了解什么 在深入讨论技术细节之前&#xff0c;我们先概述一下先决条件。Python 的基础知识至关重要&#xff0c;因为它是我们将使用的主要语言。熟悉机器学习和自然语言处理的基本概念将帮助您更轻松地掌握这些概念。此外&#xff0c;对 Langch…

瑞熙贝通实验室物联网管理平台新升级|支持远程开门视频监控与电源控制以及环境监测

瑞熙贝通实验室智能物联网管控平台&#xff1a;利用“互联网与物联网技术”有机融合&#xff0c;对实验室的用电安全监测、实验室环境异常监测&#xff08;颗粒物监测、明火监测、可燃气体、烟雾监测、温湿度传感器、红外人体感应&#xff09;、实验室人员安全准入、万物互联等…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时&#xff0c;输入参数名称搜索&#xff0c;搜出来的同名参数结果有多个&#xff0c;分布在一个表格的不同行&#xff0c;表格是动态加载的&#xff0c;需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改&#xff1f; 2、网页元素…

数字工厂管理系统和ERP管理系统有什么区别

在制造业的数字化转型浪潮中&#xff0c;数字工厂管理系统和ERP管理系统作为两大核心系统&#xff0c;扮演者不可或缺的角色。虽然它们都是为了提高企业的运营效率和降低成本&#xff0c;但在功能与实施效果方面&#xff0c;二者却有着显著的区别。本文将从这两个方面对数字工厂…

Pytorch实战01——CIAR10数据集

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

day57 动态规划part17● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇

如果大家做了很多这种子序列相关的题目&#xff0c;在定义dp数组的时候 很自然就会想题目求什么&#xff0c;我们就如何定义dp数组。 布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j…

C++学习路线

C学习路线思维导图&#xff0c;肝了一个星期终于搞定&#xff0c;这么硬核求个赞不过分吧&#xff1f; 思维导图的内容&#xff0c;也是本文的内容框架&#xff0c;坐稳扶好&#xff0c; C 高速快车要发车了&#xff01; 内容我会持续更新&#xff0c;点赞收藏&#xff0c;…

Window系统下Vscode配置C/Cpp运行+调试环境

Window系统下Vscode配置C/Cpp运行调试环境 文章目录 Window系统下Vscode配置C/Cpp运行调试环境1.安装Vscode2.安装C/Cpp插件3.配置gcc编译器4.配置Cpp运行环境5.配置Cpp调试环境 1.安装Vscode 安装VScode很简单&#xff0c;直接到官网进行下载&#xff0c;然后傻瓜安装即可。 …

读CDO代码

前置任务 module PIL.Image has no attribute ANTIALIASImage.ANTIALIAS 替换为 Image.LANCZOS&#xff0c;参考https://blog.csdn.net/fovever_/article/details/134690657 OSError: science is not a valid package style, path of style file, URL of这是对应可视化里面生…

GraphView实现测量工具

效果演示&#xff1a; 主模块代码&#xff1a; MeasureGraphView::MeasureGraphView(QWidget *parent): QWidget(parent) {ui.setupUi(this);m_measureType NoType;m_bll BllData::getInstance();m_scene new GraphicsScene;connect(m_bll, &BllData::pressMeasurePos…

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇7基于stm32的智能衣柜系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 ---------------…

Sqllab第一关通关笔记

知识点&#xff1a; 明白数值注入和字符注入的区别 数值注入&#xff1a;通过数字运算判断&#xff0c;1/0 1/1 字符注入&#xff1a;通过引号进行判断&#xff0c;奇数个和偶数个单引号进行识别 联合查询&#xff1a;union 或者 union all 需要满足字段数一致&…

基础小白快速入门opencv-------C++ 在opencv的应用以及opencv的下载配置

啥是opencv&#xff1f; OpenCV&#xff08;开源计算机视觉库 Open Source Computer Vision Library&#xff09;是一个跨平台的计算机视觉库&#xff0c;最初由Intel开发&#xff0c;现在由一个跨国团队维护。它免费提供给学术和商业用途&#xff0c;并且是用C语言写成的&…