r - 在 R Plumber Api 中添加日志
问题描述
我正在使用R
和创建一些 API Plumber
。我这样entrypoint.R
配置
library(plumber)
library(logger)
# Create Log directory
log_dir <- "/api/logs"
if (!fs::dir_exists(log_dir)) fs::dir_create(log_dir)
log_appender(appender_tee(tempfile("plumber_", log_dir, ".log")))
convert_empty <- function(string) {
if (string == "") {
"-"
} else {
string
}
}
# Initiate
# pr <- plumber::plumb(here::here('plumber.R')) # local test
pr <- plumber::plumb(rev(commandArgs())[1]) # via Docker
args <- list(host = '0.0.0.0', port = 8000)
if (packageVersion('plumber') >= '1.0.0') { pr$setDocs(TRUE) } else { args$swagger <- TRUE }
# Create log hook
pr$registerHooks(
list(
preroute = function() {
# Start timer for log info
tictoc::tic()
},
postroute = function(req, res) {
end <- tictoc::toc(quiet = TRUE)
# Log details about the request and the response
# 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))}')
log_info('{convert_empty(req$REMOTE_ADDR)}')
}
)
)
# Run entrypoint
do.call(pr$run, args)
我不能有完整的日志,因为这条线
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))}')
创建一个错误,应用程序停止工作。
此外,我想在 API 中添加我的自定义日志以跟踪流以进行调试。例如在 api
#* Ping
#* @get /ping
function() {
rtn <- jsonlite::unbox(data.frame(Status = TRUE))
return(rtn)
}
我想添加我的日志,这样我就可以检查正在调用哪些函数以及它们中发生了什么。
解决方案
我找到了一个名为Log4R的库,它允许我从我的函数中添加日志并将它们保存在一个文件中。同样的例子在这里。
安装包
install.packages("log4r")
使用包
logger <- logger()
info(logger, "Located nearest gas station.")
#> INFO [2019-09-04 16:31:04] Located nearest gas station.
warn(logger, "Ez-Gas sensor network is not available.")
#> WARN [2019-09-04 16:31:04] Ez-Gas sensor network is not available.
debug(logger, "Debug messages are suppressed by default.")
推荐阅读
- python - 表名是 SQL Server 中的关键字
- node.js - 无法从flutter接收数据到nodejs
- android - 没有完整的项目清理,不会应用 XML 布局更改
- r - 使用 ggplot2 (或等效)在 R 中的相同 x 轴上绘制两个数据集
- c - 无法在 C 中创建和显示链表
- kotlin - 如何在 Kotlin 中实现抽象类
- c - CP/M 获取运行程序名
- ios - Cocoapods 无法与远程 Artifactory 存储库一起使用
- android - MyFragment 开始新的意图,然后如果它关闭,它意图到 MyFragment
- swift - 使 @MainActor 类或演员符合 Codable