资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
.日志标准化规范一 背景随着互联网络的飞速发展,各行各业已经不限于知道信息,更是挖掘、把握住隐藏在信息后面的信息。海量的数据是一种宝贵的财富,如何按照不同维度、各种口径和规则从海量的、隐含的、杂乱的、重复的web日志或用户访问信息中发现、提炼、分析、统计出有用的知识和应用价值,进而提高服务质量,改进网站的结构和内容,挖掘出有意义的用户访问模式、规则以及相关的潜在用户群等是一件非常有意义的工作。为实时监控网络的异常状态,跟踪网络应用资源的使用情况,实现对众多设备主机日志信息的集中分析和管控,实现各种日志格式的兼容,准确定位出问题的物理服务器和时间段等,目前南航通过统一集中部署SpringAOP(kafa/redis)+ Elasticsearch+Logstash+Kibana日志分析平台实现了对日志收集、存储、搜索、分析、监控及展现,并开放访问接口给开发人员,开发人员以ELK日志分析平台的源数据为基础,对数据进行预处理、维度汇总,进而形成行业上的各种指标。ELK具有强大的搜索和展现功能,它只需安装部署而不需要编写代码,即可进行业务数据分析、错误日志分析及数据预警等。而SpringAop是OOP的延续,它就像刀切豆腐一样横切整个系统,将“关注”封装在切面中,实现了调用者与被调用者之间的解耦合,是需要人工编写相关的代码实现日志的输出的,而在现实中日志记录无统一规范,导致无法准确快速的定位问题或者获取到想要的数据。所以本文将日志的规范重点放在SpringAop上。二 原则1.集中的日志服务器:在WEB集群节点越来越多的情况下,让开发及系统维护人员能很方便的查看日志信息。2.日志信息输出策略:日志信息输出全而不乱,便于跟踪和分析问题。3.关键业务的日志输出:基于数据采集、数据核查、系统安全等方面的考虑,关键业务系统对输出的日志信息有特殊的要求,需要做针对性的设计。4.支持备份与保密机制:防止日志丢失,敏感信息应加密,分布式文件系统保证可靠性。三 日志分类日志文件按应用需求功能分为访问日志、应用日志和系统日志。按等级从低到高分为TRACE级、DEBUG级、INFO级、WARN级、ERROR级、FATAL级六级。1TRACE级、DEBUG级:理论上“不属于错误”,只是打印一些状态、提示信息,以便开发过程中观察,开发完成、正式上线后需要屏蔽。2.INFO级: 理论上“不属于错误”,只是一些提示性的信息,但是即使在开发完成、正式上线的系统中,也有保留的价值。在实际环境中,系统管理员或者高级用户要能理解INFO输出的信息并能很快的了解应用正在做什么。比如,一个和处理机票预订的系统,对每一张票要有且只有一条INFO信息描述 Who booked ticket from Where to Where。3.WARN级:属于轻微的“警告”,程序中出现了一些异常情况,但是影响不大,还可以正常使用。4.ERROR级:属于“普通的错误”,在程序可以控制的范围内,不会造成连锁影响或巨大影响,日志发生之后其实不会导致系统运行出现异常的,可能是对某些数据的初始化深入验证出现的问题。5.FATAL级:属于“致命错误”,开发过程中的try.catch模块中抛出的一些未能预料到的系统错误,可导致整个系统或者一系列功能无法使用,甚至导致系统瘫痪、关闭,必须马上有人进行处理。比如:空指针异常,数据库不可用,如硬盘空间满等,关键业务流程中断等等。四 代码日志规范1. 【强制】系统应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class)。2. 【强制】日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。3. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_logType_logName.log。logType:日志类型,推荐分类有stats/desc/monitor/visit等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。正例:mppserver应用中单独监控时区转换异常,如: mppserver_monitor_timeZoneConvert.log 说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。 4. 【强制】对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。 说明:logger.debug(Processing trade with id: + id + symbol: + symbol); 如果日志级别是warn,上述日志不会打印,但是会执行字符串拼接操作,如果symbol是对象,会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。 正例:(条件) if (logger.isDebugEnabled() logger.debug(Processing trade with id: + id + symbol: + symbol); 正例:(占位符) logger.debug(Processing trade with id: symbol : , id, symbol); 解释:debug/info级别的信息,信息本身需要计算或合并的,必须加 isXxxEnabled() 判断在前,这样可以大大提高高并发下的效率。如果不加 isXxxEnabled() 判断,Processing trade with id: + id + symbol: + symbol在info级别下也会执行。5. 【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。 正例: 6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。 正例:logger.error(各类参数或者对象toString + _ + e.getMessage(), e); 7. 【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。 说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处? 8. 【参考】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error级别只记录系统逻辑出错、异常等重要的错误信息。如非必要,请不要在此场景打出error级别。 以上8条来自于阿里巴巴开发手册-日志规约。9.Web日志记录了用户对网站的每一次点击访问,即每一次接口的调用。但由于各种原因,web日志中有些记录是缺失或不完整的数据,推荐在每个接口调用后,在其入口输出调用类名及输入参数的日志,以及接口结束前输出返回数据的日志,并使用info级别。另外,重要方法入口,业务流程前后及处理的结果等,推荐记录log,并使用debug级别,因为对于非开发人员掌控的环境(无法做DEBUG),记录方法调用、入参、返回值的方式对于排查问题会有很大帮助。10. 日志输出规范。应用程序禁止直接使用Log4J API,并且禁止使用JDK Console输出(System.out, System.err, ex.printStackTrace(), etc.),应使用logger.debug、logger.error。所有的日志实例的属性都应从根日志(root logger)继承。日志信息必须支持输出到控制台(console)和文本文件(TextFiles)。输出到文本文件(TextFiles)的日志,应提供日志文件分析脚本,以方便查询阅读、统计分析。11关注日志记录对于系统性能、安全性的影响,不要多次重复记录日志。日志记录太过于频繁,日志记录到文件IO或者数据库都是很费CPU和内存资源的事,会对系统的性能产生影响。关注日志是否会被恶意攻击频繁打印日志,使得日志文件超过100G、500G直到磁盘容量爆满,服务器挂掉。12记录要精简、不滥用日志,关注日志记录的正确性和必要性。分清楚什么时候应该记录日志,什么时候不需要记录日志。什么是TRACE、DEBUG信息,什么是INFO、ERROR信息。对于异常处理,不要多次重复的记录同一个异常的堆栈信息。比如在DAO层记录了异常堆栈信息,然后抛出异常,在web层catch了异常之后,又记录了一次异常堆栈信息。 13在日志信息上添加便于检阅、查找的额外标识。每条日志都应有关键标识,能够尽快定位某条信息的位置。包括日期和时间,程序Java类的名称、方法甚至行号,错误类型或者错误代码。否则前端web页面报错,告诉开发人员去查找问题,开发人员很难去查找当时的操作日志或者异常信息。14.Log对象的声明和初始化仅以下代码是符合规范:/ (推荐)private static final Logger logger =LoggerFactory.getLogger(Xxx.class);private final Logger logger = LoggerFactory.getLogger(getClass();private static Logger logger = LoggerFactory.getLogger(Xxx.class);protected final Logger logger =LoggerFactory.getLogger(getClass();private Logger logger = LoggerFactory.getLogger(getClass();protected Logger logger = LoggerFactory.getLogger(getClass();private static final Logger logger =LoggerFactory.getLogger(loggerName);15.注意error和warn级别的区别,导致业务不正常服务的,用error级别;错误是预期会发生的,并且已经有了其他的处理流程,使用warn级别。16. Log的内容须确保不会因为Log语句的问题而抛出异常造成中断,如下有可能会抛出NullPointerException:log.debug(Processing request with id: , request.getId();17.日志配置一般有:日志级别、输出位置,如果有日志分析工具,还需仔细设计日志格式的配置,以能够在工具中完美展示。所有的日志配置文件放在src目录下,编译时随同。class文件一同拷贝到(%webapp_HOME%)WEB-INFclas
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号