Logging each request to a separate json file with RestRserve

177 Views Asked by At

How would one set up logging each request to a different json file with RestRserve?

I tried using the lgr package (referred to in RestRserve's doc on logging) like so:

library(RestRserve)
library(lgr)

app = Application$new(content_type = "text/plain")

# RestRserve logger
app$logger = RestRserve::Logger$new(level = "trace", name = "mylogger",
  printer=function(timestamp, level, logger_name, pid, message, ...)
  {
    lgr$log(level=tolower(level), msg=message, ...)
  }
)

# JSON appender in lgr
tf <- tempfile(tmpdir="D:/temp", fileext=".log")
lgr$add_appender(AppenderJson$new(tf), name = "json")

# Endpoint
app$add_get("/sqrt", function(request, response) {
  on.exit({
    # Next log file
    tf <- tempfile(tmpdir="D:/temp", fileext=".log")
    lgr$appenders$json$set_file(tf)
  })
  app$logger$info(msg="", context=list(request_id = request$id, message="Process start"))
  response$body = sqrt(x)
  app$logger$info(msg="", context=list(request_id = request$id, message="Process end"))
})

# Submit request
request = Request$new(path = "/sqrt", method = "GET", parameters_query = list(x = "10"))
response = app$process_request(request)

But this splits up a request's log info across two files. I'm also quite sure it wouldn't work for simultaneous requests.

1

There are 1 best solutions below

0
On BEST ANSWER

I believe you even don't need any special logger - just use writeLines. Also you can rely on req$id to name files since it is unique.

library(RestRserve)

req = Request$new()
res = Response$new()

fl = file.path(tempdir(), paste0(req$id, ".log"))
con = file(fl, open = "at")
writeLines("Process start", con)
res$set_body(sqrt(10))
writeLines("Process end", con)
close(con)

readLines(fl)
unlink(fl)