在每个函数中返回 自定义的 *exerror.Error 类型变量。
此 err 变量中包含错误的上下文信息,如 userId, zerror 和 funcName@fileName.go:108 这样的 zcallstack
在调用函数时,如果返回非 nil 的 err,就能打印日志,日志中包含所有上下文信息。
实际业务中在不同代码中调用相同函数,可能出现同样错误,都返回了 err,这时能根据要求灵活决定是否打印出日志。
日志打印格式推荐“结构化日志信息”,比如`level=info msg="Recv RestRequest"` ,主要优点是,方便使用 grep awk 等工具过滤日志,详情参考[logrus](
https://github.com/sirupsen/logrus)
另外每行日志中增加一个`ReqId`,此 ID 全局唯一,用于关联同一会议的 ID
```log
cat log/server.log | grep ExtHwyApi_QLlUyYd9To
time="2018-05-24T09:42:02+08:00" level=info msg="Recv RestRequest" ReqHeader=map[Date:[2018-03-29T09:32:35+08:00] Accept:[application/json]] ReqId="ExtHwyApi_QLlUyYd9To" Url="/ext/api/product"
time="2018-05-24T09:42:02+08:00" level=warning msg="AuthTimeOut Disable" AuthTimeOutSeconds=0 ReqId="ExtHwyApi_QLlUyYd9To"
time="2018-05-24T09:42:03+08:00" level=error msg="RestDispatch Fail" ReqBody="{"seq":"ExtHwyApi_QLlUyYd9To","var":1}}" ReqId="ExtHwyApi_QLlUyYd9To" ResBody="{"Code":"812018","Msg":"发送失败"}" Tag="out_ccm" zcallstack="SendJsonReq@func.go:43 Handler@ext_hwy_api.go:44" zerror="dial tcp 127.0.0.1:5010: connectex: No connection could be made because the target machine actively refused it."
```