【转载】structlog4j介绍
源文章:structlog4j介绍
结构化日志对于日志的收集的作用挺大的,根据自身的业务场景,基于SLF4J
实现了structlog4j。
相关引用
Gradle
// 基础包
compile 'tech.ibit:structlog4j-api:latest'
// 支持json, yaml格式等扩展
compile 'tech.ibit:structlog4j-extend:latest'
Maven
<!--基础包-->
<dependency>
<groupId>tech.ibit</groupId>
<artifactId>structlog4j-api</artifactId>
<version>latest</version>
</dependency>
<!--扩展包-->
<dependency>
<groupId>tech.ibit</groupId>
<artifactId>structlog4j-extend</artifactId>
<version>latest</version>
</dependency>
概述
structlog4j的核心思想就是将日志已key-value的方式呈现,方便日期切分。
日志保留字段
_message: 消息内容
_errorMessage: 异常信息
_stackTrace: 异常stack trace信息
引入logger
import tech.ibit.structlog4j.Logger;
import tech.ibit.structlog4j.StructLoggerFactory;
private static final Logger log = StructLoggerFactory.getLogger(Test.class);
字符串处理
业务需要,将日志单行输入,所以对以下字符进行了处理, ":"前原字符串,":" 后的是处理后的字符
\t: \\t
\r: \\r
\n: \\n
默认日志格式(key-value)
_message=Something error!&user=ibit-tech_errorMessage=Test Exception
说明
- 默认方式引入
structlog4j-api
即可 key-value
的方式通过&
进行分割,将&
转为'%26'
json日志格式
{"_message":"Something error!","user":"ibit-tech","_errorMessage":"Test Exception"}
修改全局formatter方法:
方法1(java代码):
StructLog4J.setFormatter(JsonFormatter.getInstance());
方法2(classpath:/structlog4j.properties):
formatter=tech.ibit.structlog4j.extend.JsonFormatter#getInstance
说明
- 需要引入
structlog4j-extend
- "#"后面为获取实例方法
yaml日志格式
hostname: localhost\nip: 127.0.0.1
修改全局formatter方法:
方法1(java代码):
StructLog4J.setFormatter(YamlFormatter.getInstance());
方法2(classpath:/structlog4j.properties):
formatter=tech.ibit.structlog4j.extend.YamlFormatter#getInstance
说明
- 需要引入
structlog4j-extend
- "\n":表示换行符号,读取到日志之后,需要将"\n"转为"\n"才能正确显示
- "#"后面为获取实例方法
自定义日志格式
实现tech.ibit.structlog4j.Formatter#format
方法即可
tech.ibit.structlog4j.Formatter {
/**
* 格式化(待实现)
*
* @param kvMap 兼职map
* @return 格式化后的文本
*/
String format(Map<String, ?> kvMap);
}
异常信息处理
- 默认方式,
StructLog4J.isTransStackTrace()
==true
, 日志中会出现_errorMessage
和_stackTrace
字段,_stackTrace
进行了转义,单行显示 - 当
StructLog4J.isTransStackTrace()
==false
, 日志中只出现_errorMessage
,然后之后就将异常信息在接下来的日志打印出来(多行)
eg:
# 单行打印stackTrace
_message=Something error&user=ibit-tech&_errorMessage=Test Exception&_stackTrace=java.lang.RuntimeException: Test Exception\n\tat tech.ibit.demo.structlog4j.Demo.main(Demo.java:32)\n
# 多行打印stackTrace
_message=Something error&user=ibit-tech&_errorMessage=Test Exception
java.lang.RuntimeException: Test Exception
at tech.ibit.demo.structlog4j.Demo.main(Demo.java:33)
修改全局transStackTrace方法:
方法1(java代码):
StructLog4J.setTransStackTrace(true|false);
方法2(classpath:/structlog4j.properties):
transStackTrace=true|false
structlog4j.properties说明:
# 指定formatter 创建方式(工厂方法)
formatter=tech.ibit.structlog4j.extend.JsonFormatter#getInstance
# 指定异常的stackTrace日志是否需要转化
transStackTrace=true
用法
_message说明(以error为例子)
Logger存在一下方法支持error级别日志
/**
* ERROR日志
*
* @param message 消息
* @param params 参数
*/
void error(String message, Object... params);
/**
* ERROR日志
*
* @param messages 消息片段
* @param params 参数
*/
void error(Object[] messages, Object... params);
其中message和messages的区别在于,messages支持传入占位符,eg:
logger.error("Something error, id: 12, username: ibit-tech");
等价于:
logger.error(new Object[] {"Something error, id: {}, username: {}", 12, "ibit-tech"});
使用key-value的方式
log.error("Something error", "user", "ibit-tech", "age", 100);
实现ToLog
对key-value进行包装
log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech", "age", 101});
异常处理
log.error("Something error", "user", "ibit-tech", "age", 100, new RuntimeException("Test Exception"));
混合使用
log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech"}, "age", 101);
log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech"}, "age", 101, (ToLog) () -> new Object[] {"city", "sz"}, new RuntimeException("Test Exception"));
POJO实现MapToLog
,toLog()会返回POJO中所有字段
@Test
public void toLog() {
User user = new User("ibit-tech", 21);
Assert.assertEquals("[name, ibit-tech, age, 21]", Arrays.asList(user.toLog()).toString());
}
@Value
public class User implements MapToLog {
private String name;
private int age;
}
说明
- 需要引入
structlog4j-extend
License
Apache License 2.0
【转载】structlog4j介绍的更多相关文章
- 转载 VPN介绍
转载原地址: http://aajs800.blog.51cto.com/519255/239724 原作者 aajs800 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
- [转载]Scikit-learn介绍几种常用的特征选择方法
#### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...
- [转载]Masonry介绍与使用实践(快速上手Autolayout)
原博地址 http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...
- 转载 WebBrowser介绍——Javascript与C++互操作
注:本文来自于 http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html WebBrowser控件是Microsoft提供的一个用于网页浏 ...
- 转载:简单介绍Python中的try和finally和with方法
用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...
- 转载 GUID介绍
转载 http://www.cnblogs.com/illele/archive/2008/02/25/1080554.html GUID(Global unique identifier)全局唯一标 ...
- 【转载】介绍“Razor”— ASP.NET的一个新视图引擎
最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...
- 转载:介绍AD另外一种奇葩的多通道复用的方法
原文链接:http://www.eda365.com/forum.php?_dsign=74fe4957&mod=viewthread&page=1&tid=110710 在设 ...
- 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html
EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...
随机推荐
- linux容器技术之chroot
linux容器技术之chroot linux chroot 机制的由来 root 用户启动一个daemon,必须用root 用户来启动,比如一个web 服务器(nginx/apapce 80端口)是在 ...
- GPU与CPU
GPU与CPU CPU CPU,也就是中央处理器,结构主要包括控制器(指挥各部分工作).运算器(实现数据加工).寄存器.高缓以及数据/控制/状态总线.计算机的性能很大程度上依赖于CPU,CPU的功能包 ...
- X-CTF(REVERSE入门) re1
运行程序 32位ida打开,shift+f12查看运行时的中文,这里双击flag get字符串进入rdata段 双击后面的函数,进入text段,小的窗口视图里可以看见汇编代码调用函数的句子 右边的即是 ...
- mybatis 执行流程以及初用错误总结
mappper 配置文件 头文件: 1. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" &q ...
- 在Centos7上安装Oracle
环境: 硬盘30G:2G RAM:Centos7:Oracle 11G: 1.创建组和用户 [zzd@localhost ~]$ su root #切换到root Password: [root@lo ...
- Java 分布式框架面试题合集
Java 分布式框架面试题合集 1.什么是 ZooKeeper? 答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案.设计目的是将那些复杂且容易出错的分布 ...
- 实验2: CDP命令操作
基本命令 1.获设备的相邻信息:CDP CDP1.不管上层协议 能够获取的信息包括:1.设备名2.对应各协议的地址3.端口名4.角色特征5.平台 全局启用/关闭CDP:cdp run/no cdp r ...
- 6、RIP
在路由查找时,有类路由查找方式和无类路由查找的区别:有类路由查找:1.首先匹配主网条目.主网信息2.匹配上主网之后,再去查找子网信息3.查找到子网,就会转发,否则就丢弃4.有一种例外,没有找到主网和子 ...
- 死磕java(3)
流程控制 if else // do while// switch case// while do// break// continue// 相关查询百度
- c++引用深入探讨
(偶然翻起自己的旧博,忽然发现大三的时候写的这篇文章,仔细看看觉得写的还是那么回事,所以赶紧搭救出来) 引用的声明: 基本格式:引用类型 &引用名=被引用对象 &运算符:声明运算符 ...