开源日志框架的原理与分析(下)
【摘要】 本章内容根据《分布式服务架构》整理日志系统的优化和最佳实践-开发中打印日志的最佳时机-日志级别的设置-日志的数量和大小-日志的切割方式-日志格式的配置-线上事故案例1.开发人员的日志意识#开发代码时要有意识的设想代码出现问题时的场景,针对场景记录关键程序的运行信息,容易定位问题#打印日志必须包含环境信息,例如用户ID,角色,参数等#对异常等错误信息必须打印错误级别及以上的日志,对线上日志定期...
本章内容根据《分布式服务架构》整理
日志系统的优化和最佳实践
-开发中打印日志的最佳时机
-日志级别的设置
-日志的数量和大小
-日志的切割方式
-日志格式的配置
-线上事故案例
1.开发人员的日志意识
#开发代码时要有意识的设想代码出现问题时的场景,针对场景记录关键程序的运行信息,容易定位问题
#打印日志必须包含环境信息,例如用户ID,角色,参数等
#对异常等错误信息必须打印错误级别及以上的日志,对线上日志定期检查
#生产环境将关闭的日志必须在打印日志前进行判断,以此提高效率、
#必须使用占位符代替字符串链接
#对关键业务步骤必须打点并记录耗时和结果
2.日志级别的设置
线上应用info就够了
*QA测试环境可以使用debug及以下级别
*刚刚上线的项目可使用debug级别
*上线后稳定的应用使用info级别
*常年不出现问题的应用使用error级别
3.日志数量和大小
控制日志的输出量,避免由于业务上量导致服务器磁盘占满。
单条打印日志不超过1KB
遇到连续的大日志是可采取抛弃的策略
4.切割方式
cat app.log > app.date' '+%Y-%m-%d'
.log
cat /dev/null/ >app.log
存储到日期后缀的日志文件中后,清空当前日志
5.日志格式的配置
例如%p:输出日志信息的优先级
%d:输出日志时间点的日期和时间
%t:输出该日志事件的线程名
6.一行日志导致的线上事故
private void dosomething(...,Map param){
Log.debug("-------");
}
线上服务偶发报NullPointerException,通过堆栈调用,发现他是一个领域模型的toString()方法报出来的
public class DomainObject{
public String toString(){
return "DomainObject" +DomainObject.getId();
}
}=toString方法在实现时需考虑链接字符串可能产生空指针异常,对可能为空的字段进行判断
=如果没有进行判空,在toString方法中抓住异常
=在增加打印日志时考虑toString方法是否有传导性
=一定要在try…finally语句进行资源释放
=是用缓存储存数据,确保存入的数据的完整性
=如果对象不大,并不是一个集合类,在toString方法中考虑Json序列化后将对象转化为字符串
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)