Log4j 2 包含了基於LMAX 分離庫的下一代的非同步日誌系統,在多線程環境下,非同步日誌系統比 Log4j 1.x 和Logback 提高了10倍效能提升(輸送量和延遲率 )。
日誌的層級
log4j規定了預設的幾個層級:trace < debug < info < warn < error < fatal。這裡要說明一下:
1、層級之間是包含的關係,如果設定記錄層級是trace,則大於等於這個層級的日誌都會輸出。
2、 trace:是追蹤,就是程式推進一下,就可以寫個trace輸出。
debug: 調試,一般就只用這個作為最低層級。
info: 輸出一下重要的資訊。
warn: 有些資訊不是錯誤資訊,但是也要給一些提示。
error: 錯誤資訊。
fatal: 層級比較高了,重大錯誤。
具體參考官網:http://logging.apache.org/log4j/2.x/
簡單樣本(需要額外引入disruptor-3.3.2.jar包): 目錄結構:
代碼:
package com.zero.log4j2;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;public class Log1 {private static Logger logger = LogManager.getLogger(Log1.class);public Log1() {logger.debug("Log1,我預設記錄在log1.log");logger.info("Log1,我預設記錄在log1.log");logger.warn("Log1,我預設記錄在log1.log");logger.error("Log1,我預設記錄在log1.log");}}
package com.zero.log4j2.log2;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;public class Log2 {private static Logger logger = LogManager.getLogger();public Log2() {logger.debug("Log2, 我預設記錄到log2.log");logger.info("Log2, 我預設記錄到log2.log");logger.warn("Log2, 我預設記錄到log2.log");logger.error("Log2, 我預設記錄到log2.log");}}
package com.zero.log4j2;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;public class Log3 {private static Logger logger = LogManager.getLogger();public Log3() {logger.debug("Log3, 我預設記錄到log1.log");logger.info("Log3, 我預設記錄到log1.log");logger.warn("Log3, 我預設記錄到log1.log");logger.error("Log3, 我預設記錄到log1.log");Log4j2Util.log("Log3," + " 我要記錄到log3.log", "zero");}}
package com.zero.log4j2;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;public class Log4j2Util {private static Logger logger = LogManager.getLogger("zero");public static void log(String logStr, String logType) {Logger myLogger = LogManager.getLogger(logType);myLogger.info(logStr);myLogger.warn(logStr);logger.info("Log4j2Util, 我想記錄在log3.log");}}
package com.zero.log4j2;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import com.zero.log4j2.log2.Log2;public class Test {static Logger logger = LogManager.getLogger();public static void main(String[] args) {logger.info("log {}", 123456789);new Log1();new Log3();new Log2();}}log4j2.xml
<?xml version="1.0" encoding="UTF-8"?><!-- No need to set system property "Log4jContextSelector" to any value when using <asyncLogger> or <asyncRoot>. --><Configuration status="WARN"><Properties><Property name="filedir">logs</Property></Properties><Appenders><!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. --><RollingRandomAccessFile name="log1"fileName="${filedir}/log1.log" append="true" immediateFlush="false"filePattern="logs/app-%d{MM-dd-yyyy}.log"><PatternLayout><Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%c{36}] %msg%xEx%n</Pattern></PatternLayout><bufferSize>262144</bufferSize><!--預設:256 * 1024 bytes --><Policies><!-- 基於時間的觸發策略。該策略主要是完成周期性的log檔案封存工作。 --><!-- interval,integer型,指定兩次封存動作之間的時間間隔。 --><!-- ====單位:以日誌的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時,yyyy-MM-dd-HH-mm 單位為分鐘。 --><!-- modulate,boolean型,說明是否對封存時間進行調製。 --><!-- ====若modulate=true,則封存時間將以0點為邊界進行位移計算。 --><!-- ====比 如,modulate=true,interval=4hours,那麼假設上次封存日誌的時間為01:00,則下次封存日誌的時間為04:00,之後的封存時間依次為08:00,12:00。。。 --><TimeBasedTriggeringPolicy interval="24"modulate="true" /></Policies></RollingRandomAccessFile><RollingRandomAccessFile name="log2" fileName="logs/log2.log"append="true" immediateFlush="false" filePattern="logs/log2-%d{MM-dd-yyyy}.log"><PatternLayout><Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%c{36}] %msg%xEx%n</Pattern></PatternLayout><bufferSize>262144</bufferSize><!--預設:256 * 1024 bytes --><Policies><TimeBasedTriggeringPolicy interval="24"modulate="true" /></Policies></RollingRandomAccessFile><RollingRandomAccessFile name="log3"fileName="${filedir}/log3.log" append="true" immediateFlush="false"filePattern="logs/log3-%d{MM-dd-yyyy}.log"><PatternLayout><Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%c] %msg%xEx%n</Pattern></PatternLayout><bufferSize>262144</bufferSize><!--預設:256 * 1024 bytes --><Policies><TimeBasedTriggeringPolicy interval="24"modulate="true" /></Policies></RollingRandomAccessFile></Appenders><Loggers><AsyncRoot level="debug"><AppenderRef ref="log1" /></AsyncRoot><AsyncLogger name="com.zero.log4j2.log2" level="trace"includeLocation="false" additivity="false"><AppenderRef ref="log2" /></AsyncLogger><AsyncLogger name="zero" level="debug" includeLocation="false"additivity="false"><AppenderRef ref="log3" /></AsyncLogger></Loggers></Configuration>