原文链接:https://blog.csdn.net/chenjie2000/article/details/8892764

创建自定义格式转换符有两步:

1.写一个转换器类,继承ClassicConvert

示例代码:
package com.cj.log;

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

public class IpConvert extends ClassicConverter {

@Override
public String convert(ILoggingEvent event) {
return "10.10.10.10";
}
}

2.在logback.xml中注册该转换器,并自定义转换符

注册:
<conversionRule conversionWord="ip" converterClass="com.cj.log.IpConvert" />

自定义ip转换符:
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%ip [%thread] %-5level %logger{36} -% msg%n</Pattern>

经过这两步骤后,即可将自定义的ip转换符添加到输出模板当中了。

测试结果:
2013-04-01 15:25:16.887 10.10.10.10 [main] ERROR c.s.f.log.normal.TestAppender

这里的10.10.10.10便是转换后的值了。

上面的步骤只是基本的自定义模板方法,不好的地方就是要在配置文件里注册,实际上只要模仿logback原生创建的方法把这个转换符加进去就可以了。可以看下PatternLayout.java源码:
public class PatternLayout extends PatternLayoutBase<ILoggingEvent> {
public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
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());
...

现在只需在这个static方法快里加上一句:
defaultConverterMap.put("ip",IpConvert.class.getName());
即可。"ip"是转换的字符,IpConvert是上面定义的转换器类。但如何添加进去呢? 下面便是一种实现方案:

首先,定义一个类,该类继承PatternLayout.java:

package com.cj.log;
import ch.qos.logback.classic.PatternLayout;
public class MyPatternLayout extends PatternLayout {
static {
defaultConverterMap.put("ip",IpConvert.class.getName());
}
}

直接调用父类的属性,将自定义的转换符添加进去。IpConvert便是上面已实现的转换器。

之后,便是在logback.xml中配置我们自定义的PatternLayout:

<!-- 日志输出格式 -->
<layout class="com.cj.log.MyPatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %ip [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>

原先的layout的class类为" ch.qos.logback.classic.PatternLayout",这里换成我们自定义的即可。

通过上述两种方案,便可实现自定义模板的功能。这种功能使用的一种场景便是在集群的环境下进行日志的分析,通常分析异常日志的时候,并不能准确定位到底是哪台主机上的哪个server出了错,如果添加了ip地址信息到日志中去,那么日志分析工作讲会变得更加准确高效。如果有类似于监控平台这样的系统,那么便可将所有的异常日志统一进行分析,只需在输出中定义一些类似于主机ip、系统应用id之类的区别的变量,这样处理的好处自然不言而喻。

logback高级特性使用(二) 自定义Pattern模板的更多相关文章

  1. logback高级特性二 异步记录日志

    问题描述: 下图中JProfiler可看出logback的日志输出占了64%的cpu消耗 优化方案: 1. 这部分写日志的代码写了一些报文数据,确实是比较大的字符串.先禁掉控制台输出,生产环境也不需要 ...

  2. ActiveMQ学习笔记(20)----Consumer高级特性(二)

    1. Message Selectors JMS Selectors 用在获取消息的时候,可以基于消息属性和Xpath语法对消息进行过滤.JMS Selectors有SQL92语义定义.以下是个Sel ...

  3. ActiveMQ学习笔记(18)----Message高级特性(二)

    1. Blob Message 有些时候,我们需要传递Blob(Binary Large Objects)消息,在5.14之前,(5.12和5.13需要在jetty.xml中手动开启)可以按照如下的方 ...

  4. ActiveMQ学习笔记(14)----Destination高级特性(二)

    1. Visual Destinations 1.1 概述 虚拟Destination用来创建逻辑Destinations,客户端可以通过它来产生和消费消息,它会把消息映射到物理Destination ...

  5. ActiveMQ学习笔记(16)----Message Dispatch高级特性(二)

    1. Optimized Acknowledgetment ActiveMQ缺省支持批量确认消息,由于批量确认会提高性能,如果希望在应用程序中禁止经过优化的确认方式,可以采用以下几种方式: 1. 在C ...

  6. Spring 高级特性之二:Processor——Bean生命周期关键触发时机

    任何对象都有生命周期,那么Spring Bean对象创建.管理.销毁的整个生命周期个关键触发时机如何体现呢?先说结论,后续案例验证结论. 根据上图可知,实际bean对象涉及生命周期的主要是一个构造器和 ...

  7. (十二)boost库之多线程高级特性

    (十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...

  8. 大数据笔记(二十六)——Scala语言的高级特性

    ===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...

  9. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  10. 深入浅出Redis(二)高级特性:事务

    第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构.其实,Redis还支持其他的一些高级特性:事务.公布与订阅.管道.脚本等,本篇我们来看一下事务. 前一篇中我们提到,在Redis ...

随机推荐

  1. flops, params = profile(model, inputs=(x,))计算

    计算量:FLOPs,FLOP时指浮点运算次数,s是指秒,即每秒浮点运算次数的意思,考量一个网络模型的计算量的标准.参数量:Params,是指网络模型中需要训练的参数总数. flops(G) = flo ...

  2. 什么是 h5项目

    首先 h5项目不是 html5 的意思,在者 h5 不是微信网页 : h5 是移动网页的统称 :

  3. 03 什么是预训练(Transformer 前奏)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  4. KubeSphere 在 vsleem 的落地实践

    作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献. 公司介绍 公司简介 苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商 ...

  5. 使用 KubeKey 安装部署 Kubernetes 与 Kube-OVN

    作者简介:林瑞超,锐捷网络开发工程师, KubeSphere 社区 contributor, 关注Kube-OVN, Cilium 等容器网络相关技术 背景 KubeKey 是 KubeSphere ...

  6. 云原生周刊:GitOps 的 4 条核心原则

    日前在温哥华举行的 cdCON + GitOpsCon 上,分享内容以 GitOps 原则为特色: GitOps 是声明式的: GitOps 应用程序是版本化的和不可变的: 自动拉取 GitOps 应 ...

  7. KubeSphere 后端源码深度解析

    这篇文章我们将学习在 vscode 上的 ssh remote 插件基础上,尝试 debug 和学习 KubeSphere 后端模块架构. 前提 安装好 vscode 以及 ssh remote co ...

  8. Linux利用scp命令上传下载文件

    scp是secure copy的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. scp传输是加密的,可能会稍微影响一下速度.当你服务 ...

  9. ROS入门21讲(2)

    四.创建工作空间与功能包 1.工作空间 工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件). 包含: src:代码空间(Source Space),放 ...

  10. 反射+特性实现 类和XML文档的序列化反序列化

    1.作用:将实体类的属性(字符串.日期.数值.布而.类)生成为xml文档中的结点,将xml文档的结点值或者属性值填充到实体类的属性值中2.思路:特性.反射.泛型:特性记录xml结点与实体属性的对应关系 ...