❶ Log4j2自動清理歷史日誌
在 log4j2 中,可以通過配置 RollingFileAppender 的清理策略來實現自動清理日誌孫察,具則塵茄體可以參照官網中對RollingFileAppender配置文件的介紹: https://logging.apache.org/log4j/2.x/manual/appenders.html#FileAppender 。
另外, log4j1 中的RollingFileAppender雖然無法實現自動清理日誌兄褲的功能,但可以通過自己定義Appender來實現,可參照: log4j自動日誌刪除(轉)
可以通過一個簡單的樣例來查看log4j2的自動清理日誌功能,操作步驟如下:
❷ 【日誌】Log4j2配置
在同步日誌模式下, Logback的性能是最糟糕的,log4j2的性能無論在同步日誌模式還是非同步日誌模式下都是最佳的。本章主要介紹Spring Boot如何集成並配置使用Log4j2
引入Log4j2依賴包,其它依賴和Logback一樣,使用SLF4J統一輸出
然後需要在resource下面添加log4j2.xml配置文件,當然了如果你不添加,springboo會提數銷示你沒有對應文件,並使用默認的配置文件,這個時候級別可以在application.properties中配置
和logback配置類似,主要是含有loggers、appenders,其中loggers由logger,root組成。appenders由console(控制台),File、RollingFile(輸出文件)組成,作用和配置和logback差不多
(1)Console
用來定義輸出到控制台的Appender,主要設置輸出格式和level級別
ThresholdFilter: 定義列印級別,onMismatch值設置是否拒絕其它
(2)File
用來定義輸出到指定位置的文件的Appender
(3)RollingFile
用來定義超過指定條件自動刪除舊的,創建新的Appender
參數說明:
Root節點用來指定項目的根日誌薯沖游,如果沒有單獨指定Logger,那麼就會默認使用該Root日誌輸出
參數說明:
變數配置,類似常量定義
默認判指情況下springboot是不將日誌輸出到日誌文件中,這里對日誌框架的支持有兩種配置方式(和logback一樣):
(1)application.properties 或 application.yml (系統層面)
(2)logback-spring.xml (自定義文件方式)
默認名log4j2-spring.xml,可以省下在application.yml中配置,如果自定義了文件名,需要在application.yml中配置
此種方式可以處理比較復雜的情況,比如區分 info 和 error 日誌、每天產生一個日誌文件。
通過在DefaultRolloverStrategy 標簽下添加Delete標簽實現,保留7天的日誌
IfLastModified .age要和filePattern精確的時間一致, 否則貌似無效.
❸ SpringBoot2.0 基礎案例(02):配置Log4j2,實現不同環境日誌列印
日誌列印是了解Web項目運行的最直接方式,所以在項目開發中是需要首先搭建好的環境。
1、Log4j2特點
1)核心特點
相比與其他的日誌系統,log4j2丟數據這種情況少;disruptor技術,在多線程環境下,性能高;並發的特性,減少了死鎖的發生。
2)性能測試
2、日誌列印之外觀模式
每一種日誌框架都有自己單獨的API,要使用對應的框架就要使用其對應的API,增加應用程序代碼和日誌框架的耦合性。
《阿里巴巴Java開發手冊》,其中有一條規范做了『強制』要求:
SLF4J日誌API
Java簡易日誌門面(Simple Logging Facade for Java,縮寫SLF4J),是一套包裝Logging 框架的界面程式,使用外觀模式實現。
1、項目結構
2、不同環境的日誌配置
使用最直接的方式,不同環境載入不同的日誌配置。
1)開發環境配置
2)生產環境配置
3、Log4j2的配置文件
1、簡單的測試程序
2、測試效果圖
四、源代碼地址
❹ log4j2怎樣配置才能在控制台列印mybatis的sql日誌
您好:我的log4j.properties在src目正帶正錄下如下: ### logger 的配置 ### #配置行鄭根 logger 定義根 logger 配置項。其語法為:級別,輸入終端1,輸出終端舉悔2 log4j.rootLogger=INFO,stdout ### direct log messages to stdout
❺ Log4j2簡介和非同步日誌梳理
log4j2是log4j 1.x 的升級版,參考了logback的一些優秀的設計,並且修復了一些問題,因此帶來了一些重大的提升,主要有:
之前看官方文檔摘抄了一些概念,這里懶得翻譯了,使用log4j的都應該清楚,這里只是mark下。
log4j2最大的特點就是非同步日誌,其性能的提升主要也是從非同步日誌中受益,我們來看看如何使用log4j2的非同步日誌。
Log4j2提供了兩種實現日誌的方式,一個是通過AsyncAppender,一個是通過AsyncLogger,分別對應前面我們說的Appender組件和Logger組件。注意這是兩種不同的實現方式,在設計和源碼上都是不同的體現。
AsyncAppender是通過引用別的Appender來實現的,當有日誌事件到達時,會開啟另外一個線程來處理它們。需要注意的是,如果在Appender的時候出現異常,對應用來說是無法感知的。 AsyncAppender應該在它引用的Appender之後配置,默認使用 java.util.concurrent.ArrayBlockingQueue實現而不需要其它外部的類庫。 當使用此Appender的時候,在多線程的環櫻慎境下需要注意,阻塞隊列容易受到鎖爭用的影響,這可能會對性能產生影響。這時候,我們應該答拆考慮使用無所的非同步記錄器(AsyncLogger)。
AsyncAppender有一些配置項,如下:
除此之外還有一些其他的細節,如果感興趣可以參考官網文檔,這里就不一一列舉了。
AsyncLogger才是log4j2 的重頭戲,也是官方推薦的非同步方式。它可以使得調用Logger.log返回的更快。你可以有兩種選擇:全局非同步和混合非同步。
全局非同步
配置文件不用動:
在系統初始化的時候,增加全局參數配置:
你可以在你第一次獲取Logger之前設置,也可以載入JVM啟動參數里,類似
混合非同步
混合非同步只需要修改配置文件即可:
在上面示例的配置中,root logger就是同步的,但是com.foo.Bar的logger就是異清頌棗步的。
在使用非同步日誌的時候需要注意一些事項,如下:
4、如果不是確實需要,不要列印location信息,比如HTML的location,或者pattern模式里的%C or $class, %F or %file, %l or %location, %L or %line, %M or %method, 等,因為Log4j需要在列印日誌的時候做一次棧的快照才能獲取這些信息,這對於性能來說是個極大的損耗。
關於性能測試,大家可以直奔官網,哪裡有很詳細的數據,這里給個圖:
雖然我測下來,在immediateFlush設置為false的情況下,同步非同步差不了多少,但可能是我的測試條件不符合官方的,從設計和原理上來說,非同步日誌,無疑是個最優的選擇。
總的來說,看了一遍log4j的官網文檔,對日誌系統有了個比較全面的了解,以前只是配置來改改,沒關注過很多細節,這次算是掃盲了一次。文章也只是做了個介紹,在實際使用中,還是要細細研究下配置。
另外,個人覺得非同步模式無非就是在原來同步寫盤的前提下,增加消息隊列作為緩存,或者交個另一個線程去做,這理論上除了帶來一些額外的,較小的cpu和內存的開銷,應該會在高流量的時候帶來不小的性能提升,對比下來,log4j2無疑是當下最值得使用的日誌組件來,且可以使用其非同步模式。
當然了,也不能說非同步就一定好,如果日誌的流量不是特別大,磁碟性能又跟得上,沒有必要一定使用非同步日誌。
配置跡橋畝log4j2日誌記錄至資料庫
1、建立用於保存日誌的數姿森據庫表:
CREATETABLE`sys_log`(
消沒`id`int(11)NOTNULLAUTO_INCREMENT,
`level`varchar(32)NOTNULL,
`logger`varchar(100)NOTNULL,
`message`varchar(1000)DEFAULTNULL,
`exception`varchar(10000)DEFAULTNULL,
`date_add`datetimeNOTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=19DEFAULTCHARSET=utf8mb4;
2、配置 databaseAppender :
<JDBCname="databaseAppender"tableName="sys_log">
<ConnectionFactoryclass="cc.s2m.web.s2mBlog.util.StaticProp"method="getDatabaseConnection"/>
<Columnname="date_add"isEventTimestamp="true"/>
<Columnname="level"pattern="%level"/>
<Columnname="logger"pattern="%logger"/>
<Columnname="message"pattern="%message"/>
<Columnname="exception"pattern="%ex{full}"/>
</JDBC>
3、其中 cc.s2m.web.s2mBlog.util.StaticProp類的getDatabaseConnection方法為獲取可用的datasource:
DriverManagerDataSourceds=newDriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8");
ds.setUsername("root");
ds.setPassword("123456");
returnds.getConnection();
4、指派需要記錄的日誌,使用 databaseAppender即可:
<loggername="SYSLOG"level="INFO"additivity="false">
<appender-refref="databaseAppender"/>
</logger>
❼ log4j2 非同步日誌原理及配置
log4j2通過講打日誌流程中的部分階段進行非同步化,使得日好簡志列印性能得到了很大的提升。
要想了解log4j如果實現非同步日誌,進而提升性能,就需要先了解日誌列印的基本過程。
在log4j中,有兩個重要的概念,分別是 Logger 、 Appender 。Logger是負責具體的生產日誌數據,我們平時的Logger.info(...)就是生產日誌數據的過程。Appender則是負責講數據搬運到目的地,如console、文件、hive、網路設備等等。
而log42實現非同步日誌,主要包括以下兩種方式:
非同步Logger通過使用LMAX Disruptor環形隊列和單獨的處理線程,避免了鎖的競爭,從而實現更高的吞吐量。隊列大小默認4096,通過以下參數,可以開啟非同步日誌。
非同步Appender則是使用了java中的ArrayBlockingQueue,默認隊列大小1024。log4j2官方測試,asyncLogger相比asyncAppender有更好的友旦褲表現。
是否可以同時使用AsyncLogger + AsyncAppender?同時使用是否有更好表現?
據stackoverflow上回答,AsyncLogger是更新的非同步機制,有更好的表現。AsyncAppender是之前的非同步機制。同時使用也不會遲扒增加性能表現。見
https://stackoverflow.com/questions/24177601/difference-between-asynclogger-and-asyncappender-in-log4j2
https://logging.apache.org/log4j/2.x/manual/async.html
https://www.cnblogs.com/yeyang/p/7944906.html
https://bryantchang.github.io/2019/01/15/log4j2-asyncLogger/
❽ 如何配置log4j2日誌記錄至資料庫
配置log4j2日誌記錄至資料庫
1、建立用於保存日誌的資料庫表:
CREATETABLE`sys_log`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`level`varchar(32)NOTNULL,
`logger`varchar(100)NOTNULL,
`message`varchar(1000)DEFAULTNULL,
`exception`varchar(10000)DEFAULTNULL,
`date_add`datetimeNOTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=19DEFAULTCHARSET=utf8mb4;
2、配置 databaseAppender :
<JDBCname="databaseAppender"tableName="sys_log">
<ConnectionFactoryclass="cc.s2m.web.s2mBlog.util.StaticProp"method="getDatabaseConnection"/>
<Columnname="date_add"isEventTimestamp="true"/>
<Columnname="level"pattern="%level"/>
<Columnname="logger"pattern="%logger"/>
<Columnname="message"pattern="%message"/>
<Columnname="exception"pattern="%ex{full}"/>
</JDBC>
3、其中 cc.s2m.web.s2mBlog.util.StaticProp類的getDatabaseConnection方法為獲取可用的datasource:
DriverManagerDataSourceds=newDriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8");
ds.setUsername("root");
ds.setPassword("123456");
returnds.getConnection();
4、指派需要記錄的日誌,使用 databaseAppender即可:
<loggername="SYSLOG"level="INFO"additivity="false">
<appender-refref="databaseAppender"/>
</logger>