日志规范
一. 什么时候打日志
原则:一般来说日志分为两种:业务日志和异常日志,使用日志我们希望能达到以下目标:
1. 对程序运行情况的记录和监控;
2. 在必要时可详细了解程序内部的运行状态;
3. 对系统性能的影响尽量小
通常情况下在程序日志里记录一些比较有意义的状态数据:程序启动,退出的时间点;程序运行消耗时间;耗时程序的执行进度;重要变量的状态变化。除此之外,在公共的日志里规避打印程序的调试或者提示信息。
日志等级:
1. 成品阶段: 我的代码是 INFO 等级,第三方库是 WARN。
2. 测试、集成阶段:我的代码是 DEBUG 等级,第三方库是 WARN(或者如果需要的话是 INFO)。
3. 开发阶段:任何有意义的信息。
注意:不建议使用 TRACE/FINEST 等级
二. 怎么打日志(日志最佳实践)
编码规范:
1. 在一个对象中通常只使用一个Logger对象,Logger应该是static final的,只有在少数需要在构造函数中传递logger的情况下才使用private final。
static final logger_LOG=loggerFactory.getLogger(Main.class);
2. 输出Exceptions的全部Throwable信息,因为logger.error(msg)和
logger.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的StackTrace信息。
例子:void foo(){
try { // do something... }
catch ( Exception e ){
_LOG.error(e.getMessage()); // 错误
_LOG.error("Bad things : ",e.getMessage()); // 错误
_LOG.error("Bad things : ",e); // 正确
} }
3. 不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志。
例子:void foo() throws LogException{
try{ // do something...
}catch ( Exception e ){
_LOG.error("Bad things : ", e);
throw new LogException("Bad things : ",e);
} }
4. 不允许出现System print(包括System.out.println和System.error.println)语句。
例子:void foo() {
try{ // do something...
}catch( Exception e ){
System.out.println(e.getMessage()); // 错误
System.err.println(e.getMessage()); // 错误
_LOG.error("Bad things : ",e ); // 正确
} }
5. 不允许出现printStackTrace。
例子: void foo() {
try { // do something...
}catch ( Exception e ) {
e.printStackTrace(); // 错误
_LOG.error("Bad things : ", e ); //正确
}}
6. 日志性能的考虑,如果代码为核心代码,执行频率非常高,则输出日志建议增加判断,尤其是低级别的输出<debug、info、warn>。
debug日志太多后可能会影响性能,有一种改进方法是:
if (LOGGER.isDebugEnabled ()) {
LOGGER.debug("returning content: "+ content);
}
7. 但更好的方法是Slf4j提供的最佳实践:
LOGGER.debug("returning content: {}", content);
一方面可以减少参数构造的开销,另一方面也不用多写两行代码。
8. 日志可读性,不仅仅面向开发
举个例子吧,我们来看看下面这条日志信息:
ERROR: Save failure - SQLException .....
保存什么呢?这条消息在开发者看来是能说明一些问题的,但是对于正在苦苦查看产品问题的可怜家伙来说,却毫无用处。
更合适的信息是这样的:
RROR: Save failure- Entity=Person, Data=[id=123 surname="Mario"] - SQLException....
9. 提交前去除编码帮助日志
编程时用的debug,需要发布时去掉:
如:void aMethod(String aParam) {
LOGGER.debug(“Enter in aMethod”);
if (“no”.equals(aParam)) {
LOGGER.debug(“User says no”);
发布时,去除帮助日志。
10. 减少应使用debug导致性能开销增加
如果是Slf4j,可以将
LOGGER.info(“Person name is “ + person.getName());
改为:LOGGER.info(“Person name is {}“, person.getName());
这样这就避免创建了不必要的字符串实例。
三. 日志的要素
本文制定日志规范的原因,除了让日志统一格式外,更重要能记录有效的数据,为后面数据挖掘做准备。
如何记录有效日志?需要记录哪些要素? 需要大家共想。
个人举例:
1. 以行为维度记录:比如-----谁在什么时间,在什么地方,正在干什么。
2. 以模块维度记录:比如----分支付,下单,查看,登陆等模块记录,统一加上前缀。
……..
分享到:
相关推荐
日志规范和级别 日志是程序开发过程中不可或缺的一部分,它能够帮助我们在程序中记录用户操作、快速定位问题的根源、追踪程序执行的过程、追踪数据的变化、数据统计和性能分析、采集运行环境数据等等。因此,撰写...
Java日志规范是Java开发中不可或缺的一部分,它用于记录应用程序运行过程中的各种信息,包括错误、警告、调试信息等,帮助开发者追踪问题、优化性能。本文将深入探讨Java的日志规范,以log4j2.properties、log4j....
### 日志规范总结 #### 日志的重要性及其挑战 在现代软件开发中,日志作为记录系统行为的关键工具,在生产和测试环境中扮演着至关重要的角色。它不仅帮助开发者追踪系统的运行状态,还能在问题发生时提供宝贵的...
"应用系统日志规范.pdf" 应用系统日志规范是指在应用程序中添加程序日志记录,可以跟踪代码运行时轨迹,作为日后审计的依据;并且担当集成开发环境中的调试器的作用,向文件打印调试信息。本规范规定Java EE项目...
### 日志规范概述 日志规范是信息技术领域中一项重要的管理工具,旨在通过标准化日志的生成、存储和分析流程来提升企业的运维效率和业务稳定性。《xxxx有限公司业务软件日志规范V1.0》主要关注如何通过统一的日志...
Python日志规范是软件开发中一个非常重要的环节,它确保了程序在运行过程中产生的信息能够被有效记录、管理和分析。良好的日志规范可以帮助开发者更好地理解程序的状态,定位和解决问题,同时也有助于维护团队间的...
Elasticsearch、Logstash 和 Kibana(简称ELK Stack)是目前业界广泛采用的一套开源日志处理工具集,它们共同构建了一个强大的日志处理平台。本文将详细介绍ELK Stack在Linux环境下的部署过程及配置,并基于特定的...
日志规范 "使用的规范 信息格式规范 日志文件采集的规范" 日志框架 JAVA中现有的日志框架 JUL "JUL入门使用 日志的级别 Appender的介绍 日志的布局和格式" Log4J "Log4J的入门使用 Log4j的配置 输出日志文件 将日志...
监理日志规范表格.pdf
《3 日志规范》 日志记录在 IT 领域中扮演着至关重要的角色,它可以帮助开发者在软件运行过程中捕获错误、调试问题以及监控系统状态。SLF4J(Simple Logging Facade for Java)是Java平台上的一个日志抽象层,允许...
Java开发中的异常处理和日志规范对于保持代码的健壮性和可维护性至关重要。下面将详细阐述这些要点: 1. **避免捕获可预检查的RuntimeException**:在Java中,像NullPointerException和IndexOutOfBoundsException...
《IPTV集成播控平台用户行为日志规范文件》是针对IPTV省市级播控平台用户行为记录的一种详细规范,旨在规范日志数据的生成、存储和传输,以便于与第三方BOSS系统或数据分析系统进行有效对接。文档内容涵盖了日志文件...
而日志规范则是为了确保日志的质量和可用性,需要遵循的一系列标准和约定。 在Node.js的开发过程中,若日志规范不明确,很容易导致日志记录的随意性,例如缺乏关键上下文信息、日志级别不清、格式不统一等问题。...
项目由于git进行管控,对commit的日志需要进行规范化输出,git的hooks默认管控单仓库,在.git/hooks里面,默认关闭,如果启用的话将后缀.sample去掉。系统提供的commit检验是git文本的最后是否有空格,根据规定,...
### 支付宝日志监控规范 #### 一、监控能力概述 支付宝为所有接入其开放平台的第三方应用和服务窗提供了全面的日志监控规范。这一规范旨在帮助技术负责人和技术团队更好地管理和优化线上系统的运行状况,确保高...
日志系统使用规范
在诸多监理工作中,监理日志的规范化管理起着核心作用。监理日志不仅是记录监理人员日常工作情况的工具,更是评价监理服务质量的重要标准。然而,实际操作中,监理日志往往存在记录人员不明确、重点不突出、内容不...
标题中的“SVN属性配置:必须输入日志/日志模版”指的是在使用Subversion(SVN)版本控制系统时,对于提交操作的一个规范设置。SVN允许用户为每个文件或目录设置特定的属性,这些属性可以控制提交行为,比如强制用户...
文档结构管理 1.建立Libraries文件夹,所有第三方库放入其中。 2.建立Utilities文件夹,自已封装的类放入其中。 3.建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。
日志记录最好使用log4net,但是对于一些小应用程序,就不用这么复杂了,写了一个供大家参考。