旅游网站内容规划,网站开发按几年摊销,在网站上卖东西怎么做,wordpress 获取tagLogback的一项新颖功能是SiftingAppender #xff08; JavaDoc #xff09;。 简而言之#xff0c;它是一个代理附加器#xff0c;它为给定运行时属性的每个唯一值创建一个子附加器。 通常#xff0c;此属性来自MDC 。 这是基于上面链接的官方文档的示例#xff1a; JavaDoc 。 简而言之它是一个代理附加器它为给定运行时属性的每个唯一值创建一个子附加器。 通常此属性来自MDC 。 这是基于上面链接的官方文档的示例 ?xml version1.0 encodingUTF-8?
configurationappender nameSIFT classch.qos.logback.classic.sift.SiftingAppenderdiscriminatorkeyuserid/keydefaultValueunknown/defaultValue/discriminatorsiftappender nameFILE-${userid} classch.qos.logback.core.FileAppenderfileuser-${userid}.log/filelayout classch.qos.logback.classic.PatternLayoutpattern%d{HH:mm:ss:SSS} | %-5level | %thread | %logger{20} | %msg%n%rEx/pattern/layout/appender/sift/appenderroot levelALLappender-ref refSIFT //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 DiscriminatorILoggingEvent {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 nameSIFT classch.qos.logback.classic.sift.SiftingAppenderdiscriminator classcom.blogspot.nurkiewicz.ThreadNameBasedDiscriminator/siftappender classch.qos.logback.core.FileAppenderfileapp-${threadName}.log/filelayout classch.qos.logback.classic.PatternLayoutpattern%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