logback自定义格式转换器

创建自定义格式转换符有两步。
首先,必须继承ClassicConverter类。ClassicConverter对象负责从ILoggingEvent 提取
信息,并产生一个字符串。例如,LoggerConverter,它是处理“% logger”转换符的转换器,
它从ILoggingEvent提取logger 的名字并作为字符串返回。
假设我们的自定义ClassicConverter的功能是按照ANSI终端惯例为记录事件的级别进
行着色,下面是一种可能的实现:
示例:样本转换器例子
(src/main/java/chapters/layouts/MySampleConverter.java)

package chapters.layouts; 

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent; 

public class MySampleConverter extends ClassicConverter { 

  private static final String END_COLOR = "\u001b[m"; 

  private static final String ERROR_COLOR = "\u001b[0;31m";
  private static final String WARN_COLOR = "\u001b[0;33m"; 

  @Override
  public String convert(ILoggingEvent event) {
    StringBuffer sbuf = new StringBuffer();
    sbuf.append(getColor(event.getLevel()));
    sbuf.append(event.getLevel());
    sbuf.append(END_COLOR);
    return sbuf.toString();
  }

  /**
   * Returns the appropriate characters to change the color for the
specified
   * logging level.
   */
  private String getColor(Level level) {
    switch (level.toInt()) {
    case Level.ERROR_INT:
      return ERROR_COLOR;
    case Level.WARN_INT:
      return WARN_COLOR;
    default:
      return "";
    }
  }
} 

这里的实现很直观。MySampleConverter类继承ClassicConverter,实现convert方法,
convert方法返回按照ANSI着色编码装饰后的字符串。

第二步,我们必须让logback 知道这个新的Converter。方法是在配置里声明新的转换符。
示例:样本转换器例子
(src/main/java/chapters/layouts/mySampleConverterConfig.xml)

<configuration>
 <conversionRule conversionWord="sample"  converterClass="chapters.layouts.MySampleConverter" />
 <appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %sample - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root> 

</configuration> 

新的转换符号在配置文件里被声明后,我们可以在PatternLayout模式里像引用任何其
他转换符一样引用它。

由于Windows不支持ANSI终端编码,你可以在其他平台如Linux或Mac上执行看到

效果。
执行:

java  chapters.layouts.SampleLogging src/main/java/chapters/layouts/mySampleConverterConfig.xml 

输出:

0        [main] DEBUG - Everything‘s going  well
3        [main] ERROR - maybe not quite... 

请注意“ERROR”是红色的,也正是本例的目的。

这只是基本的,这个方法不好的地方就是要在配置文件里写

 <conversionRule conversionWord="sample" converterClass="chapters.layouts.MySampleConverter" /> 

实际只要模仿logback原生创建的方法把这个转换符加进去就可以了!

ch.qos.logback.classic.PatternLayout.java

package ch.qos.logback.classic;

import java.util.HashMap;
import ...........;
/**
 * <p>
 * A flexible layout configurable with pattern string. The goal of this class is
 * to {@link #format format} a {@link ILoggingEvent} and return the results in a
 * {#link String}. The format of the result depends on the
 * <em>conversion pattern</em>.
 * <p>
 * For more information about this layout, please refer to the online manual at
 * http://logback.qos.ch/manual/layouts.html#PatternLayout
 *
 */

public class PatternLayout extends PatternLayoutBase<ILoggingEvent> {

  public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
  public static final String HEADER_PREFIX = "#logback.classic pattern: ";

  static {
    defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);

    defaultConverterMap.put("d", DateConverter.class.getName());
    defaultConverterMap.put("date", DateConverter.class.getName());

    defaultConverterMap.put("r", RelativeTimeConverter.class.getName());
    defaultConverterMap.put("relative", RelativeTimeConverter.class.getName());

    defaultConverterMap.put("level", LevelConverter.class.getName());
    defaultConverterMap.put("le", LevelConverter.class.getName());
    defaultConverterMap.put("p", LevelConverter.class.getName());

   ....

  }...
}

看到没?只要在static块里加入

defaultConverterMap.put("highlight", HighlightingCompositeConverter.class.getName());

map的KEY是转换符,Value是对应的Converter。

这样就不用在配置文件里写RULE了。不过呢……要怎么把这一行加进去呢?嗯……这是个问题。当然我已经找到方法咯。

http://www.cnblogs.com/yhlx/archive/2012/09/25/2701989.html

当然我们也可以自定义过滤器。

实现过程很简单,我们只需要写一个类实现filter接口就OK,里面实现decide()方法。

代码如下:

[java] view plain copy

  1. package org.linkinpark.commons.logbackLogging;
  2. import ch.qos.logback.classic.spi.ILoggingEvent;
  3. import ch.qos.logback.core.filter.Filter;
  4. import ch.qos.logback.core.spi.FilterReply;
  5. public class LinkinFilter extends Filter<ILoggingEvent>
  6. {
  7. @Override
  8. public FilterReply decide(ILoggingEvent event)
  9. {
  10. if (event.getMessage().contains("LinkinPark"))
  11. {
  12. return FilterReply.ACCEPT;
  13. }
  14. else
  15. {
  16. return FilterReply.DENY;
  17. }
  18. }
  19. }

然后在配置文件中使用到该过滤器的地方配置<filter>就OK了。

[html] view plain copy

  1. <!-- 控制台输出,生产环境将请stdout去掉 -->
  2. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  3. <filter class="org.linkinpark.commons.logbackLogging.LinkinFilter" />
  4. <encoder>
  5. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->
  6. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
  7. </pattern>
  8. </encoder>
  9. </appender>

 

测试代码如下:

[java] view plain copy

  1. package org.linkinpark.commons.logbackLogging;
  2. import org.junit.Test;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. public class LoggingBack
  6. {
  7. private static Logger logger = LoggerFactory.getLogger(LoggingBack.class);
  8. @Test
  9. public void test()
  10. {
  11. logger.debug("LoggingBack.debug()。。。");
  12. logger.info("LoggingBack.info(LinkinPark)。。。");
  13. logger.error("LoggingBack.error()。。。");
  14. }
  15. }

运行上面的测试,我们来看下控制台输出:

[java] view plain copy

  1. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
  2. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
  3. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]
  4. 10:39:33,011 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds
  5. 10:39:33,012 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]] every 30 seconds.
  6. 10:39:33,012 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
  7. 10:39:33,014 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - Setting logger context name as [Application]
  8. 10:39:33,014 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Using context birth as time reference.
  9. 10:39:33,015 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Adding property to the context with key="byDay" and value="2016-03-01" to the LOCAL scope
  10. 10:39:33,016 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
  11. 10:39:33,018 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
  12. 10:39:33,038 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
  13. 10:39:33,064 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
  14. 10:39:33,066 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
  15. 10:39:33,085 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
  16. 10:39:33,086 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/log-%d{yyyy-MM-dd}.%i.log for the active file
  17. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - The date pattern is ‘yyyy-MM-dd‘ from file name pattern ‘log/log-%d{yyyy-MM-dd}.%i.log‘.
  18. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Roll-over at midnight.
  19. 10:39:33,091 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Setting initial period to Tue Mar 01 10:39:13 CST 2016
  20. 10:39:33,092 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
  21. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: log/LoggingBack-2016-03-01.log
  22. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [log/LoggingBack-2016-03-01.log]
  23. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
  24. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-INFO]
  25. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
  26. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-INFO-%d{yyyy-MM-dd}.%i.log for the active file
  27. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - The date pattern is ‘yyyy-MM-dd‘ from file name pattern ‘log/LOG-INFO-%d{yyyy-MM-dd}.%i.log‘.
  28. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Roll-over at midnight.
  29. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Setting initial period to Tue Mar 01 10:39:13 CST 2016
  30. 10:39:33,100 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
  31. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - Active log file name: log/LoggingBack-info.log
  32. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - File property is set to [log/LoggingBack-info.log]
  33. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
  34. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-ERROR]
  35. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
  36. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log for the active file
  37. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - The date pattern is ‘yyyy-MM-dd‘ from file name pattern ‘log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log‘.
  38. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Roll-over at midnight.
  39. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Setting initial period to Tue Mar 01 10:39:13 CST 2016
  40. 10:39:33,104 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
  41. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - Active log file name: log/LoggingBack-error.log
  42. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - File property is set to [log/LoggingBack-error.log]
  43. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
  44. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [LOGGINGBACK2]
  45. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
  46. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-%d{yyyy-MM-dd}.%i.log for the active file
  47. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - The date pattern is ‘yyyy-MM-dd‘ from file name pattern ‘log/LOG-%d{yyyy-MM-dd}.%i.log‘.
  48. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Roll-over at midnight.
  49. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Setting initial period to Tue Mar 01 10:18:58 CST 2016
  50. 10:39:33,107 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
  51. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - Active log file name: log/LoggingBack2.log
  52. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - File property is set to [log/LoggingBack2.log]
  53. 10:39:33,108 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [org.linkinpark.commons.logbackLogging] to true
  54. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[org.linkinpark.commons.logbackLogging]
  55. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-INFO] to Logger[org.linkinpark.commons.logbackLogging]
  56. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-ERROR] to Logger[org.linkinpark.commons.logbackLogging]
  57. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
  58. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
  59. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
  60. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@2344fc66 - Registering current configuration as safe fallback point
  61. 10:39:33.114 [main] INFO  o.l.c.logbackLogging.LoggingBack - LoggingBack.info(LinkinPark)。。。

OK,只输出了包含我们“LinkinPark”字符串的日志,没问题。

2,log4j.propertites文件转logback.xml文件。

打开logback官网,在左下角有一个在线转log4j的配置文件成logback配置文件的工具,挺好的,我自己尝试过,没问题。

所以以后如果我们原来的项目用的是log4j的日志系统的话想切成logback的话,直接这里转下配置文件,然后代码一行都不用动,挺好的。

在线转文件的地址如下:log4j.prorpertites转成logback.xml文件

 

http://blog.csdn.net/u011794238/article/details/50770557

时间: 2024-10-02 07:58:19

logback自定义格式转换器的相关文章

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题:

sruts2 自定义类型转换器

1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP数据回显:Date---String. 自定义类型转换器: * 1.实现TypeConverter * convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, j

自定义类型转换器converter

作用:目前将日期转换成string,将string转换成我想要的类型   0509课件里讲 一.数据类型转换在web应用程序中,数据存在两个方向上的转换:1.当提交表单时  表单数据以字符串的形式提交给服务器,在服务器端转换成不同的Java数据类型 2.当需要在页面显示数据时  将不同的Java数据类型转换为对应的字符串格式显示输出 二.Struts2内置的类型转换Struts2内置了常用类型的自动转换功能,支持常见数据类型与字符串之间的转换 三.自定义类型转换1.编写自定义类型转换器,继承St

logback自定义转换的问题

上个星期领导交给我一个任务,就是写logback自定义转换实现以下要求 [IP][文件名][行号][YYMMDD][HHMMSS.sss][线程名称][socket号][代码包和函数名.行号]-[卡号|单位|商户|终端|交易类型][message] eg: 输出结果[192.168.1.134][comm.20880.log][100][16-11-07][19:20:01.002][fixThread001][00000000000020002222222222222001][com.brid

strut2 自定义类型转换器

描述:假设用户请求地址:http://xxx.action?date=2015-01-01.  假设action中已经存在了date属性,且类型为Date.当用户请求的参数格式为xxxx-xx-xx或者xxxx-x-x的时候,action可以正常的接收到日期类型,即string字符串可以自动转换为Date类型.但是当用户的请求为xxxxxxxx(20150101)的时候,action不能够转换为日期类型,且报错.这时候就需要自定义类型转换器来实现日期的转换. 问题解决:自定义类型转换器 新建立一

[原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Struts2类型转换(二)-自定义类型转换器

一.自定义类型转换器 1). 为什么需要自定义的类型转换器 ? 因为Struts不能自动完成字符串到引用类型的转换. 2). 如何定义类型转换器? I. 开发类型转换器的类: 扩展 StrutsTypeConverter 类: II. 配置类型转换器. 有两种配置方式 ①. 基于字段的配置: > 在字段所在的 Model(可能是 Action,也可能是一个JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件 > 在该文件中输入键

ppt转pdf格式转换器破解版

ppt转pdf格式转换器破解版教学工作中,难免会发生因为电脑上位安装PowerPoint而无法播放ppt课件的情况,为了解决这个问题我们可以将ppt课件转换成pdf电子文档.这样一来,不但可以大大缩小课件的体积,而且能够让课件的播放变得更加流畅.自然. 第1分钟:安装迅捷ppt转换成pdf转换器免费试用版V4.1并运行,勾选“请选择要转换到的目标文件格式”的“Office转pdf",Office文档包括常用的Word.Excel.ppt. 第2分钟:单击”添加文件”,在桌面上选定要转换的幻灯片,

如何使用视频格式转换器将flv转换成MP4

视频泛指将一系列静态影像连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果.今天我们来谈论一下转换视频格式的方法,下面会用到视频转换器,小编推荐的是迅捷视频转换器,请看下文对操作方法的介绍.   视频转换器www.xunjieshipin.com/download-converter 方法步骤 FLV是被众多新一代视频分享网站所采用,是目前增长最快.最为广泛的视频传播格式.是在sorenson公司的压缩算法的基础上开发出