R Plumber API日志配置报错修复及自定义日志添加问题咨询
Plumber API日志问题解决方案
1. 完整请求日志行报错修复
报错原因
- 原
convert_empty函数仅处理空字符串场景,当请求缺失指定请求头时,req对象对应字段返回NULL,NULL == ""会产生长度为0的逻辑值,触发if条件判断异常 - 未处理请求头中的特殊字符,可能引发glue插值语法报错
修复代码
首先替换convert_empty函数:
convert_empty <- function(string) { # 兼容处理NULL、NA、空字符串三种空值场景 if (is.null(string) || is.na(string) || string == "") { return("-") } # 转义双引号避免日志格式冲突 gsub('"', '\\"', string) }
然后取消原注释的日志行即可正常运行:
log_info('{convert_empty(req$REMOTE_ADDR)} "{convert_empty(req$HTTP_USER_AGENT)}" {convert_empty(req$HTTP_HOST)} {convert_empty(req$REQUEST_METHOD)} {convert_empty(req$PATH_INFO)} {convert_empty(res$status)} {round(end$toc - end$tic, digits = getOption("digits", 5))}')
2. 接口内部自定义日志埋点方案
entrypoint文件已经全局配置了logger的输出路径和追加规则,直接在接口内调用logger包的日志函数即可,推荐增加请求ID实现全链路追踪:
步骤1:新增请求ID生成逻辑
修改preroute钩子,为每个请求生成唯一标识:
preroute = function(req) { # 生成16位随机请求ID req$request_id <- paste0(sample(c(letters, 0:9), 16, replace = TRUE), collapse = "") tictoc::tic() }
步骤2:接口内添加日志埋点
接口函数声明req、res参数获取请求上下文,按需添加日志:
#* Ping #* @get /ping function(req, res) { # 记录接口启动信息 log_info('请求ID[{req$request_id}] 开始执行/ping接口') # 业务逻辑执行中可添加调试日志 log_debug('请求ID[{req$request_id}] 无入参校验,开始构造返回值') rtn <- jsonlite::unbox(data.frame(Status = TRUE)) # 记录执行完成结果 log_info('请求ID[{req$request_id}] /ping接口执行完成,返回状态{res$status}') return(rtn) }
可选配置
调试阶段可在entrypoint中调整日志等级输出更多细节:
# 输出DEBUG及以上等级日志,生产环境可改为INFO/WARNING log_threshold(DEBUG)
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

