日记原则化规范
一.背景
随着互联网络飞速发展,各行各业已经不限于懂得信息,更是挖掘、把握住隐藏在信息背面信息。海量数据是一种宝贵财富,如何按照不同维度、各种口径和规则从海量、隐含、杂乱、重复web日记或顾客访问信息中发现、提炼、分析、记录出有用知识和应用价值,进而提高服务质量,改进网站构造和内容,挖掘出故意义顾客访问模式、规则以及有关潜在顾客等是一件非常故意义工作。
为实时监控网络异常状态,跟踪网络应用资源使用状况,实现对众多设备主机日记信息集中分析和管控,实现各种日记格式兼容,准拟定位出问题物理服务器和时间段等,当前南航通过统一集中布置SpringAOP(kafa/redis)+ Elasticsearch+Logstash+Kibana日记分析平台实现了对日记收集、存储、搜索、分析、监控及呈现,并开放访问接口给开发人员,开发人员以ELK日记分析平台源数据为基本,对数据进行预解决、维度汇总,进而形成行业上各种指标。
ELK具备强大搜索和呈现功能,它只需安装布置而不需要编写代码,即可进行业务数据分析、错误日记分析及数据预警等。而
SpringAop是OOP延续,它就像刀切豆腐同样横切整个系统,将“关注”封装在切面中,实现了调用者与被调用者之间解耦合,是需要人工编写有关代码实现日记输出,而在现实中日记记录无统一规范,导致无法精确迅速定位问题或者获取到想要数据。因此本文将日记规范重点放在SpringAop上。
二.原则
1.集中日记服务器:在WEB集节点越来越多状况下,让开发及系统维护人员能很以便查看日记信息。
2.日记信息输出方略:日记信息输出全而不乱,便于跟踪和分析问题。
3.核心业务日记输出:基于数据采集、数据核查、系统安全等方面考虑,核心业务系统对输出日记信息有特殊规定,需要做针对性设计。
4.支持备份与保密机制:防止日记丢失,敏感信息应加密,分布式文献系统保证可靠性。
三.日记分类
日记文献按应用需求功能分为访问日记、应用日记和系统日记。按级别从低到高分为TRACE级、DEBUG级、INFO级、WARN级、ERROR级、FATAL级六级。
1.TRACE级、DEBUG级:理论上“不属于错误”,只是打印某些状态、提示信息,以便开发过程中观测,开发完毕、正式上线后需要屏蔽。
2.INFO级:理论上“不属于错误”,只是某些提示性信息,但是虽然在开发完毕、正式上线系统中,也有保存价值。在实际环境中,系统管理员或者高档顾客要能理解INFO输出信息并能不久理解应用正在做什么。例如,一种和解决机票预订系统,对每一张票要有且只有一条INFO信息描述 "[Who] booked ticket from [Where] to [Where]"。
3.WARN级:属于轻微“警告”,程序中浮现了某些异常状况,但是影响不大,还可以正常使用。
4.ERROR级:属于“普通错误”,在程序可以控制范畴内,不会导致连锁影响或巨大影响,日记发生之后其实不会导致系统运营浮现异常,也许是对某些数据初始化进一步验证浮现问题。
5.FATAL级:属于“致命错误”,开发过程中atch模块中抛出某些未能预料到系统错误,可导致整个系统或者一系列功能无法使用,甚至导致系统瘫痪、关闭,必要立即有人进行解决。例如:空指针异常,数据库不可用,如硬盘空间满等,核心业务流程中断等等。
log4j2不打印日志
四.代码日记规范
1. 【强制】系统应用中不可直接使用日记系统(Log4j、Logback)中API,而应依赖使用日记框架SLF4J中API,使用门面模式日记框架,有助于维护和各个类日记解决方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger =
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. 【强制】避免重复打印日记,挥霍磁盘空间,务必在l 中设立additivity=false。
正例:<logger name="com.fig"
additivity="false">
6. 【强制】异常信息应当涉及两类信息:案发现场信息和异常
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论