日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SiftingAppender:将不同的线程记录到不同的日志文件中

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SiftingAppender:将不同的线程记录到不同的日志文件中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Logback的一項新穎功能是SiftingAppender ( JavaDoc )。 簡而言之,它是一個代理附加器,它為給定運行時屬性的每個唯一值創建一個子附加器。 通常,此屬性來自MDC 。 這是基于上面鏈接的官方文檔的示例:

<?xml version="1.0" encoding="UTF-8"?> <configuration><appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"><discriminator><key>userid</key><defaultValue>unknown</defaultValue></discriminator><sift><appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender"><file>user-${userid}.log</file><layout class="ch.qos.logback.classic.PatternLayout"><pattern>%d{HH:mm:ss:SSS} | %-5level | %thread | %logger{20} | %msg%n%rEx</pattern></layout></appender></sift></appender><root level="ALL"><appender-ref ref="SIFT" /></root> </configuration>

注意, <file>屬性是使用${userid}屬性進行參數化的。 這個財產來自哪里? 它必須放在MDC中。 例如,在使用Spring Security的Web應用程序中,我傾向于在SecurityContextHolder的幫助下使用servlet過濾器:

import javax.servlet._ import org.slf4j.MDC import org.springframework.security.core.context.SecurityContextHolder import org.springframework.security.core.userdetails.UserDetailsclass UserIdFilter extends Filter {def init(filterConfig: FilterConfig) {}def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {val userid = Option(SecurityContextHolder.getContext.getAuthentication).collect{case u: UserDetails => u.getUsername}MDC.put("userid", userid.orNull)try {chain.doFilter(request, response)} finally {MDC.remove("userid")}}def destroy() {} }

只要確保在Spring Security過濾器之后應用此過濾器即可。 但這不是重點。 文件名中${userid}占位符的存在會導致篩選追加程序為該屬性的每個不同值(因此:不同的用戶名)創建一個子追加程序。 如果未設置MDC屬性,以這種配置運行Web應用程序將快速創建多個日志文件,例如user-alice.log , user-bob.log和user-unknown.log user-bob.log 。 另一個用例是使用線程名稱而不是MDC屬性。 不幸的是,它不是內置的,但是可以使用自定義Discriminator而不是默認的MDCBasedDiscriminator輕松插入:

public class ThreadNameBasedDiscriminator implements Discriminator<ILoggingEvent> {private static final String KEY = "threadName";private boolean started;@Overridepublic String getDiscriminatingValue(ILoggingEvent iLoggingEvent) {return Thread.currentThread().getName();}@Overridepublic String getKey() {return KEY;}public void start() {started = true;}public void stop() {started = false;}public boolean isStarted() {return started;} }

現在,我們必須指示logback.xml使用我們的自定義標識符:

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"><discriminator class="com.blogspot.nurkiewicz.ThreadNameBasedDiscriminator"/><sift><appender class="ch.qos.logback.core.FileAppender"><file>app-${threadName}.log</file><layout class="ch.qos.logback.classic.PatternLayout"><pattern>%d{HH:mm:ss:SSS} | %-5level | %logger{20} | %msg%n%rEx</pattern></layout></appender></sift> </appender>

請注意,我們不再將%thread放入PatternLayout –不必要,因為線程名是日志文件名的一部分:

  • app-main.log
  • app-http-nio-8080-exec-1.log
  • app-taskScheduler-1
  • app-ForkJoinPool-1-worker-1.log
  • ……依此類推

對于服務器應用程序,這可能不是最方便的設置,但是在臺式機上,如EDT ,IO線程等專注線程數量有限,這可能是一個重要的選擇。

參考: SiftingAppender:在Java和社區博客中,我們的JCG合作伙伴 Tomasz Nurkiewicz將不同的線程記錄到不同的日志文件中 。

翻譯自: https://www.javacodegeeks.com/2013/04/siftingappender-logging-different-threads-to-different-log-files.html

總結

以上是生活随笔為你收集整理的SiftingAppender:将不同的线程记录到不同的日志文件中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。