knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) library(logger) log_appender(appender_stdout)
knitr::include_graphics("logger_structure.svg")
To make a successful log record, logger
requires the below components:
a log request, eg
r
log_error('Oops')
ERROR
in this caseformatter
functionthe environment and meta-information of the log request, eg actual timestamp, hostname of the computer, the name of the user running the R script, the pid of the R process, calling function and the actual call etc.
r
f <- function() get_logger_meta_variables(log_level = INFO)
f()
a logger definition to process the log request, including
log level threshold
, eg INFO
, which defines the minimum log level required for actual logging -- all log requests with lower log level will be thrown away
r
log_threshold()
ERROR <= INFO
log_error("Oops")
formatter
function, which takes R objects and converts those into actual log message(s) to be then passed to the layout
function for the log record rendering -- such as paste
, sprintf
, glue
or eg the below custom example:
r
formatter <- function(...) paste(..., collapse = " ", sep = " ")
formatter(1:3, c("foo", "bar"))
layout
function, which takes log message(s) and further information on the log request (such as timestamp, hostname, username, calling function etc) to render the actual log records eg human-readable text, JSON etc
```r library(jsonlite) layout <- function(level, msg) toJSON(level = level, timestamp = time, hostname = node, message = msg) layout(INFO, 'Happy Thursday!')
```
appender
function, which takes fully-rendered log record(s) and delivers to somewhere, eg stdout
, a file or a streaming service, eg
r
appender <- function(line) cat(line, "\n")
appender("INFO [now] I am a log message")
Putting all these together (by explicitly setting the default config in the global
namespace):
log_threshold(INFO) log_formatter(formatter_glue) log_layout(layout_simple) log_appender(appender_stdout) log_debug("I am a low level log message that will not be printed with a high log level threshold") log_warn("I am a higher level log message that is very likely to be printed")
Note, that all logger
definitions and requests are tied to a logging namespace, and one log request might trigger multiple logger
definitions as well (stacking). Find more information on these in the Customizing the format and destination of log records vignette.
logger:::namespaces_reset()
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.