log4j2到oracle,Log4j2进阶使用(更多高级特性)
# 1.高級(jí)進(jìn)階說明
本文介紹Log4j2高級(jí)進(jìn)階使用,
基于[Log4j2進(jìn)階使用(按大小時(shí)間備份日志)](https://www.jianshu.com/p/c7ae523f6e82),
介紹更多的高級(jí)特性,
本文基于上文給出的完整log4j2.xml,
修改對(duì)應(yīng)的配置項(xiàng),
演示高級(jí)特性的使用。
基本使用請(qǐng)參考[Log4j2基本使用入門](https://www.jianshu.com/p/a344409cf08a)。
# 2.調(diào)整日志備份時(shí)間
按時(shí)間備份日志文件的時(shí)候,
可以指定modulate為true:
```
```
表示對(duì)備份日志的生成時(shí)間糾偏,
糾偏以零點(diǎn)為基準(zhǔn)進(jìn)行,
即日志時(shí)間將以0點(diǎn)為邊界進(jìn)行偏移計(jì)算。
如果每4小時(shí)備份一次日志,
假設(shè)當(dāng)前時(shí)間是凌晨3點(diǎn),
那么下次生成日志時(shí)間是4點(diǎn),8點(diǎn),12點(diǎn)等等。
如果每10分鐘備份一次日志,
假設(shè)當(dāng)前時(shí)間是09:58,
那么下次生成日志時(shí)間是10:00, 10:10, 10:20等等。
具體效果就是不管當(dāng)前的運(yùn)行時(shí)間,
生成的備份日志時(shí)間是可以預(yù)期的,
有規(guī)律的,便于查看的。
運(yùn)行測(cè)試程序效果如下:
```
logs/:
10月 10 10:30 2019-10/
10月 10 10:36 test.log
logs/2019-10:
10月 10 09:59 test-2019-10-10-09-59-1.log
10月 10 10:09 test-2019-10-10-10-09-1.log
10月 10 10:19 test-2019-10-10-10-19-1.log
```
可以看到在09:59, 10:09, 10:19等時(shí)間生成了備份日志。
發(fā)現(xiàn)實(shí)際文件時(shí)間和預(yù)期的時(shí)間都差了1分鐘,
查看Log4j2源碼:
```java
org.apache.logging.log4j.core.appender.rolling.PatternProcessor.getNextTime(long,
int, boolean)
cal.set(Calendar.MINUTE,
currentCal.get(Calendar.MINUTE));
if (frequency == RolloverFrequency.EVERY_MINUTE) {
increment(cal,
Calendar.MINUTE, increment, modulus);
nextTime =
cal.getTimeInMillis();
cal.add(Calendar.MINUTE,
-1);
nextFileTime =
cal.getTimeInMillis();
return
debugGetNextTime(nextTime);
}
```
可以看到nextTime和nextFileTime確實(shí)差了1分鐘,
也就是備份日志文件的時(shí)間比預(yù)期時(shí)間差1個(gè)單位,
因此如果每4小時(shí)備份一次日志,
那么下次生成的日志文件時(shí)間是3點(diǎn),7點(diǎn),11點(diǎn)等等,
實(shí)際比預(yù)期都差了1個(gè)小時(shí)。
按照時(shí)間備份日志文件,
時(shí)間單位可以是年,月,日,小時(shí),分鐘,秒,毫秒,星期,
生成的備份文件就是上一個(gè)時(shí)間單位的時(shí)間,
比如備份的就是去年,上個(gè)月,昨天的日志等等,
因此實(shí)際減去1個(gè)時(shí)間單位是合理的。
# 3.壓縮日志
通過配置filePattern文件的后綴名,
可以實(shí)現(xiàn)在備份日志時(shí)對(duì)日志文件進(jìn)行壓縮。
支持的文件壓縮格式:.gz, .zip, .bz2, .deflate, .pack200,.xz。
生成的歸檔文件將使用匹配后綴的壓縮方案進(jìn)行壓縮。
```
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log.zip">
```
上面的配置中filePattern以.zip結(jié)尾,
表示備份文件壓縮為zip格式。
運(yùn)行測(cè)試程序效果如下:
```
logs/:
2019-10/
test.log
logs/2019-10:
test-2019-10-10-15-03-1.log.zip
test-2019-10-10-15-04-1.log.zip
test-2019-10-10-15-05-1.log.zip
```
可以看到備份的日志文件都?jí)嚎s為zip格式,
而且文件占用硬盤空間更少了。
同時(shí)DefaultRolloverStrategy支持配置日志壓縮級(jí)別,
設(shè)置compressionLevel屬性,范圍0-9,
壓縮效果依次增大,
0不壓縮,1壓縮速度最快,9壓縮率最好,
但是只對(duì)于壓縮文件類型有效,
目前Log4j2只實(shí)現(xiàn)了zip壓縮文件支持compressionLevel。
```
```
如果不填寫壓縮級(jí)別,默認(rèn)是DEFAULT_COMPRESSION(-1)。
查看Log4j2壓縮代碼實(shí)現(xiàn),
調(diào)用的是jdk提供的zip壓縮:
```
public void setLevel(int level) {
def.setLevel(level);
}
```
下面的配置表示備份文件壓縮為gz格式:
```
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log.gz"
```
# 4.敏感日志設(shè)置
Layout支持replace功能,
可以通過正則表達(dá)式查找%msg的內(nèi)容,
并且替換為想要輸出的內(nèi)容,
可以實(shí)現(xiàn)把敏感日志替換為其他字符。
下面replace把msg中的error全部替換為*****:
```
%replace{%msg}{error}{*****}
```
需要注意的這里replace只支持正常打印的內(nèi)容,
不支持exception(即catch捕獲的error會(huì)直接輸出)。
log4j2.xml配置參考:
```
```
修改前打印日志:
```
2019-10-23 16:20:23.085 [main] ERROR [18] - error level
log
2019-10-23 16:20:23.085 [main] FATAL [19] - fatal level
log
```
修改后打印日志:
```
2019-10-23 16:20:25.073 [main] ERROR [18] - ***** level
log
2019-10-23 16:20:25.083 [main] FATAL [19] - fatal level
log
```
# 5.參考文章
[Log4j2基本使用入門](https://www.jianshu.com/p/a344409cf08a)
[Log4j2進(jìn)階使用(按大小時(shí)間備份日志)](https://www.jianshu.com/p/c7ae523f6e82)
[Log4j2進(jìn)階使用(Pattern
Layout詳細(xì)設(shè)置)](https://www.jianshu.com/p/37ef7bc6d6eb)
[Log4j2完整XML參考(詳細(xì)注釋說明)](https://www.jianshu.com/p/3427a76134d6)
總結(jié)
以上是生活随笔為你收集整理的log4j2到oracle,Log4j2进阶使用(更多高级特性)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习之路 | PTA乙级—— 10
- 下一篇: 使用javafx百行代码搞定多边形面积计