# logger 0.4.3 (2026-08-23)

Maintenance release:

* Update `log4r` migration vignette to reflect their new API

# logger 0.4.2 (2026-05-08)

Maintenance release:

* Added `appender_ntfy()` to use {ntfy} as an appender (#240, @jonocarroll)
* `normalizePath()` in the `log_call_location()` no longer triggers warning if the package source does not exist (#241, @maksymiuks)
* Fix failing unit test on CRAN

# logger 0.4.1 (2025-09-08)

New features and quality of life improvements:

* Support renaming meta fields (#217, @atusy)
* Added `log_elapsed()` to show cumulative elapsed running time (#221, @thomasp85)
* `log_errors()` gains a `traceback` argument that toggles whether the error traceback should be logged along with the message (fix #86 via #223, @thomasp85)
* File and line location of the log call is now available to the layouts (fix #110 via #224, @thomasp85)
* New `formatter_cli()` allows you to use the syntax from the cli package to create log messages (fix #210 via #225, @thomasp85)
* New `log_chunk_time()` helper function to automatically log the execution time of knitr code chunks (fix #222 via #227, @thomasp85)
* Allow user to overwrite the timestamp during logging if needed (fix #230, @thomasp85)

# logger 0.4.0 (2024-10-19)

A lot of internal code quality improvements and standardization,
improved documentations, modernized tests, performance speedups.

## New features

* logo 😻 (#196, @hadley)
* computing metadata lazily, so various expensive computations are only performed if you actually add them to the log (#105, @hadley)
* `log_appender()`, `log_layout()` and `log_formatter()` now check that you are calling them with a function, and return the previously set value (#170, @hadley)
* new function to return number of log indices (#194, @WurmPeter)
* `appender_async` is now using `mirai` instead of a custom background process and queue system (#214, @hadley @shikokuchuo)
* `layout_gha()` for providing native GitHub Action logging. This automatically gets used when running code in github actions (@thomasp85)

## Fixes

* `eval` scoping and lazy eval (#178, @hadley)

## Housekeeping

* update `pkgdown` site to Bootstrap 5 and related revamp, e.g. reference index and run/show examples (#159 #165 #193, @hadley)
* roxygen updated to use markdown, general cleanup (#160 #161 #191 #201, @hadley)
* testing improvements, e.g. move to `testthat` v3 and snapshots, syntactic sugar (#163 #167 #168 #169 #171 #192, @hadley)
* README tweaks (#162 #176, @hadley)
* modernize GitHub Actions (#171, @hadley)
* drop support for R versions below 4.0.0 (#177, @hadley)
* internal function tweaks (#181 #187 #197, @hadley)
* restyle sources (#185 #186 #191 #199, @daroczig and @hadley)

# logger 0.3.0 (2024-03-03)

Many unrelated small features, fixes and documentation updates collected over 2+ years.

## New features

* update `log_*` functions to invisibly return the formatted log message and record (#26, @r2evans)
* add `namespace` argument to `log_shiny_input_changes` (#93, @kpagacz)
* optionally suppress messages in `globalCallingHandlers` after being logged (#100, @DanChaltiel)
* `as.loglevel` helper to convert string/number to loglevel (requested by @tentacles-from-outer-space)
* new formatter function: `formatter_glue_safe` (#126, @terashim)
* support `OFF` log level (#138, @pawelru)
* override default `INFO` log level via env var (#145, requested by sellorm)

## Fixes

* handle zero-length messages in `formatter_glue_or_sprintf` (#74, @deeenes)
* generalize `log_separator` to work with all layout functions (#96, @Polkas)
* support log levels in `log_shiny_input_changes` (#103, @taekeharkema)
* fix fn name lookup/reference with nested calls (#120, reported by @averissimo)
* force the `file` argument of `appender_tee` (#124, reported by @dbontemps)
* don't allow stacking logger hooks on messages/warnings/errors (reported by @jkeuskamp)
* improve fragile test case when `Hmisc` loaded (#131, @r2evans)
* pass `index`, `namespace` etc from `log_` functions down to `log_level` (#143, @MichaelChirico)
* refer to the caller function in global message logger hooks (#146, reported by @gabesolomon10)

# logger 0.2.2 (2021-10-10)

Maintenance release:

* fix unbalanced code chunk delimiters in vignette (yihui/knitr#2057)

# logger 0.2.1 (2021-07-06)

Maintenance release:

* update `appender_slack` to use `slackr_msg` instead of `text_slackr`

# logger 0.2.0 (2021-03-03)

## Breaking changes

* `appender_console` writes to `stderr` by default instead of `stdout` (#28)

## Fixes

* default date format in `glue` layouts (#44, @burgikukac)
* `fn` reference in loggers will not to a Cartesian join on the log lines and message, but merge (and clean up) the `fn` even for large anonymous functions (#20)

## New features

* allow defining the log level threshold as a string (#13, @artemklevtsov)
* allow updating the log level threshold, formatter, layout and appender in all namespaces with a single call (#50)
* new argument to `appender_file` to optionally truncate before appending (#24, @eddelbuettel)
* new arguments to `appender_file` to optionally rotate the log files after appending (#42)
* new meta variables for logging in custom layouts: R version and calling package's version
* improved performance by not evaluating arguments when the log record does not meet the log level threshold (#27, @jozefhajnala)
* `logger` in now part of the Mikata Project: https://mikata.dev

## New helper functions

* `%except%`: evaluate an expression with fallback
* `log_separator`: logging with separator lines (#16)
* `log_tictoc`: tic-toc logging (#16, @nfultz)
* `log_failure`: log error before failing (#19, @amy17519)
* `log_messages`, `log_warnings`, `log_errors`: optionally auto-log messages, warnings and errors using `globalCallingHandlers` on R 4.0.0 and above, and injecting `logger` calls to `message`, `warnings` and `stop` below R 4.0.0
* `log_shiny_input_changes`: auto-log input changes in Shiny apps (#25)

## New formatter functions

* `layout_pander`: transform R objects into markdown before logging (#22)

## New layout functions

* `layout_blank`: blank log messages without any modification
* `layout_json_parser`: render the layout as a JSON blob after merging with requested meta fields

## New appender functions

* `appender_telegram`: deliver log records to Telegram (#14, @artemklevtsov)
* `appender_syslog`: deliver log records to syslog (#30, @atheriel)
* `appender_kinesis`: deliver log records to Amazon Kinesis (#35)
* `appender_async`: wrapper function for other appender functions to deliver log records in a background process asynchronously without blocking the master process (#35)

# logger 0.1 (2018-12-20)

Initial CRAN release after collecting feedback for a month on Twitter at `https://twitter.com/daroczig/status/1067461632677330944`:

* finalized design of a log request defined by

    * a log level `threshold`,
    * a `formatter` function preparing the log message,
    * a `layout` function rendering the actual log records and
    * an `appender` function delivering to the log destination

* detailed documentation with 7 vignettes and a lot of examples, even some benchmarks
* ~75% code coverage for unit tests
* 5 `formatter` functions mostly using `paste`, `sprintf` and `glue`
* 6 `layout` functions with convenient wrappers to let users define custom layouts via `glue` or `JSON`, including colorized output
* 5 `appender` functions delivering log records to the console, files, Pushbullet and Slack
* helper function to evaluate an expressions with auto-logging both the expression and its result
* helper function to temporarily update the log level threshold
* helper function to skip running the formatter function on a log message
* mostly backward compatibly with the `logging` and `futile.logger` packages
