# java的日志处理有哪些解决方案?
我打开服务器,看着比这比我自己发量都少的报错信息。一脸懵逼。只有这点儿信息。我怎么知道哪里出了问题啊?
我自己只能硬着头皮让产品经理找用户要数据。然后一条条测试。看看是那一条数据出了问题。原本大好的摸鱼时光就是这样没有了。
线上出现bug我们应该怎么快速定位问题呢?答:多打日志。
打日志我们有什么技巧吗?W
# 日志是什么?
日志是用来记录程序运行时的状态和信息。当系统出现问题的时候。我们可以通过日志快速的定位问题。所以写代码时多加点有用的日志。
# java的日志框架有哪些?
java的log4j2、logback。
springboot它默认集成了logback的日志框架。直接用就行。不用在额外的引入其它的库。
<!-- 日志收集 -->
<dependency>
<groupId>top.wutunan.www</groupId>
<artifactId>wutunan-log-starter</artifactId>
<version>0.0.2</version>
</dependency>
2
3
4
5
6
triggergun/wutunan-log-starter: wutunan-log-starter (opens new window)
# 方式一打日志
获取日志对象log在每一个类中进行输出日志。
# 方式二打日志
使用lombok工具库提供的@Slf4j注解可以自动为当前类生成日志对象。不用手动定义。
# 为什么不能用sout输出呢?
这个是一个同步的方法。每一次调用都会导致耗时的io操作。频繁调用会影响程序的性能。而且它只能输出信息到控制台。
不能灵活控制
输出位置
输出格式
输出时机
比如我想看三天前的日志它的输出早就被刷没了。
# 日志框架的优势
日志框架提供了丰富的打日志方法。
还可以通过修改日志配置文件来随心所欲的调教日志。
如:
把日志输出到控制台和文件中。
设置日志格式。
控制日志级别。
# 技巧1日志分级
日志分级
debug
info
warn
error
生产环境用info。开发环境用debug。
# 技巧2正确的记录日志信息
参数化日志。
log.info("用户单词本子中已经存在的单词记录:{}", userVocabularyNotebookWords);
# 技巧3把控时机和内容
对于重要的业务功能我建议采用防御性编程。先多多打日志。如:
方法代码的入口和出口记录参数和返回值。
在每一个关键步骤记录执行状态。而不是等出了问题无法排查。
之后项目稳定了可以移除掉不需要的日志。
注意:不要日志信息中记录敏感信息。
用户密码
万一用户泄露出去就是泄露了大量的用户信息。
# 技巧4统一日志格式
可以在logback.xml中进行统一的配置输出格式。
时间戳
线程名称
日志级别
类名
方法名
内容
在java的代码中可以为MDC设置属性值。然后在日志配置文件中就可以使用这些值。这样每个请求,每个用户的操作一目了然。
# 技巧5使用异步日志
正常情况下调用log.info()打日志时。程序会立刻把日志写入文件。这个过程是同步的。会阻塞当前线程。而异步日志会把写日志的操作放到另一个线程去做。不会阻塞主线程的执行。(性能好)
异步日志的缺点:如果程序突然奔溃,缓冲区还没来得及写入文件的日志可能会丢失。要权衡!
看系统是注重性能还是日志的完整性。
大多数情况下是追求性能。
# 技巧6日志管理
设置日志的滚动策略。可以根据文件大小和日期自动对日志文件进行切分。这样配置后每天都会创建一个新的日志文件。如果日志文件超过自己设置的阙值就会再创建一个。并且只保留最近30天的日志。还可以开启日志压缩的功能。进一步节省磁盘空间。
# 技巧7集成日志收集系统
ELK
Elastic-search
Logstash
Kibana
首先Logstash:负责收集各个服务的日志,然后发生给Elastic-search存储和索引,最后通过Kibana提供了一个可视化的界面让我们可以方便的集中搜索查看与分析日志。
ELK的搭建运维成本比较高。小团队不推荐。