log4j2的配置

log4j2的配置,不同級別日誌保存在不同文件夾(基於Springboot)

1.前言彙總

  • 目的是想按照按照規定的格式打印在控制檯,以及以文件的形式保存下來,並且按照日誌的級別,保存爲不同的log文件.
  • 首先你得搭建一個簡單的springboot項目,這個就直接在網上查,例子數不勝數
  • 然後在pom.xml文件中添加依賴:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!--添加log4j的依賴-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
  • 至於爲什麼要加上exclusions那一段標籤,原因是因爲springboot有個默認的日誌,叫logback,
    其實這個日誌也是比較好用的,可以看我的下篇文章闡述;所以要把他排除,不然也許會報出錯誤。
  • 然後是在resources目錄下加入日誌的配置文件,至於名字,在log4j2裏,配置文件檢測的過程如下:
  1. log4j會檢測名爲"log4j.configurationFile"的系統屬性值,如果這個值被設置了,則會嘗試通過ConfigurationFactory來加載這個值對應的文件。
  2. 否則它會嘗試查找log4j2-test.properties這個文件。
  3. 否則它會嘗試查找文件log4j2-test.yaml 和 log4j2-test.yml。
  4. 否則它會嘗試查找文件log4j2-test.json 和 log4j2-test.jsn。
  5. 否則查找文件log4j2-test.xml。
  6. 否則查找文件log4j2.properties。
  7. 否則查找文件log4j2.yaml 和 log4j2.yml。
  8. 否則查找文件log4j2.json 和 log4j2.jsn。
  9. 否則查找文件log4j2.xml。
  • 我直接取的是log4j2.xml

2.log4j2.xml的實際配置

  • 這裏我直接po出整個log4j2.xml吧,詳細的解釋我就直接寫在配置文件中的註釋了吧
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.example.baseframe.myspringboot.config">
<Properties>
    <property name="Log_Home">d:/logs/myspringboot/</property>
</Properties>
<appenders>
    <!--這個輸出控制檯的配置-->
    <Console name="Console" target="SYSTEM_OUT">
        <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch),ACCEPT(接受其及以上),DENY(拒絕以下),NEUTRAL(中立,由下一個ThresholdFilter處理)-->
        <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
        <!--輸出日誌格式-->
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
    </Console>
    <!--這個會只打印出所有的DEBUG信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFile_Debug" fileName="${Log_Home}/debug/debug.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
        <!-- 日誌文件大小 -->
        <SizeBasedTriggeringPolicy size="20MB" />
        <!-- 最多保留文件數 -->
        <DefaultRolloverStrategy max="20"/>
		<!--至於爲什麼只會打印出DEBUG級別的日誌,就是因爲下面的Filters標籤,
			onMatch="ACCEPT" 表示匹配該級別及以上
			onMatch="DENY" 表示不匹配該級別及以上
			onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當前是最後一個,則表示匹配該級別及以上
			onMismatch="ACCEPT" 表示匹配該級別以下
			onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當前是最後一個,則不匹配該級別以下的-->
        <Filters>
            <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>
	<!--這個會只打印出所有的INFO信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFile_Info" fileName="${Log_Home}/info/info.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
        <SizeBasedTriggeringPolicy size="20MB" />
        <DefaultRolloverStrategy max="20"/>
        <Filters>
            <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>
	<!--這個會只打印出所有的WARN信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFile_Warn" fileName="${Log_Home}/warn/warn.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
        <SizeBasedTriggeringPolicy size="20MB" />
        <DefaultRolloverStrategy max="20"/>
        <Filters>
            <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>
	<!--這個會只打印出所有的ERROR信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFile_Error" fileName="${Log_Home}/error/error.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
        <SizeBasedTriggeringPolicy size="20MB" />
        <DefaultRolloverStrategy max="20"/>
        <Filters>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
    </RollingFile>
</appenders>

<Loggers>
    <!--然後定義logger,只有定義了logger並引入的appender,
		appender纔會生效,additivity默認是true,表示將此logger的打印信息向上級傳遞,
		在這兒root就是他的上級,root的設置的打印級別是debug,logger級別沒有低於他,
		所以root裏面也會打印一遍-->
    <logger name="com.example.baseframe.myspringboot" level="DEBUG" additivity="true">
        <AppenderRef ref="RollingFile_Debug" />
        <AppenderRef ref="RollingFile_Info" />
        <AppenderRef ref="RollingFile_Warn" />
        <AppenderRef ref="RollingFile_Error" />
    </logger>
    <!--建立一個默認的root的logger-->
    <root level="DEBUG">
        <AppenderRef ref="Console" />
    </root>
</Loggers>
</Configuration>
  • 在java代碼中怎麼使用
public class Log4j2DemoApplication implements ApplicationRunner {
	private static final Logger logger = LogManager.getLogger(Log4j2DemoApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(Log4j2DemoApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        logger.debug("Debugging log");
        logger.info("Info log");
        logger.warn("Hey, This is a warning!");
        logger.error("Oops! We have an Error. OK");
        logger.fatal("Damn! Fatal error. Please fix me.");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章