日志格式规范

日志格式规范版权声明 本文为博主原创文章 未经博主允许不得转载

大家好,欢迎来到IT知识分享网。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lk/article/details/
 <div class="markdown_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg> <p></p><h1 id="1-简介"><a name="t0"></a>1 简介</h1><p></p> 

在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方。写好程序的日志可以帮助我们大大减轻后期维护压力。在实际的工作中,开发人员往往迫于巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。开发人员应在一开始就养成良好的日志撰写习惯,并且应在实际的开发工作中为写日志预留足够的时间。


1.1 日志的作用

1.2 撰写日志的要求

1.2.1 日志的可读性

1.2.2 日志的性能

1.2.3 占用磁盘空间

1.2.4 日志的时效性

// 定义FATAL级别输出宏 #define DRV_LOG_FATAL(fmt, ...) hlog_format(HLOG_LEVEL_FATAL, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__) // 定义ERROR级别输出宏 #define DRV_LOG_ERROR(fmt, ...) hlog_format(HLOG_LEVEL_ERROR, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__) // 定义WARN级别输出宏 #define DRV_LOG_WARN(fmt, ...) hlog_format(HLOG_LEVEL_WARN, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__) // 定义INFO级别输出宏 #define DRV_LOG_INFO(fmt, ...) hlog_format(HLOG_LEVEL_INFO, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__) // 定义DEBUG级别输出宏 #define DRV_LOG_DEBUG(fmt, ...) hlog_format(HLOG_LEVEL_DEBUG, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__) // 定义TRACE级别输出宏 #define DRV_LOG_TRACE(fmt, ...) hlog_format(HLOG_LEVEL_TRACE, "PluginDriver", "[%s(%d)] "fmt, __FUNCTION__, __LINE__, __VA_ARGS__)  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

1.2.6 日志内容

1.2.7 日志格式

常见的日志格式中对于每一条日志应含有的信息包括日期、时间、日志级别、代码位置、日志内容、错误码等信息。下面是一个工作中的日志文件的一部分内容:

2018-05-22 15:35:53.850 TRACE TDWZLog [0x00001b10] <36> <TDWZProtocol::Init>,TDWZProtocol::Init 2018-05-22 15:35:53.850 TRACE TDWZLog [0x00001b10] <89> <TDWZProtocol::Init>,End in processing TDWZProtocol::Init 2018-05-22 15:35:53.853 TRACE TDWZLog [0x00001b10] <142> <TDWZProtocol::Connect>,Connect Execute finish 2018-05-22 15:35:53.853 TRACE TDWZLog [0x00002f10] <149> <GetAlarmEventPro>,Enter GetAlarmEventPro func 2018-05-22 15:39:36.382 WARN TrackLog [0x000029fc] - [ internal WARN htrace_server_convert_msgstring_to_contextintls(493) ] detect input id error, trace_id span_id,this chain may not be tracked. 2018-05-22 15:39:36.383 WARN TrackLog [0x000029fc] - [ internal WARN htrace_server_receive(195) ] can not detect trace_id in context, this chain may not be tracked. 2018-05-22 15:39:36.383 TRACE TDWZLog [0x000029fc] <231> <TDWZProtocol::DisConnect>,TDWZProtocol::DisConnect 2018-05-22 15:39:37.502 TRACE TDWZLog [0x00002f10] <225> <GetAlarmEventPro>,End Get AlarmEventPro Func 2018-05-22 15:39:37.503 TRACE TDWZLog [0x000029fc] <241> <TDWZProtocol::DisConnect>,close socket 2018-05-22 15:39:37.503 TRACE TDWZLog [0x000029fc] <242> <TDWZProtocol::DisConnect>,Execute DisConnect function succeed. 
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
可以从该文件中看出一般日志文件中应该含有的信息。  
   
  • 1

2 日志级别和含义

2.1 Log4j的组成

2.1.1 Logger

2.1.2 Appenders

2.1.3 Layout

2.2 日志级别

2.2.1 TRACE

2.2.2 DEBUG

2.2.3 INFO

2.2.4 WARN

2.2.5 ERROR

2.2.6 FATAL

2.3 日志级别大小关系

日志级别就像开关一样,来决定哪些日志方法被调用,哪些不被调用。在log4j中,日志级别的关系如下所示:


ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF  
     
  • 1

设置了对应的级别之后,日志框架就只调用大于等于这个级别的方法。Log4j建议只使用如下的四个界别

DEBUG<INFO<WARN<ERROR  
      
  • 1

3 日志规范示例

模仿,抄写是比较好的学习方式,借鉴前人撰写日志的良好风格以形成自己的风格是不错的方式。下面是一些不错的日志记录。

3.1 TRACE日志记录示例

DRV_LOG_TRACE("Connect Execute start"); DRV_LOG_TRACE("Connect Execute finish"); DRV_LOG_TRACE("DisConnect func"); DRV_LOG_TRACE("Execute DisConnect function succeed."); DRV_LOG_TRACE("Enter UploadEvent Func"); DRV_LOG_TRACE("extInfo = %s", Extension); DRV_LOG_TRACE("Send a Msg "); DRV_LOG_TRACE("- Connect Execute start"); DRV_LOG_TRACE("- Connect Execute finish"); DRV_LOG_TRACE("- Enter GetAlarmEventPro func"); DRV_LOG_TRACE("- Receive an info"); DRV_LOG_TRACE("- End Get AlarmEventPro Func"); DRV_LOG_TRACE("- DisConnect func"); DRV_LOG_TRACE("- Execute DisConnect function succeed."); DRV_LOG_TRACE("- Enter UploadEvent Func"); DRV_LOG_TRACE("- Leave UploadEvent Func"); DRV_LOG_TRACE("- ============电网报警触发"); DRV_LOG_TRACE("- ============开始发送电流电压值"); DRV_LOG_TRACE("- ============间隔超过分钟再次发送电流电压值"); 
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.2 INFO日志记录示例

DRV_LOG_INFO("- UpdataEvent nchal= %d,EventID = %d.",iChannelNo,nEventType); DRV_LOG_INFO("- do not support doControl"); DRV_LOG_INFO("- channelId = %s, nStatusType = %d", channelId.c_str(), nStatusType); 
      
  • 1
  • 2
  • 3

3.3 DEBUG日志记录示例

DRV_LOG_DEBUG("- 输出报警情况:电网编号:%d,报警数量:%d,报警内容:%s.",datas.data1.chn,datas.data1.alarm_num,datas.data1.alarms); DRV_LOG_DEBUG("- 输出报警情况:电网编号:%d,报警数量:%d,报警内容:%s.",datas.data2.chn,datas.data2.alarm_num,datas.data2.alarms); DRV_LOG_DEBUG("- 输出报警情况:电网编号:%d,报警数量:%d,报警内容:%s.",datas.data3.chn,datas.data3.alarm_num,datas.data3.alarms); DRV_LOG_DEBUG("- 输出报警情况:电网编号:%d,报警数量:%d,报警内容:%s.",datas.data4.chn,datas.data4.alarm_num,datas.data4.alarms); DRV_LOG_DEBUG("- ============datas.data1.huab = %d",datas.data1.huab); DRV_LOG_DEBUG("- ============datas.data1.hiab = %d",datas.data1.hiab); DRV_LOG_DEBUG("- ============datas.data2.huab = %d",datas.data2.huab); DRV_LOG_DEBUG("- ============datas.data2.hiab = %d",datas.data2.hiab); DRV_LOG_DEBUG("- ============datas.data3.huab = %d",datas.data3.huab); DRV_LOG_DEBUG("- ============datas.data3.hiab = %d",datas.data3.hiab); DRV_LOG_DEBUG("- ============datas.data4.huab = %d",datas.data4.huab); DRV_LOG_DEBUG("- ============datas.data4.hiab = %d",datas.data4.hiab); DRV_LOG_DEBUG("- Alarm is : %s",szEvent.c_str()); DRV_LOG_DEBUG("- GetChannelExtInfo channelId=%s", channelId.c_str()); DRV_LOG_DEBUG("- nChan = %d, szInfo = %s", nChan, szInfo); 
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.4 WARN日志记录示例

DRV_LOG_WARN("[0x%08x] - invaild event msg,discard it", DRV_INVALID_ARG); DRV_LOG_WARN("[0x%08x] - Can't find channel by channelId"); DRV_LOG_WARN("[0x%08x] - [DWSdk.errorcode=0x%08x]Connect device failed", DRV_CONNECT_FAILED, sdkErrCode); DRV_LOG_WARN("[0x%08x] - [DWSdk.errorcode=0x%08x]dw_start_receive failed", DRV_ERROR, sdkErrCode); DRV_LOG_WARN("[0x%08x] - [DWSdk.errorcode=0x%08x]Communicate failed, socket recv error", DRV_ERROR, DW_SOCKET_RECV_ERROR); DRV_LOG_WARN("[0x%08x] - [DWSdk.errorcode=0x%08x>other error", DRV_ERROR, iGetResult); DRV_LOG_WARN("[0x%08x] - [DWSdk.errorcode=0x%08x>other error", DRV_ERROR, iGetResult); DRV_LOG_WARN("[0x%08x] - SetEventCallBack should be called first", DRV_ERROR); 
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.5 ERROR日志记录示例

DRV_LOG_ERROR("Init DwSDK filded;<errCode=%d>", initRet); DRV_LOG_ERROR("Connect device failed"); DRV_LOG_ERROR("Create thread failed"); DRV_LOG_ERROR("dw_start_receive failed"); DRV_LOG_ERROR("Communicate failed, socket recv error"); DRV_LOG_ERROR("other error<errCode=%d>", iGetResult); DRV_LOG_ERROR("SetEventCallBack should be called first"); DRV_LOG_ERROR("[0x%08x] - [DWSdk.errorcode=0x%08x]Init DwSDK filded", DRV_INIT_FAILED, initRet); DRV_LOG_ERROR("- [HPR.errorcode=0x%08x]Create thread failed", HPR_GetLastError()); 
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
"0x%08x" 
      
  • 1
printf("0x%08x", 0x1234); 
      
  • 1

会输出0x00001234。

https://www.cnblogs.com/sentakee/p/5630466.html




免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/139081.html

(0)
上一篇 2025-06-08 18:20
下一篇 2025-05-07 12:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信