国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - log4j2動態修改日志級別及拓展性使用詳解

log4j2動態修改日志級別及拓展性使用詳解

2021-06-15 11:05紀煜楷 Java教程

這篇文章主要介紹了log4j2動態修改日志級別及拓展性使用詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、供參考的完整日志配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version="1.0" encoding="utf-8"?>
 
<!-- 配置loggerconfig,即appenders的日志級別為warn -->
<configuration status="warn">
 
  <!-- 定義下面的引用名 -->
  <properties>
    <property name="basepath">${sys:vmparam}</property>
    <property name="filepath">${basepath}/app.log</property>
  </properties>
 
  <!-- appenders支持配置多個appender,支持向不同的目標輸送日志,本例為配置向控制臺輸出 -->
  <appenders>
    <console name="console" target="system_out">
      <patternlayout pattern="%d{hh:mm:ss.sss} [%t] %-5level %logger{36} - %msg%n" />
    </console>
 
    <!-- 將日志輸出到指定位置的文件中 -->
    <rollingfile name="rollingfile" filename="${filepath}"
      filepattern="logs/$${date:yyyy-mm}/app-%d{yyyy-mm-dd-hh}-%i.log.gz">
      <policies>
        <!-- interval單位為filepattern最后一個單位,此處為6小時,modulate若為true
        則日志時間將以0點為邊界進行偏移計算,由于加了.gz策略,所以此處意思為每隔6小時,便會新生成一個
        log4j2的壓縮文件,當每個文件超過250m時,也會新生成一個log4j2的壓縮文件 -->
        <timebasedtriggeringpolicy interval="6" modulate="true"/>
        <sizebasedtriggeringpolicy size="250 mb"/>
      </policies>
      <!-- 滾動策略,日志文件最多保留20個 -->
      <defaultrolloverstrategy max="20"/>
 
      <!-- 最多備份30天以內||日志文件大小達到100gb的日志||文件數量超過十個
      此處為策略限制,delete中可以按自己需要用正則表達式編寫 -->
      <defaultrolloverstrategy>
        <delete basepath="${filepath}" maxdepth="1">
          <iffilename glob="logs_*.log" />
          <iflastmodified age="30d" />
          <ifaccumulatedfilesize exceeds="100 gb" />
          <ifaccumulatedfilecount exceeds="10" />
        </delete>
      </defaultrolloverstrategy>
    </rollingfile>
  </appenders>
 
  <!-- loggers支持配置多個logger,可引用不同的目標appender,也可根據業務需求定制特定要求的appender -->
  <loggers>
    
    <asynclogger name="asynclogger" level="trace">
      <appender-ref ref="console" />
      <appender-ref ref="rollingfile" />
    </asynclogger>
 
    <asyncroot level="trace">
      <appender-ref ref="console" />
    </asyncroot>
    
    <root level="info">
      <!-- <appenderref ref="console" /> -->
      <appenderref ref="rollingfile" />
    </root>
    
    <!-- 第三方日志系統 -->
    <logger name="org.springframework" level="info" additivity="false">
      <appender-ref ref="console" />
    </logger>
    <logger name="io.netty" level="warn"/>
    <logger name="org.apache.http" level="warn"/>
    <logger name="org.mongodb.driver" level="info"/>
    <logger name="org.jboss.netty" level="warn"/>
    <logger name="org.springframework.data.redis" level="info"/>
  </loggers>
</configuration>

二、動態修改日志級別

?
1
2
3
4
5
6
7
collection<org.apache.logging.log4j.core.logger> current = loggercontext.getcontext(false).getloggers();
collection<org.apache.logging.log4j.core.logger> notcurrent = loggercontext.getcontext().getloggers();
collection<org.apache.logging.log4j.core.logger> allconfig = current;
allconfig.addall(notcurrent);
for (org.apache.logging.log4j.core.logger log:allconfig){
  log.setlevel(level.debug);
} 

三、自定義appender

以上介紹,均依賴于log4j2提供的官方配置,當對日志的業務邏輯復雜時,光靠配置也許滿足不了需要,此時我們會想自己能操控打印的日志,做日志的路由,或保存等操作,這個時候就需要有自定義的appender,可以配置的就靠配置完成,不能的就自己寫代碼干預,而log4j2剛好提供了這樣的拓展性。

如下代碼即是自定義的appender,通過實現abstractappender接口,配置@plugin注解對應的信息并在eppend方法中寫自己的業務邏輯,從而實現了對日志更大自由度的控制,如下展示的log4j配置文件中的配置節點名稱要和注解中配置的name屬性一致,并在configuration節點配置好自定義appender所在的包路徑即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.jyk.log4j2.log4j2_test;
 
import java.io.serializable;
import java.util.concurrent.locks.lock;
import java.util.concurrent.locks.readwritelock;
import java.util.concurrent.locks.reentrantreadwritelock;
import org.apache.logging.log4j.core.filter;
import org.apache.logging.log4j.core.layout;
import org.apache.logging.log4j.core.logevent;
import org.apache.logging.log4j.core.appender.abstractappender;
import org.apache.logging.log4j.core.appender.appenderloggingexception;
import org.apache.logging.log4j.core.config.plugins.plugin;
import org.apache.logging.log4j.core.config.plugins.pluginattribute;
import org.apache.logging.log4j.core.config.plugins.pluginelement;
import org.apache.logging.log4j.core.config.plugins.pluginfactory;
import org.apache.logging.log4j.core.layout.patternlayout;
 
@plugin(name = "myappender", category = "core", elementtype = "appender", printobject = true)
public class myappender extends abstractappender {
 
  /**
   * @fields serialversionuid
   */
  private static final long serialversionuid = -830237775522429777l;
  private final readwritelock rwlock = new reentrantreadwritelock();
  private final lock readlock = rwlock.readlock();
 
  //需要實現的構造方法,直接使用父類就行
  protected myappender(final string name, final filter filter, final layout<? extends serializable> layout,
      final boolean ignoreexceptions) {
    super(name, filter, layout, ignoreexceptions);
  }
 
  @override
  public void append(logevent event) {
    readlock.lock();
    try {
      final byte[] bytes = getlayout().tobytearray(event);//日志二進制文件,輸出到指定位置就行
      
      //拿到每次打印的日志,寫自己的業務邏輯
      system.out.println("enter my append...");
    } catch (exception ex) {
      if (!ignoreexceptions()) {
        throw new appenderloggingexception(ex);
      }
    } finally {
      readlock.unlock();
    }
  }
 
  // 下面這個方法可以接收配置文件中的參數信息
  @pluginfactory
  public static myappender createappender(@pluginattribute("name") string name,
      @pluginelement("filter") final filter filter,
      @pluginelement("layout") layout<? extends serializable> layout,
      @pluginattribute("ignoreexceptions") boolean ignoreexceptions) {
    if (name == null) {
      logger.error("no name provided for mycustomappenderimpl");
      return null;
    }
    if (layout == null) {
      layout = patternlayout.createdefaultlayout();
    }
    return new myappender(name, filter, layout, ignoreexceptions);
  }
}
?
1
2
3
4
5
<configuration status="warn" packages="com.jyk.log4j2.log4j2_test">
 
<myappender name="textarea">
      <patternlayout pattern="%d{hh:mm:ss.sss} [%t] %-5level %logger{36} - %msg%n" />
</myappender>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/jiyukai/p/9420833.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美久久久久久久 | 亚洲国产视频一区二区 | 国产亚洲人成网站在线观看 | 久久久久久久久久久久久av | 亚洲精品乱码久久久久久麻豆不卡 | 亚洲国产精品99久久久久久久久 | 日本做暖暖视频高清观看 | 天天操夜夜操av | 在线播放亚洲 | 亚洲精品永久免费 | 午夜视频在线网站 | 亚洲综合大片69999 | 香蕉久久一区二区不卡无毒影院 | 免费高清av | 在线观看国产视频 | av一区二区在线观看 | 亚洲激情久久 | 全部免费毛片在线播放 | 国产xnxx| 日日干夜夜干 | 中文字幕91| 美日韩成人 | 三级成人在线 | 国产精品二区一区二区aⅴ污介绍 | 日本欧美在线观看 | 午夜爽视频 | 日韩在线中文字幕 | 免费视频一区 | 一级毛片免费播放 | 成人午夜毛片 | 国内精品久久久久 | 无码一区二区三区视频 | 国产精品亚洲精品 | 亚洲精品二区三区 | 日韩一区二区精品 | 久草久草久 | 一区二区三区在线 | 国产欧美日韩在线观看 | 欧美日韩免费在线 | 欧美日韩视频在线 | 亚洲影视一区 |