log4j2的xml配置控制台打印日志和自定义打印到指定日志文件

本文详细介绍了Log4j框架的配置方法,包括如何通过配置文件指定日志输出位置、级别和格式,以及如何针对不同类或包设定独立的日志记录器。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <!-- 控制台打印日志 -->
        <Console name="consolePrint" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <!-- 将日志输出到指定文件 fileName属性值为日志文件地址-->
        <File name="LogFile" fileName="D:\file.log" append="false">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </File>
        <File name="SqlLogFile" fileName="D:\mybatis.log" append="false">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </File>

    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="consolePrint" />
        </Root>

        PS:配置多个logger可以指定不同类或包下打印的日志输出到不同的文件里,name属性值设置为指定的类或包,additivity设置为"false"将只作用于当前appender-ref,即sql不会打印在root指定的appender(控制台)里,只会单独打印在指定的日志文件(mybatis.log)中
        <!-- 配置mybatis打印sql 指定mapper所在包的全路径 -->
        <logger name="com.domain.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="SqlLogFile" />
        </logger>

        <!-- 将com.test包下的Test类中的级别不小于INFO的日志既打印到root指定的appender(控制台)中又单独打印到指定的日志文件(file.log)中 -->

        <logger name="com.test.Test" level="INFO" additivity="true">
            <appender-ref ref="LogFile" />
        </logger>

    </Loggers>
</Configuration>
 

 

 

package com.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {

  private Logger logger = LogManager.getLogger(Test.class);

  public void test() {

       logger.info("我将被打印到file.log中");

}

  
}
 

log4j2自定义插件导致控制台日志重复打印,可尝试以下解决办法: ### 检查Appender配置 确保在`log4j2.xml`或其他配置文件里,没有重复配置控制台Appender。要是有多个控制台Appender向同一输出目标,就会造成日志重复打印。例如,下面的配置存在重复的控制台Appender: ```xml <Configuration status="WARN"> <Appenders> <Console name="Console1" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <Console name="Console2" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console1"/> <AppenderRef ref="Console2"/> </Root> </Loggers> </Configuration> ``` 要把重复的控制台Appender移除,只保留一个: ```xml <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` ### 检查插件配置 确认自定义插件没有多次注册相同的Appender或者重复添加日志处理逻辑。若自定义插件里有代码重复添加了控制台Appender,就得修改插件代码,保证只添加一次。例如,在自定义插件代码中: ```java import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.layout.PatternLayout; public class CustomPlugin { public static void configureLogger() { LoggerContext context = LoggerContext.getContext(false); Configuration config = context.getConfiguration(); // 避免重复添加控制台Appender if (config.getAppender("Console") == null) { PatternLayout layout = PatternLayout.newBuilder() .withPattern("%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n") .build(); Appender appender = ConsoleAppender.newBuilder() .setName("Console") .setLayout(layout) .build(); appender.start(); config.addAppender(appender); LoggerConfig rootLogger = config.getRootLogger(); rootLogger.addAppender(appender, null, null); } } } ``` ### 检查日志级别过滤器 确保日志级别过滤器配置无误,防止因为配置不当导致日志重复输出。例如,若某个日志级别被多次处理,就可能出现重复打印的情况。可通过设置合适的日志级别过滤器来避免。 ```xml <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` ### 检查上下文配置 确保在应用程序里没有多个`LoggerContext`实例同时工作,多个上下文可能会造成日志重复处理。要保证整个应用程序只使用一个`LoggerContext`实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值