To make a successful log record, logger
requires the
below components:
a log request, eg
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.
f <- function() get_logger_meta_variables(log_level = INFO)
f()
#> $ns
#> [1] NA
#>
#> $ans
#> [1] "global"
#>
#> $topenv
#> [1] "R_GlobalEnv"
#>
#> $fn
#> [1] "f"
#>
#> $call
#> [1] "f()"
#>
#> $time
#> [1] "2024-03-05 15:10:43 CET"
#>
#> $levelr
#> Log level: INFO
#>
#> $level
#> [1] "INFO"
#>
#> $pid
#> [1] 157305
#>
#> $r_version
#> [1] "4.3.2"
#>
#> $ns_pkg_version
#> [1] NA
#>
#> $node
#> [1] "nevermind"
#>
#> $arch
#> [1] "x86_64"
#>
#> $os_name
#> [1] "Linux"
#>
#> $os_release
#> [1] "6.7.6-arch1-1"
#>
#> $os_version
#> [1] "#1 SMP PREEMPT_DYNAMIC Fri, 23 Feb 2024 16:31:48 +0000"
#>
#> $user
#> [1] "daroczig"
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
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:
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
appender
function, which takes fully-rendered log
record(s) and delivers to somewhere, eg stdout
, a file or a
streaming service, eg
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_console)
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.