Following the suggestion for this question: How do I save warnings and errors as output from a function?.
Now I can capture the message, warning, error using tryCatch and store the log type and time in a list.
factory <- function(fun) {
function(...) {
warn <- err <- msg <- NULL
res <- withCallingHandlers(
tryCatch(fun(...), error=function(e) {
new_e <- err
new_e[[length(new_e) + 1]] <- list(time = Sys.time(),
type = "error",
log = conditionMessage(e))
err <<- new_e
NULL
}), warning=function(w) {
new_w <- warn
new_w[[length(new_w) + 1]] <- list(time = Sys.time(),
type = "warning",
log = conditionMessage(w))
warn <<- new_w
invokeRestart("muffleWarning")
}, message = function(m) {
new_w <- msg
new_w[[length(new_w) + 1]] <- list(time = Sys.time(),
type = "message",
log = conditionMessage(m))
msg <<- new_w
invokeRestart("muffleMessage")
})
list(res, warn=warn, err=err, msg=msg)
}
}
test <- function(){
print("AAAAAAA")
message("BBBBBB")
print("CCCC")
warning("DDDDDDDDDDD")
Sys.sleep(1)
warning("EEEEEEEEEEEEEEE")
#stop("FFFFFFFFFFFFF")
warning("GGGGGGGGGGGGGG")
return(NULL)
}
a <- factory(test)()
The results are shown below
> a
[[1]]
NULL
$warn
$warn[[1]]
$warn[[1]]$`time`
[1] "2019-10-21 22:02:39 AEST"
$warn[[1]]$type
[1] "warning"
$warn[[1]]$log
[1] "DDDDDDDDDDD"
$warn[[2]]
$warn[[2]]$`time`
[1] "2019-10-21 22:02:40 AEST"
$warn[[2]]$type
[1] "warning"
$warn[[2]]$log
[1] "EEEEEEEEEEEEEEE"
$warn[[3]]
$warn[[3]]$`time`
[1] "2019-10-21 22:02:40 AEST"
$warn[[3]]$type
[1] "warning"
$warn[[3]]$log
[1] "GGGGGGGGGGGGGG"
$err
NULL
$msg
$msg[[1]]
$msg[[1]]$`time`
[1] "2019-10-21 22:02:39 AEST"
$msg[[1]]$type
[1] "message"
$msg[[1]]$log
[1] "BBBBBB\n"
In the next step, I can use httr function to call RESTAPI to store the logs in the database. Alternatively, the message can be directly stored into database when the messages are generated through updating the factory function.
The only problem is the function cannot capture print
and cat
. However, this question Why is message() a better choice than print() in R for writing a package? suggestion message
function is better than print
and cat
functions. It might be not a big issue for current stage.