关闭

写程序时如何使用日志

标签: 编程
2518人阅读 评论(0) 收藏 举报
分类:

本文来自于朋友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;
}

4
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:934244次
    • 积分:10558
    • 等级:
    • 排名:第1546名
    • 原创:185篇
    • 转载:126篇
    • 译文:3篇
    • 评论:165条
    博客专栏
    最新评论