Plumber日志记录自定义变量问题:registerHooks无法识别全局变量
解决Plumber请求日志中添加自定义变量的问题
直接在过滤器中将req_user和req_tenant挂载到当前请求的req对象上,而非使用全局变量,这样后续的钩子就能直接从req中读取这些值,同时避免多请求并发时的变量覆盖问题。
修改后的代码如下:
# Enable CORS Filtering #' @filter auth_filter auth_filter <- function(req, res) { # 将用户和租户信息直接附加到req对象 req$user <- req$HEADERS['authorization'] %>% as.character() req$tenant <- req$HTTP_TENANT # 必须返回req和res,否则请求会被过滤器中断 plumber::forward() } pr$registerHooks( list( preroute = function() { # Start timer for log info tictoc::tic() }, postroute = function(req, res) { end <- tictoc::toc(quiet = TRUE) # 直接从req对象中读取自定义字段 log_info('{convert_empty(req$user)} {convert_empty(req$tenant)} {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))}') } ) )
关键说明:
- 过滤器中必须调用
plumber::forward()(或显式return(list(req, res))),否则请求会被拦截,无法进入后续处理流程。 - 每个请求的
req是独立实例,把自定义变量绑定到req上,既不会出现多请求间的变量污染,也能让钩子函数直接访问这些属性。 - 这是Plumber处理请求上下文的标准方式,完全不需要依赖全局变量。
内容的提问来源于stack exchange,提问作者fifthace
相关产品推荐
相关产品推荐

