Java猿社區之日誌組件升級Log4j2

Java猿社區之日誌組件升級Log4j2

前言

升級前提介紹:在線客服關於升級Log4j2記錄日誌的總結

本次升級樣例項目:

  • ddky-backManage-all
  • ddky-report-web

參考:
http://logging.apache.org/log4j/2.x/manual/webapp.html#Servlet-2.5

升級web

修改pom

刪除舊依賴

  • 此處需要刪除各包下引用的低版本log4j,使用excludes去除
  • 可以使用mvn dependency:tree查看衝突和低版本log4j引用情況
  • idea可以直接使用Digrams -> show dependencies
                <!-- Log4j 刪除舊版本 -->
		<!--<dependency>-->
			<!--<groupId>org.slf4j</groupId>-->
			<!--<artifactId>slf4j-api</artifactId>-->
			<!--<version>${slf4j.version}</version>-->
		<!--</dependency>-->
		<!--<dependency>-->
			<!--<groupId>org.slf4j</groupId>-->
			<!--<artifactId>slf4j-log4j12</artifactId>-->
			<!--<version>${slf4j.version}</version>-->
		<!--</dependency>-->
		<!--<dependency>-->
			<!--<groupId>log4j</groupId>-->
			<!--<artifactId>log4j</artifactId>-->
			<!--<version>${log4j.version}</version>-->
		<!--</dependency>-->
        
        <!-- 排除log4j和logback依賴包 -->
        <dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.6</version>
			<exclusions>
				<!--  排除log4j1的方式  -->
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<!--  排除logback的方式  -->
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
        
        <!-- 去除disconfig log4j1 -->
		<dependency>
            <groupId>com.baidu.disconf</groupId>
            <artifactId>disconf-client</artifactId>
            <version>2.6.35-ddky</version>
            <exclusions>
                <exclusion>
                     <groupId>commons-io</groupId>
                     <artifactId>commons-io</artifactId>
                </exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
            </exclusions>
        </dependency>
        <dependency>
			<groupId>com.github.sgroschupf</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.1</version>
			<exclusions>
				<!--  排除log4j1的方式  -->
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<!--  排除logback的方式  -->
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
        
        ...等等等

引入log4j2依賴:
版本統一使用:

  • log4j-2.11.2
  • disruptor-3.4.2

<!-- ***********Log4j2升級開始********** -->

		<!-- log4j2依賴包 異步日誌 -->
		<dependency>
			<groupId>com.lmax</groupId>
			<artifactId>disruptor</artifactId>
			<version>3.4.2</version>
		</dependency>

		<!-- slf4j門面包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>

		<!-- log4j2核心包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.11.2</version>
		</dependency>

		<!-- log4j2門面包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.11.2</version>
		</dependency>

		<!-- 該包是 log4j 升級到 log4j2的必須包 使用該包 不需要修改以前的 Logger.getLogger()這種獲取對象的方式 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-1.2-api</artifactId>
			<version>2.11.2</version>
		</dependency>
		<!-- 該包是slf4j 升級到 log4j2的必須包 使用該包 其他依賴jar中依賴slf4j 不會報錯 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>2.11.2</version>
		</dependency>

		<!-- web項目需要引用此包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
			<version>2.11.2</version>
		</dependency>

		<!-- 橋接:告訴commons logging使用Log4j2 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-jcl</artifactId>
			<version>2.11.2</version>
			<scope>runtime</scope>
		</dependency>

		<!-- ***********Log4j2升級結束********** -->

配置web.xml

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mMkdrvJ3-1578400083971)(./1578389815402.png)]

升級web-app到2.5版本(推薦,由於公司項目servlet都採用2.5版本)

原先:

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

改爲:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		 version="2.5">

修改原先的配置

        <listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener
		</listener-class>
	</listener>
        <context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>

添加新配置:

	<!--日誌升級開始-->
	<listener>
		<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
	</listener>
	<filter>
		<filter-name>log4jServletFilter</filter-name>
		<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>log4jServletFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>ERROR</dispatcher>
		<!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
		<!-- <dispatcher>ASYNC</dispatcher> -->
	</filter-mapping>

	<context-param>
		<param-name>log4jConfiguration</param-name>
		<param-value>/WEB-INF/classes/log4j2.xml</param-value>
		<!--<param-value>classpath:log4j2.xml</param-value>-->
	</context-param>
	<!--<context-param>-->
		<!--<param-name>log4jRefreshInterval</param-name>-->
		<!--<param-value>1000</param-value>-->
	<!--</context-param>-->
	<!--日誌升級結束-->
升級web-app到3.0版本(不推薦,升級改動範圍大)

原先:

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

改爲:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
		 version="3.0">

添加新配置:

	<!--日誌升級開始-->
	<context-param>
		<param-name>log4jConfiguration</param-name>
		<param-value>/WEB-INF/classes/log4j2.xml</param-value>
		<!--<param-value>classpath:log4j2.xml</param-value>-->
	</context-param>
	<context-param>
		<param-name>isLog4jAutoInitializationDisabled</param-name>
		<param-value>true</param-value>
	</context-param>
	<!--日誌升級結束-->

升級pom依賴servlet-api版本到3.0

創建resources/log4j2.xml

並備份和刪除原先的log4j.properties

創建log4j2.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="30" strict="true">

    <Properties>
        <!-- 日誌輸出級別 -->
        <Property name="LOG_DEBUG_LEVEL" value="debug"/>
        <Property name="LOG_INFO_LEVEL" value="info"/>
        <Property name="LOG_WARN_LEVEL" value="warn"/>
        <!-- error級別日誌 -->
        <Property name="LOG_ERROR_LEVEL" value="error"/>
        <!-- 在當前目錄下創建名爲log目錄做日誌存放的目錄 -->
        <!--<Property name="LOG_HOME" value="./log"/>-->
        <Property name="LOG_HOME" value="E:\dd\codes\o2o\20160219\web\ddky_report_web\log"/>
        <!-- 檔案日誌存放目錄 -->
        <Property name="LOG_ARCHIVE" value="${LOG_HOME}/archive"/>
        <!-- 模塊名稱, 影響日誌配置名,日誌文件名,根據自己項目進行配置 -->
        <Property name="LOG_MODULE_NAME" value="ddky-report-web"/>
        <!-- 日誌文件大小,超過這個大小將被壓縮 -->
        <Property name="LOG_MAX_SIZE" value="100 MB"/>
        <!-- 保留多少天以內的日誌 -->
        <Property name="LOG_DAYS" value="30"/>
        <!--輸出日誌的格式:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度, %msg:日誌消息,%n是換行符 -->
        <Property name="LOG_PATTERN" value="%d [%t] %-5level %logger{0} - %msg%n"/>
        <!--interval屬性用來指定多久滾動一次-->
        <Property name="TIME_BASED_INTERVAL" value="1"/>
    </Properties>

    <Appenders>
        <!-- 控制檯輸出 -->
        <Console name="STDOUT" target="SYSTEM_OUT">
            <!--輸出日誌的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制檯只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="${LOG_DEBUG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!--只記錄debug級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileDebug"
                                 fileName="${LOG_HOME}/debug.log"
                                 filePattern="${LOG_ARCHIVE}/debug-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="true">
            <Filters>
                <ThresholdFilter level="${LOG_DEBUG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!-- 這個會打印出所有的info級別以上,error級別一下的日誌,每次大小超過size或者滿足TimeBasedTriggeringPolicy,則日誌會自動存入按年月日建立的文件夾下面並進行壓縮,作爲存檔-->
        <!--異步日誌會自動批量刷新,所以將immediateFlush屬性設置爲false-->
        <RollingRandomAccessFile name="RollingRandomAccessFileInfo"
                                 fileName="${LOG_HOME}/info.log"
                                 filePattern="${LOG_ARCHIVE}/info-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="false">
            <Filters>
                <!--如果是error級別拒絕,設置 onMismatch="NEUTRAL" 可以讓日誌經過後續的過濾器-->
                <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!--如果是info\warn輸出-->
                <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,根據當前filePattern設置是1天滾動一次-->
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認同一文件夾下最多保存7個文件-->
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!--只記錄error級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileError"
                                 fileName="${LOG_HOME}/error.log"
                                 filePattern="${LOG_ARCHIVE}/error-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="false">
            <Filters>
                <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!--只記錄warn級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileWarn"
                                 fileName="${LOG_HOME}/warn.log"
                                 filePattern="${LOG_ARCHIVE}/warn-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="false">
            <Filters>
                <ThresholdFilter level="${LOG_WARN_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

    </Appenders>

    <Loggers>

        <!-- 本機環境使用 -->
        <!--<Root level="${LOG_DEBUG_LEVEL}">-->
            <!--<AppenderRef ref="STDOUT"/>-->
            <!--<AppenderRef ref="RollingRandomAccessFileInfo"/>-->
            <!--<AppenderRef ref="RollingRandomAccessFileError"/>-->
            <!--<AppenderRef ref="RollingRandomAccessFileDebug"/>-->
            <!--<AppenderRef ref="RollingRandomAccessFileWarn"/>-->
        <!--</Root>-->

        <!-- 開發環境使用 -->
        <Root level="${LOG_INFO_LEVEL}">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="RollingRandomAccessFileInfo"/>
            <AppenderRef ref="RollingRandomAccessFileError"/>
            <AppenderRef ref="RollingRandomAccessFileWarn"/>
        </Root>

        <!-- 生產預發佈環境使用 -->
        <!--<Root level="${LOG_INFO_LEVEL}" includeLocation="false">-->
        <!--<AppenderRef ref="RollingRandomAccessFileInfo"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileError"/>-->
        <!--</Root>-->


        <!-- 第三方日誌系統 -->
        <logger name="org.springframework.core" level="info" />
        <logger name="org.springframework.beans" level="info" />
        <logger name="org.springframework.context" level="info" />
        <logger name="org.springframework.web" level="info" />
        <logger name="org.jboss.netty" level="warn" />
        <logger name="org.apache.http" level="warn" />

    </Loggers>

</Configuration>

修改log4j2.xml中屬性

  • immediateFlush:如果使用異步日誌,請設置爲false,同步日誌,請設置爲true
  • LOG_MODULE_NAME:模塊名稱,建議按照項目模塊命名

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zItlk7Om-1578400083972)(./1578389836501.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JAsazHkm-1578400083973)(./1578389844163.png)]

配置log4j2.component.properties

# 設置異步日誌系統屬性
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
AsyncLoggerConfig.WaitStrategy=Sleep
#AsyncLoggerConfig.RingBufferSize=10240

Service服務

打印druid sql—修改applicationContext.xml

添加如下配置:

    <!-- druid 打印sql日誌 -->
	<bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
		<property name="connectionLogEnabled" value="false"/>
		<property name="statementLogEnabled" value="false"/>
		<property name="resultSetLogEnabled" value="true"/>
		<property name="statementExecutableSqlLogEnable" value="true"/>
	</bean>

引入log-filter
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-u376jDrk-1578400083973)(./1578389861224.png)]

log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="30" strict="true">

    <Properties>
        <!-- 日誌輸出級別 -->
        <Property name="LOG_DEBUG_LEVEL" value="debug"/>
        <Property name="LOG_INFO_LEVEL" value="info"/>
        <Property name="LOG_WARN_LEVEL" value="warn"/>
        <!-- error級別日誌 -->
        <Property name="LOG_ERROR_LEVEL" value="error"/>
        <!-- 在當前目錄下創建名爲log目錄做日誌存放的目錄 -->
        <Property name="LOG_HOME" value="./log"/>
        <!--<Property name="LOG_HOME" value="E:\dd\codes\log"/>-->
        <!--<Property name="LOG_HOME" value="E:\dd\codes\o2o\20160219\web\ddky_report_web\log"/>-->
        <!-- 檔案日誌存放目錄 -->
        <Property name="LOG_ARCHIVE" value="${LOG_HOME}/archive"/>
        <!-- 模塊名稱, 影響日誌配置名,日誌文件名,根據自己項目進行配置 -->
        <Property name="LOG_MODULE_NAME" value="ddky-backManage-all"/>
        <!-- 日誌文件大小,超過這個大小將被壓縮 -->
        <Property name="LOG_MAX_SIZE" value="100 MB"/>
        <!-- 保留多少天以內的日誌 -->
        <Property name="LOG_DAYS" value="30"/>
        <!--輸出日誌的格式:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度, %msg:日誌消息,%n是換行符 -->
        <Property name="LOG_PATTERN" value="%d [%t] %-5level %logger{0} - %msg%n"/>
        <!--interval屬性用來指定多久滾動一次-->
        <Property name="TIME_BASED_INTERVAL" value="1"/>
    </Properties>

    <Appenders>
        <!-- 控制檯輸出 -->
        <Console name="STDOUT" target="SYSTEM_OUT">
            <!--輸出日誌的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制檯只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="${LOG_DEBUG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <!--只記錄debug級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileDebug"
                                 fileName="${LOG_HOME}/debug.log"
                                 filePattern="${LOG_ARCHIVE}/debug-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="true">
            <Filters>
                <ThresholdFilter level="${LOG_DEBUG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!-- 這個會打印出所有的info級別以上,error級別一下的日誌,每次大小超過size或者滿足TimeBasedTriggeringPolicy,則日誌會自動存入按年月日建立的文件夾下面並進行壓縮,作爲存檔-->
        <!--異步日誌會自動批量刷新,所以將immediateFlush屬性設置爲false-->
        <RollingRandomAccessFile name="RollingRandomAccessFileInfo"
                                 fileName="${LOG_HOME}/info.log"
                                 filePattern="${LOG_ARCHIVE}/info-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="true">
            <Filters>
                <!--如果是error級別拒絕,設置 onMismatch="NEUTRAL" 可以讓日誌經過後續的過濾器-->
                <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!--如果是info\warn輸出-->
                <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,根據當前filePattern設置是1天滾動一次-->
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認同一文件夾下最多保存7個文件-->
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!--只記錄error級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileError"
                                 fileName="${LOG_HOME}/error.log"
                                 filePattern="${LOG_ARCHIVE}/error-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="true">
            <Filters>
                <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!--只記錄warn級別以上的日誌,與info級別的日誌分不同的文件保存-->
        <RollingRandomAccessFile name="RollingRandomAccessFileWarn"
                                 fileName="${LOG_HOME}/warn.log"
                                 filePattern="${LOG_ARCHIVE}/warn-%d{yyyy-MM-dd}-%i.log.gz"
                                 immediateFlush="true">
            <Filters>
                <ThresholdFilter level="${LOG_WARN_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

        <!--druid的日誌記錄追加器-->
        <RollingRandomAccessFile name="druidSqlRollingFile" fileName="${LOG_HOME}/druid-sql.log"
                                 filePattern="${LOG_ARCHIVE}/druid-sql-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
            </Policies>
            <DefaultRolloverStrategy max="${LOG_DAYS}"/>
        </RollingRandomAccessFile>

    </Appenders>

    <Loggers>

        <!-- 本機環境使用 -->
        <!--<Root level="${LOG_DEBUG_LEVEL}" includeLocation="true" additivity="true">-->
        <!--<AppenderRef ref="STDOUT"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileInfo"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileError"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileDebug"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileWarn"/>-->
        <!--</Root>-->

        <!-- 開發環境使用 -->
        <Root level="${LOG_INFO_LEVEL}" includeLocation="true" additivity="true">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="RollingRandomAccessFileInfo"/>
            <AppenderRef ref="RollingRandomAccessFileError"/>
            <AppenderRef ref="RollingRandomAccessFileWarn"/>
        </Root>

        <!--記錄druid-sql的記錄-->
        <logger name="druid.sql.Statement" level="debug" additivity="false">
        <appender-ref ref="druidSqlRollingFile"/>
        </logger>

        <!-- 生產預發佈環境使用 -->
        <!--<Root level="${LOG_INFO_LEVEL}" includeLocation="false" additivity="false">-->
        <!--<AppenderRef ref="RollingRandomAccessFileInfo"/>-->
        <!--<AppenderRef ref="RollingRandomAccessFileError"/>-->
        <!--</Root>-->


        <!-- 第三方日誌系統 -->
        <logger name="org.springframework.core" level="info" />
        <logger name="org.springframework.beans" level="info" />
        <logger name="org.springframework.context" level="info" />
        <logger name="org.springframework.web" level="info" />
        <logger name="org.jboss.netty" level="warn" />
        <logger name="org.apache.http" level="warn" />
        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
        <Logger name="org.crsh.plugin" level="warn" />
        <logger name="org.crsh.ssh" level="warn"/>
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <logger name="org.thymeleaf" level="warn"/>

    </Loggers>

</Configuration>

配置log4j2.component.properties

# 設置異步日誌系統屬性
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
AsyncLoggerConfig.WaitStrategy=Sleep
#AsyncLoggerConfig.RingBufferSize=10240

開關異步日誌

通過修改log4j2.component.properties屬性
當需要開啓異步日誌時:

# 設置異步日誌系統屬性
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
AsyncLoggerConfig.WaitStrategy=Sleep

當需要關閉異步日誌,開啓同步日誌時:(直接註釋配置即可)

# 設置異步日誌系統屬性
#log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
#AsyncLoggerConfig.WaitStrategy=Sleep

如何使用

@Slf4j 或 @Log4j2註解 和 手動創建Logger

  • 通過引入lombok包, 直接在類上引用@Slf4j 或 @Log4j2註解
  • 通過手動創建Logger類(slf4j或者log4j2)
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>${lombok.version}</version>
		</dependency>

測試示例:

package com.ddky;

import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.async.AsyncLoggerContextSelector;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CountDownLatch;

/**
 * @program: 20160219
 * @description:
 * @author: zhouzhixiang
 * @date: 2020-01-06
 * @company: 叮噹快藥科技集團有限公司
 **/
//@Slf4j
@Log4j2
public class Log4j2Test {

    // 使用slf4j
    private static final Logger log = LoggerFactory.getLogger(Log4j2Test.class);
    private int totalThread = 50;
    // 使用log4j2
//    private static final Logger log = LogManager.getLogger(Log4j2Test.class);

    @Test
    public void testLog() {
        log.info("Test*******************************************");
        log.error("Test*******************************************");
        log.warn("Test*******************************************");
        log.debug("Test*******************************************");
    }

//    @Test
    public void fixedPringting() throws InterruptedException {
        log.info("log4j2 100萬 start printing");
        final CountDownLatch cdl = new CountDownLatch(totalThread);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < totalThread; i++) {
            new Thread(() -> {
                for (int j = 0; j < 200000; j++) {
                    log.info("log4j2 performance test " +j);
                }
            }).start();
                    cdl.countDown();
        }
        cdl.await();
        long endTime = System.currentTimeMillis();
        log.info("log4j2 100萬 end cost time "+ (endTime - startTime));
    }

    public static void main(String[] args) throws InterruptedException {
        log.info("log4j2 1000萬 start printing");
        Integer totalThread = 50;
        final CountDownLatch cdl = new CountDownLatch(totalThread);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < totalThread; i++) {
            new Thread(() -> {
                for (int j = 0; j < 2000; j++) {
                    log.info("log4j2 performance test "+ j);
                }
                cdl.countDown();
            }).start();
        }
        cdl.await();
        long endTime = System.currentTimeMillis();
        log.error("log4j2 1000萬 end cost time = "+ (endTime - startTime));
    }

    @Test
    public void isAsyncLog() {
        log.info("是否爲異步日誌1:"+ AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌2:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌3:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌4:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌5:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌6:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌7:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌8:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌9:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌10:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌11:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌11:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌11:"+AsyncLoggerContextSelector.isSelected());
        log.info("是否爲異步日誌11:"+AsyncLoggerContextSelector.isSelected());
    }

    @Test
    public void testFori() {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                isAsyncLog();
            }).start();
            log.info(String.valueOf(i));
//            log.error(String.valueOf(i));
//            log.debug(String.valueOf(i));
//            log.warn(String.valueOf(i));
        }
    }
}

注意事項

  • 對於需要審計操作的日誌,請開啓同步日誌,不建議開啓異步日誌。
  • 引入jar依賴注意版本統一管理(以上引入未作版本管理,僅作參考)
想提升編碼能力嗎,掃碼購買提升逼格!

在這裏插入圖片描述

歡迎加入Java猿社區!
免費領取我歷年收集的所有學習資料哦!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章