logback

给日志打标签,让你的日志定位再无困难

泄露秘密 提交于 2020-08-17 07:49:32
背景 不知道各位在生产日志中定位问题时有没有碰到这样的场景:由于coding的时候日志输出的比较少,出现问题时,很难通过日志去定位到问题。又或者是,你明明coding的时候有输出日志。但是在庞大的日志文件中,由于业务线程并发比较多,你输出的日志又没有加关键信息。你也很难定位到你所需要的日志信息。 之前在公司里写业务代码时,为了使每个RPC调用能被日志记录下来,我们在公司基础组件里定义了一个切面,拦截所有的RPC调用,方法开始之前,在日志里输出调用的服务和方法以及参数,方法结束时输出方法的耗时。我相信很多人也是这么做的。 这样一来 ,所有的调用都能通过参数里的关键信息被搜索到。也能定位到调用是什么结束的以及耗时。 但是在有些业务方法中,也打上了很多的业务日志。由于核心业务的tps和qps很高,日志是互相穿插的。如果你的日志没有打上关键的业务信息(比如订单号,业务ID),那就很难在日志中被定位出来。 也许有些童鞋会说,用线程号呀。通过搜索业务ID定位到调用开始的地方,再搜索这条线程的线程号,就可以定位整个请求的所有日志。其实之前我也是这么干的,但是线程一般都是由线程池进行管理的,在tps很高的业务中,同一个线程号有可能短时间会出现多次,但是却是不同的请求。而且业务方法中可能也会有异步线程,导致了线程号会变。这样对于定位日志就又增加了难度。当然最后可以通过对时间戳的分析

给日志打标签,让你的日志定位再无困难

旧街凉风 提交于 2020-08-17 05:25:38
背景 不知道各位在生产日志中定位问题时有没有碰到这样的场景:由于coding的时候日志输出的比较少,出现问题时,很难通过日志去定位到问题。又或者是,你明明coding的时候有输出日志。但是在庞大的日志文件中,由于业务线程并发比较多,你输出的日志又没有加关键信息。你也很难定位到你所需要的日志信息。 之前在公司里写业务代码时,为了使每个RPC调用能被日志记录下来,我们在公司基础组件里定义了一个切面,拦截所有的RPC调用,方法开始之前,在日志里输出调用的服务和方法以及参数,方法结束时输出方法的耗时。我相信很多人也是这么做的。 这样一来 ,所有的调用都能通过参数里的关键信息被搜索到。也能定位到调用是什么结束的以及耗时。 但是在有些业务方法中,也打上了很多的业务日志。由于核心业务的tps和qps很高,日志是互相穿插的。如果你的日志没有打上关键的业务信息(比如订单号,业务ID),那就很难在日志中被定位出来。 也许有些童鞋会说,用线程号呀。通过搜索业务ID定位到调用开始的地方,再搜索这条线程的线程号,就可以定位整个请求的所有日志。其实之前我也是这么干的,但是线程一般都是由线程池进行管理的,在tps很高的业务中,同一个线程号有可能短时间会出现多次,但是却是不同的请求。而且业务方法中可能也会有异步线程,导致了线程号会变。这样对于定位日志就又增加了难度。当然最后可以通过对时间戳的分析

Java 开发者的编程噩梦,为什么你的代码总有 bug??

99封情书 提交于 2020-08-17 02:26:11
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。 很多 Java 初学者在开始编程时会出现一些问题,这些问题并不是指某个特定领域的问题,也不是指对某个业务不熟悉而导致的问题,而是对基础知识不够熟悉导致的问题。而就是这些问题让我们编写了一些不够健壮的代码。 这篇文章会列举几种编程初学者常常出现的一些问题,我相信这些问题多多少少也曾困扰着现在或曾经的你。如果觉得文章不错,不妨点赞分享,让更多人跳过这些开发中的坑。 随处可见的 Null 值 我见过很多的代码会把 Null 值作为返回值,当你预期是一个字符串时,意外得到了一个 Null 值;当你预期得到一个 List 时,意外又得到了一个 Null 值,如果你不进行处理,那么你还会意外得到 NullPointerException . 就像下面这样。 // 情况1 String userTag = getUserTag ( ) ; if ( userTag . equals ( "admin" ) ) { // NullPointerException // ... } // 情况2 List < String > carList = getCarList ( ) ; for ( String car : carList ) { //

SLF4J源码解析

自作多情 提交于 2020-08-15 21:33:50
提出问题 阅读源码之前,首先提几个问题 SLF4J是如何整合不同的日志框架的 Class Path中为什么只能有且仅有一种日志框架的binding 这段文字摘录自官网:In your code, in addition to slf4j-api-1.8.0-beta2.jar, you simply drop one and only one binding of your choice onto the appropriate class path location. Do not place more than one binding on your class path. 源码版本 org.slf4j:slf4j-api:1.7.25 org.apache.logging.log4j:log4j-slf4j-impl:2.11.1 ch.qos.logback:logback-classic:1.2.3 org.slf4j:slf4j-jcl:1.7.25 源码解析 带着上面的两个问题看下源码 bind()方法中通过调用findPossibleStaticLoggerBinderPathSet()方法来查找日志框架的绑定 // org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/org/slf4j/LoggerFactory

字符串数据脱敏以及与日志框架logback的集成(日志脱敏)

…衆ロ難τιáo~ 提交于 2020-08-15 16:51:44
字符串数据脱敏框架 可选择唯品会的工具: https://github.com/vipshop/vjtools/blob/master/vjkit/docs/data_masking.md 也可以自定义,用正则或者其他方式(如:commons-lang3#StringUtils) 与logback集成 分析: 由于logback的api和语法多种多样( http://logback.qos.ch/manual/architecture.html , 如下),导致在logback级别处理数据脱敏不太方便,为了保持日志框架原本自由的使用方式,所以在调用前处理日志脱敏,且注意加上必要的日志打印判断提高性能。 logback基本语法: String message = "This is a message."; logger.info(message); logger.info("This is a message"); String param = "some variable"; logger.info("This is a message. {}", param); String param1 = "some variable1"; String param2 = "some variable2"; logger.info("This is a message. {} {}",

别在 Java 代码里乱打日志了,这才是正确的日志打印姿势!

南楼画角 提交于 2020-08-15 07:35:49
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 使用slf4j 1.使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 2.实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程 基本格式 必须使用参数化信息的方式: logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol); 对于debug日志,必须判断是否为debug级别后,才进行使用: if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " +id + " symbol: " + symbol); } 不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。 反例(不要这么做): logger.debug("Processing trade

Logback配置文件这么写,还愁不会整理日志?

穿精又带淫゛_ 提交于 2020-08-14 22:41:25
摘要: 1.日志输出到文件并根据 LEVEL 级别将日志分类保存到不同文件 2.通过异步输出日志减少磁盘 IO 提高性能 3.异步输出日志的原理 1、配置文件logback-spring.xml SpringBoot 工程自带 logback 和 slf4j 的依赖,所以重点放在编写配置文件上,需 要引入什么依赖,日志依赖冲突 统统都不需要我们管了。 logback 框架会默认加载 classpath 下命名为 logback-spring.xml 或 logback.xml 的配置文件。 如果将所有日志都存储在一个文件中,文件大小也随着应用的运行越来越大并且不好排查问题,正确的做法应该是将 error 日志和其他日志分开,并且不同级别的日志根据时间段进行记录存储。 配置文件: <? xml version="1.0" encoding="UTF-8" ?> < configuration debug ="true" > <!-- 项目名称 --> < property name ="PROJECT_NAME" value ="project-api" /> <!-- 定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --> < property name ="LOG_HOME" value ="logs" /> <!-- 控制台输出 --> < appender

spring boot war包改成jar包

浪子不回头ぞ 提交于 2020-08-13 18:34:50
war包配置: <?xml version="1.0"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.easytoolsoft</groupId> <artifactId>easyreport</artifactId> <version>2.0-SNAPSHOT</version> </parent> <artifactId>easyreport-web</artifactId> <packaging>war</packaging> <name>easyreport-web</name> <description>Web view module</description> <dependencies> <!-- easyreport modules --> <dependency> <groupId>com

解决spring boot在ubuntu14.0.4中出现中文乱码的情况。

不想你离开。 提交于 2020-08-13 11:38:10
一个应用在其中的一台服务器中是没有问题,但是在另一台应用中是有问题。这就很烦,虽然不影响应用的启动,但是看日志就不是很友好。 昨天经过一番操作,终于解决了这个问题。 问题的解决是参考这个的 spring boot jar部署 控制台 日志 乱码 在logback.xml中配置<charset>UTF-8</charset> 在解决这个问题中,也学到了一些知识。 vim跳到文件头和文末结尾 gg : 跳转到文件头 Shift+g : 跳转到文件末 查看文件的编码 file filename Linux查看文件编码格式及文件编码转换 linux查看文件编码格式 一开始以为是ubuntu的配置不对 Ubuntu服务器显示中文乱码问题 Ubuntu的中文乱码问题 来源: oschina 链接: https://my.oschina.net/miaojiangmin/blog/4325748

springboot-logging

自古美人都是妖i 提交于 2020-08-13 01:55:14
1、springboot默认日志输出格式 Date 和 Time:毫秒精度,易于排序。 Log Level:ERROR,WARN,INFO,DEBUG或TRACE。 Process ID。 一个---分隔符,用于区分实际 log 消息的开头。 线程 name:括在方括号中(可能会截断 console 输出)。 Logger name:这通常是源 class name(通常缩写)。 log 消息。 2、文件输出 在application.properites种配置:如下 3、集成其他的日志 在springboot环境中logging支持一下三种日志 在我目前项目中,使用的比较多的还是logback日志集成,在集成logback日志时,首先需要引入springboot的logging依赖包 org.springframework.boot spring-boot-starter-logging 在根目下创建logback-spring.xml文件,然后根据你的需求来配置需要打印的日志信息 我的具体配置如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔