为了能将log4j的ConversionPattern无缝应用到logback上来,需要对两个Conversion做适配,具体可以参考:Log4j 与 Logback的ConversionPattern对比

ch.qos.logback.classic.PatternLayout

static代码块新增:

// adapter for log4j
defaultConverterMap.put("l", LocationConverter.class.getName());
defaultConverterMap.put("x", NDCConverter.class.getName());

其中:

public class LocationConverter extends ClassicConverter {

    @Override
    public String convert(ILoggingEvent le) {
        StringBuilder buf = new StringBuilder();

        StackTraceElement[] cda = le.getCallerData();
        if (cda != null && cda.length > 0) {

            buf.append(cda[0]);
            return buf.toString();
        } else {
            return CallerData.CALLER_DATA_NA;
        }
    }

}
public class NDCConverter extends ClassicConverter {

    @Override
    public String convert(ILoggingEvent event) {
        Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
        return outputMDCForAllKeys(mdcPropertyMap);
    }

    private String outputMDCForAllKeys(Map<String, String> mdcPropertyMap) {
        StringBuilder buf = new StringBuilder();

        Map<Integer, String> ndcMap = new HashMap<Integer, String>();

        for (Map.Entry<String, String> entry : mdcPropertyMap.entrySet()) {
            if (entry.getKey().startsWith("NDC") && entry.getKey().length() > 3) {
                String index = entry.getKey().substring(3);
                try {
                    int idx = Integer.parseInt(index);
                    ndcMap.put(idx, entry.getValue());
                } catch (Exception e) {
                    // ignore
                }
            }
        }

        boolean first = true;
        for (int i = 0; i < ndcMap.size(); i++) {
            if (first) {
                first = false;
            } else {
                buf.append(" ");
            }
            buf.append(ndcMap.get(i));
        }
        return buf.toString();
    }
}

NDCConverter只是兼容了输出,因为在logback里,NDC是通过MDC来实现的,其key为NDC + index(from 0),因此可以通过key来实现顺序输出,但是这个是基于用户的 MDC 不能以 "NDC"开头,再加上数字来命令,否则NDC的输出会出现MDC的内容;

Log4j的ConversionPattern无缝适配到Logback的更多相关文章

  1. 从log4j日志无缝迁移至logback

    ogback对比log4j的有点在此就不赘述了. 由于在项目的原有代码中,大量的日志生成是通过log4j实现的,新的代码希望通过logback的方式生成日志,同时希望将老的代码在不修改的情况下直接将日 ...

  2. Log4j的ConversionPattern参数的格式含义

    Log4j建议只使用四个级别,优先级从高到低分别是ERROR.WARN.INFO.DEBUG#这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!log4j.rootL ...

  3. log4j的ConversionPattern参数的格式含义-转

    转自:http://www.blogjava.net/wilesun/archive/2007/10/30/156999.html Log4j建议只使用四个级别,优先级从高到低分别是ERROR.WAR ...

  4. Log4j中conversionPattern的含义

    %a -- 表示礼拜几,英文缩写形式,比如“Fri”%A -- 表示礼拜几,比如“Friday”%b -- 表示几月份,英文缩写形式,比如“Oct”%B -- 表示几月份,“October”%c -- ...

  5. Log4j 与 Logback的ConversionPattern对比

    为了能将log4j的配置无缝转到logback,需要了解其中ConversionPattern的差异,以下是对比表格,内容来自: log4j官网 logback官网 其中可能需要转换的地方主要有两块: ...

  6. log4j+logback+slf4j+commons-logging的关系与调试

    背景     由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同.存在着在一个项目中,不同的版本,不同的框架共存.导致日志输出异常混乱.虽然也不至于对系统造成致命伤害,但是明显可以看出,架构 ...

  7. Log4j,Log4j2,logback,slf4j日志学习

    日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条 ...

  8. Log4j,Log4j2,logback,slf4j日志学习(转)

    日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志 ...

  9. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

随机推荐

  1. Breakpoint is not hit

    新拿到一个Silverlight项目,能够正常运行,但是一旦运行起来,断点处由实心点变成了空心的,并警告:The breakpoint will not currently be hit. No sy ...

  2. form表单reset表格并执行搜索

    其中reset() 不需要定义 search():是你执行的搜索的函数 <html> <head> <title>sf</title></head ...

  3. Ubuntu如何更新源

    Ubuntu的源其实就是更新各种软件包需要用到镜像网站, 当大家在虚拟机上安装Linux镜像的时候肯定会遇到各种Linux软件没有安装,当你用apt-get安装的时候它会提示无效的网址,这个时候你就需 ...

  4. 解决:NoSuchAlgorithmException: Algorithm HmacSHA1 not available

    windows下运行macInstance = Mac.getInstance("HmacSHA1");完全正常,Linux下则出现异常: java.security.NoSuch ...

  5. SpringMVC接收页面表单参数

    一个普通的表单. 表单的代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  6. Chain Of Responsibility(职责连)-对象行为型模式

    1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2.动机 给多个对象处理一个请求的机会,从而 ...

  7. bootstrap 时间控件带(时分秒)选择器

    1.控件下载地址:http://www.bootcss.com/p/bootstrap-datetimepicker/index.htm,参数设置说明也在这个链接下面: 2.具体参数说明(复制原链接) ...

  8. Java swing项目-图书管理系统(swing+mysql+jdbc) 总结

    (一)java Swing的学习. (1)学习如何安装windowbuilder插件的安装. <1>在eclipse中点击help <2>在help的下拉选中选择install ...

  9. uva 11082

    题意:知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20 #include<cstdio> #include&l ...

  10. include,import,@class的区别

    1.#include与#import功能一样,都是导入头文件 2.区别是#include是单纯导入头文件,如果重复导入头文件,头文件就被导入多分 3.#import在导入头文件之前会检查之前是否导入过 ...