log4j2.xml是什么
log4j2.xml 是用于配置 Apache Log4j 2 的 XML 格式配置文件。Log4j 2 是一个用于 Java 应用的流行日志框架,提供灵活的日志管理和配置。在 log4j2.xml 文件中,可以配置日志记录的格式、级别、目的地等。
下面是一些主要节点和属性的详细说明:
- Configuration(配置):
- 根节点,所有其他节点都位于此节点下。
- 可以包含属性如 status(设置log4j框架本身的日志级别,如 TRACE、DEBUG)、monitorInterval(配置文件的热加载时间间隔,单位为秒)。
- Appenders(附加器):
- 定义日志的输出目的地,比如文件、控制台、数据库等。
- 常见的Appender有:Console(控制台)、File(文件)、RollingFile(滚动文件)、Socket(网络套接字)、JDBC(数据库)等。
- Loggers(记录器):
- 定义日志记录的策略。
- 根记录器(Root Logger):应用中所有日志的父记录器,可以定义全局日志级别和Appender。
- 自定义记录器:可以为不同的类或包定义不同的日志级别和Appender。
- Properties(属性):
- 用于定义全局属性,这些属性可以在配置文件中的其他地方引用。
- Filters(过滤器):
- 控制哪些日志消息将被记录或丢弃。
- 可以应用于 Configuration、Appender、Logger 级别。
- Layouts(布局):
- 定义日志消息的格式。
- 常见的Layout有:PatternLayout(允许自定义消息格式)、HtmlLayout(生成HTML格式的日志)、JsonLayout(生成JSON格式的日志)等。
- AppenderRefs(Appender引用):
- 在 Loggers 节点下,通过 AppenderRef 节点引用一个或多个 Appenders,定义哪些 Appender 应该被用来记录日志。
- 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目录下
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>