日志基础
首先我们要明确的是所谓的服务器日志系统到底是帮助我们做什么的
其实这也没有什么好说的, 你会告诉我日志无非就是帮助我们快速定位服务器发生的错误或者问题, 当然这也是日志众多目的中最重要的一种
简单来说 就是我们到底应该如何写出 干净有用的日志
一些应该记录日志的地方
- 调用外部接口前后
- 系统状态发生变化的时候
- 发生不正常错误的时候/业务异常
- 系统的入口与出口
- 非预期执行
- 很少出现的 else
一些原则
- 输出Log时避免自己出错
- 过多的日志会拖慢系统
- 日志至少应该包含描述和数据
- 重要的日志应该添加特殊的可搜索字符
- 不要输出密码、个人信息、信用卡信息等敏感数据
- 输出重要方法的参数和返回值
- 输出重要方法的开始和结束(异常时是否输出结束日志?)
- 如果和外部系统链接,需要输出INPUT和OUTPUT
- 合理输出异常信息(不要主动输出异常,合理通过框架、共通代码输出;避免异常被输出多次)
- 考虑数据的输出格式,最好输出多种格式利用人看或者工具分析
- 合理输出二进制文件信息(name、size)
- 不要在循环中记录日志
日志格式
一般分为 键值对 和 json 两种 当然因项目而异
apache 引用
192.168.56.6 - - [24/Sep/2012:11:11:11 +0900] "GET /info.php HTTP/1.0" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7) Gecko/20120829 Firefox/10.0.7"
ngnix 引用
192.168.21.198 - - [06/Mar/2015:18:19:06 +0900] "GET /index.php HTTP/1.1" 200 87243 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"
日志级别
日志级别根据不同的日志系统,级别也不同,大体上分为5种
借用其他博客看到的总结 每种不同级别的错误大概可以这么来说明
- ERROR:系统发生了严重的错误, 必须马上进行处理, 否则系统将无法继续运行. 比如, NPE, 数据库不可用等.
- WARN:系统能继续运行, 但是必须引起关注. 对于存在的问题一般可以分为两类: 一种系统存在明显的问题(比如, 数据不可用), 另一种就是系统存在潜在的问题, 需要引起注意或者给出一些建议(比如, 系统运行在安全模式或者访问当前系统的账号存在安全隐患). 总之就是系统仍然可用, 但是最好进行检查和调整.
- INFO:重要的业务逻辑处理完成. 在理想情况下, INFO的日志信息要能让高级用户和系统管理员理解, 并从日志信息中能知道系统当前的运行状态. 比如对于一个机票预订系统来说, 当一个用户完成一个机票预订操作之后, 提醒应该给出"谁预订了从A到B的机票". 另一个需要输出INFO信息的地方就是一个系统操作引起系统的状态发生了重大变化(比如数据库更新, 过多的系统请求).
- DEBUG:主要给开发人员看, 下面会进一步谈到.
- TRACE: 系统详细信息, 主要给开发人员用, 一般来说, 如果是线上系统的话, 可以认为是临时输出, 而且随时可以通过开关将其关闭. 有时候我们很难将DEBUG和TRACE区分开, 一般情况下, 如果是一个已经开发测试完成的系统, 再往系统中添加日志输出, 那么应该设为TRACE级别.
日志系统
好的日志系统有很多 有很多现成的解决方案
一个好的日志系统 不仅包括日志系统的基础功能(快速的记录收集日志,按不同级别输出日志,性能高) 还应该能够快速的分析日志(分析/模式匹配/关联分析) 以及最后的监控和报警功能
日志系统大概分三类:集中日志系统/分布式日志系统/开源日志系统
分布式日志系统
开源日志
Scribe
facebook 的开源日志系统,可以存分布式文件系统,也可以存数据库
比较大的优势是容错性好,数据库挂了可以存储在本地
是一个thrift client 简介 初窥
ChukWa
Yahoo 开发的 Hadoop 的日志分析系统
Flume
日志收集系统
Kafka
Linkin 的开源消息系统
kids:知乎日志系统
kids 想做出什么样的东西
- 分布式收集
- 集中存储
- 实时订阅
- 不丢(或者尽量不丢)
- 对应用性能影响尽量小