`

slf4j-logback-filter-MDC进阶

阅读更多
   Have lots of ideas and throw away the bad ones. You aren't going to have good ideas unless you have lots of ideas and some sort of principle of selection.  —LINUS PAULING

logback 其他系列请参考:
http://wangxinchun.iteye.com/blog/2101653
http://wangxinchun.iteye.com/blog/2094761
------------------------------------------filter----------------------------------------------------------------------

在logback 中为了对日志做更精细的控制,appender 标签可以配置多个filter标签。

说明:每个自定义的filter 都需要继承ch.qos.logback.core.filter.Filter类,并实现 decide(ILoggingEvent event)  方法。这方法会返回一个FilterReply枚举对象,有三个可选值:DENY, NEUTRAL or ACCEPT。如果返回DENY 那么event直接被抛弃,不被记录也无需参考下一个filter,如果是ACCEPT那么直接记录无需参考下一个filter,如果是NEUTRAL 那么由下一个filter判断,如果没有下一个filter,那么会直接记录。
最基本的一个自定义filter案例:
Filter code:
/**
 * 自定义filter 功能:如果日志的内容超过10个字符,抛弃掉
 * @author wangxinchun1988@163.com
 * @date 2014-8-13上午11:10:25
 */
public class LogFilter extends Filter<ILoggingEvent> {
	@Override
	public FilterReply decide(ILoggingEvent event) {
		if (event.getFormattedMessage().toString().length()< 10 ) {
			return FilterReply.ACCEPT;
		} else {
			return FilterReply.DENY;
		}
	}
}

logback.xml 配置
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>rooling.log</file>
	    <filter class="com.qunar.logback.LogFilter" />
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>rooling-log.%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>[%thread] %-5level %logger{35} - %msg%n </pattern>
		</encoder>
	</appender>


测试case:
@Test
	public void testLogback() throws InterruptedException {
		long l = System.currentTimeMillis();
		for(int i=0;i<30;i++){
			logger.info("hello {} ", wrapLog(i));
		}
		System.out.println(System.currentTimeMillis() - l);
		Thread.currentThread().sleep(1000);
	}
	
	private String wrapLog(int logLength){
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<logLength;i++){
			sb.append("a");
		}
		return sb.toString();
	}

输出:
[main] INFO  com.qunar.logback.LogbackTest - hello 
[main] INFO  com.qunar.logback.LogbackTest - hello a
[main] INFO  com.qunar.logback.LogbackTest - hello aa
[main] INFO  com.qunar.logback.LogbackTest - hello aaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaaaaaa
[main] INFO  com.qunar.logback.LogbackTest - hello aaaaaaaaaaaa

结论:日志超过10个字符的都被DENY 了。

同样 logback 默认提供了其他的filter
ch.qos.logback.classic.filter.LevelFilter:级别限制,可以指定某个日志文件只输出某一级别的日志。
ch.qos.logback.classic.filter.ThresholdFilter:级别限制,可以限制不输出低于某一级别的日志。

LevelFilter源代码如下:
public class LevelFilter extends AbstractMatcherFilter<ILoggingEvent> {

  Level level;

  @Override
  public FilterReply decide(ILoggingEvent event) {
    if (!isStarted()) {
      return FilterReply.NEUTRAL;
    }

    if (event.getLevel().equals(level)) {
      return onMatch;
    } else {
      return onMismatch;
    }
  }

  public void setLevel(Level level) {
    this.level = level;
  }

  public void start() {
    if (this.level != null) {
      super.start();
    }
  }
}


为了灵活支持简单的逻辑判断,以避免创建自定义的filter,logback 提供了EvaluatorFilter 允许逻辑判断代码。
配置的相关变量如下表:


xml 配置如下:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
      <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
        <expression>return message.contains("billing");</expression>
      </evaluator>
      <OnMismatch>NEUTRAL</OnMismatch>
      <OnMatch>DENY</OnMatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      </pattern>
    </encoder>
  </appender>


以上配置,如果log的内容中有billing 是不会输出的。和日志输出级别没有任何关系

------------------------------------------------MDC----------------------------------------------------------------------
mdc:Mapped Diagnostic Context
mdc 是用来application保存上下文信息的。可以通过mdc的put方法设置kev value信息,然后在日志里面输出value,比如ip或域名,在根据域名来区分业务线的情况来说,对业务的跟踪很有帮助。

case案例如下:
<encoder>
			<pattern>[%X{ip} %X{domain}][%thread] %-5level %logger{35} - %msg%n </pattern>
		</encoder>


注意通过:%X{key} 来取得MDC put的值。
java use case 如下:
@Test
	public void testLogback() throws InterruptedException {
		MDC.put("ip", "192.168.1.5");
		MDC.put("domain", "wxc.trade.qunar.com");
		for(int i=0;i<30;i++){
			logger.info("hello {} ", wrapLog(i));
		}
	}


输出:
[192.168.1.5 wxc.trade.qunar.com][main] INFO  com.qunar.logback.LogbackTest - hello 
[192.168.1.5 wxc.trade.qunar.com][main] INFO  com.qunar.logback.LogbackTest - hello a
[192.168.1.5 wxc.trade.qunar.com][main] INFO  com.qunar.logback.LogbackTest - hello aa
[192.168.1.5 wxc.trade.qunar.com][main] INFO  com.qunar.logback.LogbackTest - hello aaa
[192.168.1.5 wxc.trade.qunar.com][main] INFO  com.qunar.logback.LogbackTest - hello aaaa
。。。
注意:每条日志的前面有了ip 和 domain的信息。
  • 大小: 1.1 MB
1
0
分享到:
评论

相关推荐

    Slf4j日志相关jar包

    Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地切换不同的日志框架,如Log4j、Java Util Logging (JUL) 或者Logback。 **日志框架的核心概念** 1. **Logger**: 日志系统的核心组件...

    HAP框架-Logback入门手册 .zip

    - Logback管理工具:如SLF4J的Logback-Manager,可以实时查看和控制日志输出。 - JMX(Java Management Extensions)支持:通过JMX接口监控和调整Logback配置。 8. **安全与最佳实践** - 避免敏感信息泄露:在...

    tomcat8 slf4j+log4j2 写日志.zip

    1. **依赖冲突**:确保你的项目中没有引入了其他日志框架的jar包,如logback或log4j1.x,这可能导致SLF4J找不到正确的绑定实现。 2. **配置文件缺失或错误**:`log4j2.xml`是Log4j2的主要配置文件,定义了日志的...

    logback类库.rar

    2. **logback-classic**: 基于logback-core,logback-classic实现了SLF4J(Simple Logging Facade for Java)接口,使得logback可以与其他使用SLF4J的日志框架无缝集成。`logback-classic-1.2.3.jar`是logback-...

    logback.的jar包

    2. **logback-classic**: 基于 logback-core,logback-classic 实现了 Java 日志接口(Java Logging API,JUL),并且与 SLF4J(Simple Logging Facade for Java)兼容。SLF4J 是一个抽象层,允许开发者在不修改代码...

    logback-0.9.24

    4. **SLF4J API 支持**:logback-core 提供了对 Simple Logging Facade for Java (SLF4J) API 的底层实现,使得日志记录可以与具体日志实现解耦。 **logback-classic 模块** `logback-classic-0.9.24.jar` 是基于 ...

    apache-log4j

    - SLF4J(Simple Logging Facade for Java):一个日志抽象层,允许在运行时绑定不同的日志实现,包括Log4j。 7. **日志的最佳实践** - 不要在生产环境中使用DEBUG级别,以避免大量无用信息影响性能。 - 尽可能...

    logback相关支持包

    4. **SLF4J 绑定**:SLF4J(Simple Logging Facade for Java)是一个日志抽象层,logback-core 作为其实现之一,为 SLF4J 提供日志记录服务。 **logback-classic** 是 logback 的扩展,它实现了 SLF4J API,同时也...

    logback日志框架包

    Logback 主要分为三个组件:logback-core、logback-classic 和 logback-access,分别提供了核心功能、SLF4J(Simple Logging Facade for Java)实现以及与Servlet容器集成的日志访问接口。 1. **logback-core**:...

    logback中文手册

    - SLF4J接口:logback与Simple Logging Facade for Java(SLF4J)结合使用,提供一个统一的日志记录API,方便在不同日志框架间切换。 2. **配置机制** - logback.xml配置文件:手册会详细介绍如何编写和理解配置...

    LogBack.zip

    它包含了 SLF4J(Simple Logging Facade for Java)的实现,允许用户在运行时切换不同的日志框架,如 Logback 自身、Log4j 或 JDK 内置的日志。 **3. Logback-Access** Logback-Access 主要用于与Servlet容器集成,...

    logback做日志(代码演示和文档)

    其中,logback-classic 是对SLF4J(Simple Logging Facade for Java)的实现,而logback-core 提供了基本的架构支持。logback-access 则是为Servlet容器设计的,可以与HTTP服务器访问日志结合使用。 二、核心概念 ...

    log4j示例(附带对应jar包)

    尽管Log4j非常流行,但随着时间的推移,出现了其他日志框架,如Logback(由Log4j的创始人设计)和SLF4J(Simple Logging Facade for Java),它们在性能、灵活性和API设计上有所改进。 总的来说,Log4j作为一个成熟...

    log4j配置详解与使用方法说明

    SLF4J 提供了一个抽象层,允许在运行时绑定不同的日志实现,如Logback(SLF4J的推荐实现)和Log4j。Logback通常被认为比Log4j更快且更灵活。 总结,Log4j作为经典的日志框架,因其强大的功能和广泛的社区支持,在...

    logback高级使用例子

    logback-classic是log4j的继承者,实现了SLF4J(Simple Logging Facade for Java)接口;logback-access则与Servlet容器集成,用于处理HTTP访问日志。 **Logback配置** Logback的配置文件通常命名为`logback.xml`...

    logback例子

    1. **Logback基础**:Logback是基于SLF4J(Simple Logging Facade for Java)的日志框架,提供了一种灵活的方式来管理应用程序的日志输出。它包括三个主要组件:配置器(Configurator),如`ch.qos.logback.classic....

    logback.zip

    1. **logback-classic**:它是 Log4j 的直接替代品,实现了 SLF4J(Simple Logging Facade for Java)接口,允许用户通过更换绑定来切换不同的日志实现。 2. **logback-core**:提供基础架构,为 logback-classic ...

    java日志jar包

    Java日志库是Java开发中不可或缺的一部分,它们用于记录应用程序的运行时信息,帮助...然而,考虑到安全性和新特性,对于新项目,建议考虑升级到更现代的日志框架,如Log4j 2或其他的替代品,如SLF4J、Logback等。

    log4j.rar java写LOG日志的驱动

    虽然Log4j在日志处理方面表现出色,但随着技术的发展,其他框架如Logback、SLF4J(Simple Logging Facade for Java)也逐渐受到关注。SLF4J作为一个日志门面,提供了统一的API,允许用户在运行时绑定不同的日志实现...

    webx3框架指南PDF教程附学习Demo

    4. 为什么要用Webx而不是其它的开源框架? ............................................................. x 5. Webx的优势 ...................................................................................

Global site tag (gtag.js) - Google Analytics