我正在try 将R Plumber测试API部署为停靠容器,因为我的主要目标是在每次API处理请求时成功创建一个日志(log)文件.我在当地测试了它,它很管用.
以下是我的测试文件:
利伯.R
# 利伯.R
# A simple API to illustrate logging with Plumber
library(plumber)
#* @apiTitle Logging Example
#* @apiDescription Simple example API for implementing logging with Plumber
#* Echo back the input
#* @param msg The message to echo
#* @get /echo
function(msg = "") {
list(msg = paste0("The message is: '", msg, "'"))
}
Entrypoint.R
library(plumber)
# Config
#config <- config::get()
# logging
library(logger)
# Ensure glue is a specific dependency so it's avaible for logger
library(glue)
# Specify how logs are written
log_dir <- "/app/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
}
}
pr <- plumb("利伯.R")
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
# TODO: Sanitize log details - perhaps in convert_empty
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))}')
}
)
)
pr
文档文件
# Base image https://hub.docker.com/u/rocker/
FROM rstudio/plumber
# Install R libraries
RUN R -e "install.packages(c('odbc','glue','parsedate','tibble','dplyr','httr','RCurl','jsonlite','rjson','stringr','telegram','R.utils','logger','tictoc'))"
# Run plumber package
CMD ["/app/利伯.R"]
我的预期结果是能够将日志(log)存储在容器和主机之间的共享文件夹中.但到目前为止,我甚至还不能让水管工应用程序创建一个日志(log)文件,其中的日志(log)位于/app/Logs中.
docker build -t logger2 .
docker run -d -p 18001:8000 --rm \
-v /home/user/R/projects/logger2/:/app \
-v /tmp/log1:/app/logs \
logger2