一、简介

  • 日志打印是java代码开发中不可缺少的重要一步。
  • 日志可以排查问题,可以搜集数据

二、常用日志框架

比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j-api统一接口。

(1) 使用log4j

log4j使用:
1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties

代码中

import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(xx.class);

(2) 使用logback

logback使用:
1. slf4j-api-1.5.11.jar
2. logback-core.jar
3. logback-classic.jar
4. logback.xml

代码同log4j

import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(xx.class);

三、日志级别

TRACE < DEBUG < INFO < WARN < ERROR

日常使用较多的是error, info , debug

四、logback简单介绍

简单介绍下常用的logback,logback优点:

  • 比log4j更快
  • 和log4j使用了同一个接口,slf4j-api,可以非常方便切换
  • 定义了功能非常丰富的appender
  • 支持日志压缩

logback要正确理解xml配置文件

  • configuration:总的父节点
  • property:自定义属性
  • appender:输出控制器,可以输出到控制台,自定义文件等
  • logger:日志级别
  • root:控制器级别

一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds"><contextName>XXXXXXXX</contextName><property name="log.path" value="./log/"/><!-- 日志最大的历史 30天 --><property name="maxHistory" value="30"/><property name="log.pattern"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%-5level] [%logger{30}:%line] %msg%n"/><!--输出到控制台--><appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--><!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--><!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--><!--<level>INFO</level>--><!--<onMatch>ACCEPT</onMatch>--><!--<onMismatch>DENY</onMismatch>--><!--</filter>--><!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--><!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 时间滚动输出 level为 INFO 日志 --><appender name="errorFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--><!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--><!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--><!--<level>INFO</level>--><!--<onMatch>ACCEPT</onMatch>--><!--<onMismatch>DENY</onMismatch>--><!--</filter>--><!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--><!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/error.log</file><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 每天日志归档路径以及格式 --><fileNamePattern>${log.path}/error-%d{yyyyMMdd}.%i.log.zip</fileNamePattern><!--日志文件保留天数--><maxHistory>${maxHistory}</maxHistory><!-- 日志总保存量为2GB --><totalSizeCap>2GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 时间滚动输出 level为 INFO 日志 --><appender name="infoFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--><!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--><!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--><!--<level>INFO</level>--><!--<onMatch>ACCEPT</onMatch>--><!--<onMismatch>DENY</onMismatch>--><!--</filter>--><!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--><!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/info.log</file><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 每天日志归档路径以及格式 --><fileNamePattern>${log.path}/info-%d{yyyyMMdd}.%i.log.zip</fileNamePattern><!--日志文件保留天数--><maxHistory>${maxHistory}</maxHistory><!-- 日志总保存量为10GB --><totalSizeCap>2GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 时间滚动输出 level为 INFO 日志 --><appender name="debugFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!--LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。--><!--例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。--><!--<filter class="ch.qos.logback.classic.filter.LevelFilter">--><!--<level>INFO</level>--><!--<onMatch>ACCEPT</onMatch>--><!--<onMismatch>DENY</onMismatch>--><!--</filter>--><!--ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。--><!-- 过滤掉所有低于 DEBUG 级别的日志,留下DEBUG及以上级别的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/debug.log</file><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 每天日志归档路径以及格式 --><fileNamePattern>${log.path}/debug-%d{yyyyMMdd}.%i.log.zip</fileNamePattern><!--日志文件保留天数--><maxHistory>${maxHistory}</maxHistory><!-- 日志总保存量为2GB --><totalSizeCap>2GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!--文件达到 最大100MB时会被压缩和切割 --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><logger name="com.baomidou" level="debug"/><root level="info"><appender-ref ref="consoleAppender"/><appender-ref ref="errorFileAppender"/><appender-ref ref="infoFileAppender"/><appender-ref ref="debugFileAppender"/></root></configuration>

五、常见问题

  • 1、日志打的少,不好排查问题?
我们经常会遇到一个生产问题,去看日志,啥都没有,只能重新加日志,发包,再排查问题;
所以我们要养成打日志的习惯,开发环境可以debug看,生产看不了,只能加日志,在开发的时候就把必要的日志加上;
比较重要的是接口的入参,返回,重要节点开始,结束,mq发送接收等。
  • 2、error, info , debug分别都什么时候使用?
error: 捕获异常的时候使用,这个没有异议
info: 比较重要的信息,使用频次不是非常高的场景,比如入参出参
debug: 一个是不是特别重要的信息,但是又不能少,还有数据量大的数据,比如大量mq信息,访问频繁的接口入参出参
  • 3、开启debug好多无用的debug信息怎么办?
把项目的目录定为debug,其它定成info。这样只有本项目的debug日志会打印了
logging.level.root=info
logging.level.cn.mypackage=debug
  • 4、需要自定义日志文件吗?
logback可以把日志写进自定义文件,debug,info,error分开存储,历史数据还能压缩;
按自己项目的需求来,大型项目建议分开存储。
  • 5、springboot启动命令自带的日志和自定义日志文件的日志重复怎么办?
我们一般启动springboot项目命令为:nohup java -jar XXXXXXXX.jar >> XXXXXXX.log 2>&1 &
这个会生成一个日志文件,logback配置也会生成自己的日志文件,就会重复,造成空间浪费,如何取舍?如果你们公司统一打包脚本的话,就用命令生成的日志文件吧,把logback配置去掉;
如果你们公司自由度比较高,就用logback生成的日志,把命令改成  >/dev/null 就可以了
  • 6、debug日志正确写法?
有些人可能打debug日志直接logger.debug("****");
如果项目的日志级别比较高,就比较浪费性能,可以加一个
if (log.isDebugEnabled()) {log.debug("XXXXXXXXXXXXX");
}
  • 7、动态日志级别?
有些公司支持动态配置文件,比如diamond,nacos等,可以修改配置文件的级别,动态生效
logging.level.root=info
#logging.level.root=debug日常开在info,出了问题开debug找,资源有限可以这样做,不推荐生产使用

欢迎关注微信公众号:丰极,更多技术学习分享。

java日志打印使用指南相关推荐

  1. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

    文章目录 6. 控制台打印(Console) 模拟Java日志打印格式 美化对象打印(表格形式打印输出) 日志等级输出(让其在控制台显示时有颜色提示) 代码运行时间统计打印输出   6. 控制台打印( ...

  2. java 日志打印sql语句_利用log4j打印sql的log日志

    默认情况下,使用ibatis是不打印ibatis相关的log的,因为内部的sql执行都是内部调用,在server的控制台是不 会 打印log的. 在log4j的配置文件log4j.properties ...

  3. java 日志打印规范

    日志要求: 重要日志一定要打印到日志文件 日志文件应该每天滚动一次,日志多的可以每个小时滚动一次 日期必须精确到毫秒,而不是秒 确保日志是按事件顺序输出 [推荐]最好能打印调用方信息,比如访问者ip等 ...

  4. java程序日志打印规范

    java日志打印规范 一.日志 API 二.日志输出 三.日志配置 V1.0.0_NEW 四.日志性能 五.栈信息打印 一.日志 API 1.[强制]各应用中不可直接使用日志系统(Log4j.Logb ...

  5. java占位符打印_java简单日志打印规范小记

    个人认为,如果公司一些基础类库不做约束,很可能"埋坑",形成技术债务,最终为此付出代价.本文讲解一个最基本的日志打印规范. 1. 日志打印组件 日志组件有很多,日志门面的选择有:S ...

  6. java日志系统简介: 从tomcat大量打印debug日志说起

    博客搬家至 https://lcy362.github.io/posts/4433/ 目前,java下应用最广泛的日志系统主要就是两个系列: log4j和slf4j+logback . 其中,slf4 ...

  7. java项目日志打印总结

    项目的日志输出 1.关于日志在项目中的logback.xml配置 配置文件内容 <?xml version="1.0" encoding="UTF-8"? ...

  8. Java日志(slf4j+logback)及打印彩色日志

    一.maven依赖 在pom文件增加slf4j+logback依赖 <!-- 版本配置 --> <properties><slf4j.version>1.7.21& ...

  9. Java之日志打印占位符

    在java中日志打印基本方式有System.out.print()打印,在工程应用中更多的是使用LogFactory,getLogger()打印,下面对其打印时使用占位符的用法进行简单分析. 1.Sy ...

最新文章

  1. BIOS interviews
  2. 每天学一点儿shell:vi和vim命令使用
  3. VTK:图片之ImageMathematics
  4. Linux常用命令(第二版) --网络通信命令
  5. centos7 安装 php-fpm_centos7中如何安装 php-fpm(nginx)
  6. 织梦autoindex应用 dedecms循环中判断第几条数据
  7. QThread使用方法
  8. 如何成为一名卓越的数据科学家——开篇七剑
  9. 风扇转速/CPU温度监控工具推荐
  10. html常用语言代码大全,常用的html代码大全
  11. 新知实验室--腾讯云TRTC体验
  12. 网站建设的完整教程以及步骤,建议收藏!
  13. 2008r2 请检查名称的拼写_甲状腺素、甲状腺激素、T3、T4…这些名称你分得清吗?...
  14. thinkphp 实现图片中的二维码识别
  15. PHP 中如何正确统计中文字数
  16. 20个JS精简代码无形装逼集合,最为致命,记得收藏好
  17. 像李云迪那样爱 IT界那些“情”
  18. H5实现复制淘口令功能
  19. 22.redis和py_redis
  20. Docker入门之路(一):部署Nginx

热门文章

  1. TechSmith Camtasia 2019.0.9 Build 17643 x64 亲测可用版
  2. 中国农民丰收节精神 2020(广东)功能性农业·农业大健康大会
  3. 工业机器人有哪几个子系统组成?各自的作用是什么?
  4. 延时队列(Delayed)实现(支持失败重试机制自定义重试时间)
  5. Android应用内打开.docx/.pdf/.xlsx/.txt等文档——腾讯TBS
  6. 论文中的对比柱状图的绘制
  7. 快速理解内存对齐以及#pragma pack
  8. 网络行为审计技术深度解析
  9. OpenCV——Canny边缘检测(cv2.Canny())
  10. 小程序即时通讯 websocket