A logger consists of a log level threshold, a log message formatter function, a log record layout formatting function and the appender function deciding on the destination of the log record. For more details, see the package README.md.

logger(threshold, formatter, layout, appender)



omit log messages below this log_levels


function pre-processing the message of the log record when it's not wrapped in a skip_formatter call


function rendering the layout of the actual log record


function writing the log record


A function taking the log level to compare with the set threshold, all the ... arguments passed to the formatter function, besides the standard namespace, .logcall, .topcall and .topenv arguments (see log_level for more details). The function invisibly returns a list including the original level, namespace, all ... transformed to a list as params, the log message (after calling the formatter function) and the log record (after calling the layout function), and a list of handlers with the formatter, layout and appender functions.


By default, a general logger definition is created when loading the logger package, that uses

  1. INFO (or as per the LOGGER_LOG_LEVEL environment variable override) as the log level threshold

  2. layout_simple as the layout function showing the log level, timestamp and log message

  3. formatter_glue (or formatter_sprintf if glue is not installed) as the default formatter function transforming the R objects to be logged to a character vector

  4. appender_console as the default log record destination


It's quite unlikely that you need to call this function directly, but instead set the logger parameters and functions at log_threshold, log_formatter, log_layout and log_appender and then call log_levels and its derivatives, such as log_info directly.


For more details, see the Anatomy of a Log Request vignette at https://daroczig.github.io/logger/articles/anatomy.html.


if (FALSE) {
do.call(logger, logger:::namespaces$global[[1]])(INFO, 42)
do.call(logger, logger:::namespaces$global[[1]])(INFO, '{pi}')
x <- 42
do.call(logger, logger:::namespaces$global[[1]])(INFO, '{x}^2 = {x^2}')