源文章: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介绍的更多相关文章

  1. 转载 VPN介绍

    转载原地址:  http://aajs800.blog.51cto.com/519255/239724  原作者 aajs800 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...

  2. [转载]Scikit-learn介绍几种常用的特征选择方法

    #### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...

  3. [转载]Masonry介绍与使用实践(快速上手Autolayout)

    原博地址 http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...

  4. 转载 WebBrowser介绍——Javascript与C++互操作

    注:本文来自于 http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html WebBrowser控件是Microsoft提供的一个用于网页浏 ...

  5. 转载:简单介绍Python中的try和finally和with方法

    用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...

  6. 转载 GUID介绍

    转载 http://www.cnblogs.com/illele/archive/2008/02/25/1080554.html GUID(Global unique identifier)全局唯一标 ...

  7. 【转载】介绍“Razor”— ASP.NET的一个新视图引擎

    最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...

  8. 转载:介绍AD另外一种奇葩的多通道复用的方法

    原文链接:http://www.eda365.com/forum.php?_dsign=74fe4957&mod=viewthread&page=1&tid=110710 在设 ...

  9. 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html

    EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...

随机推荐

  1. ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'system.sysuser', bu

    问题:已经在settings.py文件中注册过app仍旧提示没有安装,并且使用makegirations命令时会抛出如下异常. ValueError: The field admin.LogEntry ...

  2. Spring Cloud Zuul之ZuulFilter详解

    简介 Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口.请求拦截.路由转发等作用,其核心处理则是ZuulFilter ZuulFilter部分源码 Zuul Filter全部继 ...

  3. GO异常 | runnerw.exe: CreateProcess failed with error 21

    背景 今天创建了一个GO项目,写了几行代码 package chapter1 import "fmt" func main() { fmt.Println("hello ...

  4. JSP-导入taglib 出现classNotFound异常

    案例 前端登录跳转到指定jsp,报classNoFoundException,原因是页面导入 <%@ taglib uri="http://java.sun.com/jsp/jstl/ ...

  5. html块级元素的水平垂、直居中的方式

    说明 对于初学者来说,块级元素的剧中,也是一大难题,我学习的时候,也是一脸懵逼,每次遇到都要百度,但是写的多了也自然记住一些常用的剧中方式,但是还是很模糊,今天就来好好总结一些. 布局 布局即为简单, ...

  6. 验证码,java

    这几天打算写一个验证码出来 遇到了几个问题 imageio写入失败:原因我创建文件的时候是先建立一个text文本,然后修改后缀,图片写不进去,还有没有编译 图像扭曲:粘连的问题,目前解决图像扭曲的问题 ...

  7. css-position:absolute, relative 的用法

      static(静态) 没有特别的设定,遵循基本的定位规定,不能通过z-index进行层次分级.就无法通过top,left ,bottom,right 定位.(static 为默认值)  relat ...

  8. POJ_1185_状态压缩dp

    http://poj.org/problem?id=1185 一次考虑两行,比一行略为复杂.sta保存每种状态炮兵位置,sum保存每种状态当行炮兵总数,a保存地形,dp[i][j][k]表示到第i行当 ...

  9. mIoU混淆矩阵生成函数代码详解

    代码参考博客原文: https://blog.csdn.net/jiongnima/article/details/84750819 在原文和原文的引用里,找到了关于mIoU详尽的解释.这里重点解析  ...

  10. .NET Core之单元测试(一):入门

    目录 什么是单元测试 .NET Core中的测试框架 一个最基础的单元测试 我们再看看上面的代码 什么是单元测试 单元测试是对软件中的最小可测试单元进行检查和验证.对于单元测试,要保证测试粒度足够小, ...