初始化log_errors()时在r-markdown中使用记录器包时出现问题



我创建了一个函数来使用logger包初始化日志记录,并将日志条目保存在R.给定的tempdir((中的临时文件中

init_logger <- function() {
library(logger)
temporary_directory <- tempdir()
date_time_current <- format(Sys.time(), "log_%Y_%m_%d_%H_%M_%S_")
tmp <- tempfile(pattern = date_time_current, tmpdir = temporary_directory, fileext = '.txt')
configuration_logger(tmp)
log_info('Logging starting:')
return(tmp)
}
configuration_logger <- function(tmp){
log_appender(appender_file(tmp))
log_threshold(TRACE)
log_formatter(formatter_paste)
log_layout(layout_simple)
log_errors()
}

上面的函数初始化日志,我在另一个函数mypackage::get_data(client, dimensions, metrics, start_date, end_date, ...)中调用这个mypackage::init_logger(),我想在其中捕获某些信息以及可能发生的任何错误,因此log_errors()对于在出现任何错误时进行调试至关重要。如果这个函数是在一个常规的R-脚本中,那么一切都很好,但它在R-标记中的工作方式不同。

如果我强行在降价中出错:

```{r}
library(mypackage)
library(magrittr)
```
```{r}
clients <- "client_x"
end_date <- Sys.Date() - 1
# FORCING ERROR HERE... 
start_date <- "not_defined"
#start_date <- Sys.Date() - 30
```
```{r}
new_data <- get_data(client = clients, 
start_date = start_date,
end_date = end_date,
dimension, metrics, ...)
```

在这种情况下,我在控制台中得到以下错误,并且没有生成日志文件。

Error in globalCallingHandlers(error = function(m) { : 
should not be called with handlers on the stack

现在,如果我有相同的代码行,但只是在一个常规的.R脚本文件中,则会生成实际的日志文件,并且我所期望的错误也会记录在创建的日志文件中。

INFO [2022-07-26 11:26:51] Logging starting:
INFO [2022-07-26 11:26:52] Starting Function: -get_data()-. File: -data.R-
ERROR [2022-07-26 11:26:59] nanodbc/nanodbc.cpp...

我确信这个问题的原因是在init_logger()中使用的函数configuration_logger()中调用log_errors()。我尝试删除这行代码,日志文件在中生成。调用相同函数时使用Rmdrmarkdown和.R脚本,但发生的任何错误都不会记录在日志文件中,而是直接打印在控制台中。

任何人都知道为什么只有在log_errors()初始化时才会在r-markdowns中发生这种情况,以及是否有可能的解决方案,因为我想在创建的日志文件中记录我的函数中可能发生的任何错误。

这是一个已知的问题,"R markdown和logger都试图使用相同的globalCallingHandlers——这是不受支持的">

记录器问题104

记录器问题70

目前还没有解决方案,但我希望这能为将来遇到类似问题的人节省一些调试时间。

最新更新