您的位置:首页 > 其它

写程序时如何使用日志

2015-11-19 15:17 267 查看

本文来自于朋友tzz的日常编程心得。

日志分级

6个日志等级:TRACE/DEBUG/INFO/WARNING/ERROR/FATAL

为了更好的使用日志系统,需要清楚的知道每个日志级别的功能定位和特点。

默认输出标准:

终端:DEBUG(含DEBUG)级别以上日志会被实时输出到终端(标准输出)。

默认情况下,TRACE不打印到终端。

文件:INFO(含INFO)级别以上日志会被归档到日志文件。

默认情况下,TRACE和DEBUG均不记入日志文件。

TRACE

TACE的主要使用目的是在线调试。

该级别日志,默认情况下,既不打印到终端也不输出到文件。此时,对程序运行效率几乎不产生影响。

在程序运行过程中,如果需要查看TRACE级别日志,需要通过elog命令开启TRACE或者将程序日志输出级别降至TRACE。

.

DEBUG

DEUG的主要使用目的是终端查看和在线调试。

该级别日志,默认情况下会打印到终端输出,但是不会归档到日志文件。因此,一般用于开发者在程序当前启动窗口上,查看日志流水信息。

在程序启动命令行中加入 “-nostdout” ,将关闭所有前端打印输出(主要针对DEBUG级别日志)。

.

INFO

INFO的主要使用目的报告程序进度和转态信息。一般这种信息都是一过性的,不会大量反复输出。例如:连接商用库成功后,可以打印一条连库成功的信息,便于跟踪程序进展信息。

该级别日志,默认情况下会同时打印到终端和归档到日志文件(下同)。

.

WARNING

警告信息,表明程序处理中遇到非法数据或者某种可能的错误,该错误是一过性的、可恢复的,不会影响程序继续运行,程序仍处在正常状态。

.

ERROR

该错误发生后程序仍然可以运行,但是极有可能运行在某种非正常的状态下,导致无法完成全部既定的功能。

.

FATAL

致命的错误,表明程序遇到了致命的错误,必须马上终止运行。

日志输出注意事项

1.规范错误码

函数返回值:

函数返回值尽量作为错误码标识,不建议返回出参,如用于对象指针、记录条数等信息的输出。除带有是否判断意义的函数外,应采用int类型表示错误码,不建议采用bool类型。

正确情况:

返回码必须为0 值

错误情况:

返回码必须为 小于0 值,建议对于典型错误进行编码(而不是一律-1)。

对于错误情况,要记录相关日志。

.

2.如何选择日志级别

考虑因素:1)输出频率 2)严重级别

输出频率

对于高频输出的日志,一定要用log_trace,否则严重影响程序执行效率、日志文件很快就会被打满和覆盖。因此,For、while循环中的日志,一定要用log_trace()

严重级别

执行错误:必须采用log_warn()以上级别输出。

非执行错误信息: 如调试、追踪等日志信息,一定采用log_info以下级别打印,建议采用log_trace或者log_debug。

log_info只适用于输出频率不高的情况或者需要记录到日志文件中,便于问题追忆的需求。

.

3.哪些信息需要记日志

1)异常、错误信息

2)调试、追踪信息,具体包括:

函数入参:与其他模块交互的程序(接口函数),最好采用log_debug记录“输入参数”信息,便于问题分析。

执行步骤:对于关键功能函数,应该划分执行步骤,在每一步成功执行后,采用log_trace/log_debug记录,便于跟踪和掌控程序当前执行情况。

数据流:例如scada从fes接收到的采集数据相关信息。

.

4.日志信息应该包含哪些信息

对于错误、异常情况,应尽量记录尽可能多的“上下文环境”信息.

如果是函数调用失败,日志中必须包含返回值信息、以及函数调用的相关参数信息。

任何程序在返回错误码前,一定要通过日志记录具体的错误原因,并给出尽量多的场景信息。

.

举例:一条典型的失败的日志记录:

int retCode = obj.func(para1,para2);

if(retCode < 0)

{

log_error(“obj func error.”);

return retCode;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: