Skip to content
This repository has been archived by the owner on Aug 17, 2024. It is now read-only.

FedericoCeratto/nim-morelogging

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Morelogging

A set of logging utilities for Nim.

badge tags License

Features:
  • ✓ File rotation

  • ✓ Compression

  • ✓ Templated log file name

  • ✓ Templated log messages

  • ✓ Threaded log buffering

  • ✓ Async log buffering

  • ✓ Logging, file rotation and compression do not block the caller

  • ✓ Sensible defaults: log to "<appname>.<date>.log", daily log rotation

  • ✓ Log to systemd Journald. Support structured entries.

  • ✓ Support Linux, OSX, Windows

  • ✓ Functional-tested

Roadmap:
  • ❏ Logging hierarchy

  • ❏ Do not crash the application on write failure (e.g. broken or full disk, permission errors) - switch to logging to stderr

  • ❏ Rotate logfile on SIGHUP signal

  • ❏ Structured logging and optional fields

Installation
$ # install Nim using APT or from the upstream website
$ sudo apt-get install nim
$ # install nimble and then:
$ nimble install morelogging
Usage
import morelogging

let log = newAsyncFileLogger()
log.debug("debug")
log.info("info")
log.warn("warn")
log.error("error")
log.fatal("fatal")

Log message formatting

The following formatters are supported:

$date
$time
$datetime
$app
$appdir
$appname
$levelid
$levelname

Messages with level below level_threshold are ignored.

Async and threaded loggers

If buffer_size is positive, messages are buffered internally up to writeout_interval_ms

Messages with level >= flush_threshold are flushed out immediately.

proc newAsyncFileLogger*(
    filename_tpl = "$app.$y$MM$dd.log",
    flush_threshold = lvlError,
    fmtStr = "$datetime $levelname ",
    level_threshold = lvlAll,
    mode: FileMode = fmAppend,
    writeout_interval_ms = 100,
    buffer_size = 1_048_576
  ): AsyncFileLogger =

proc newThreadFileLogger*(
    filename_tpl = "$app.$y$MM$dd.log",
    fmtStr = "$datetime $levelname ",
    level_threshold = lvlAll,
    mode: FileMode = fmAppend,
    writeout_interval_ms = 100,
  ): ThreadFileLogger =

proc newThreadRotatingFileLogger*(
    compress = false,
    filename_tpl = "$app.$y$MM$dd.log",
    fmtStr = "$datetime $levelname ",
    level_threshold = lvlAll,
    mode: FileMode = fmAppend,
    rotate_interval = "1d",
    writeout_interval_ms = 100,
  ): ThreadRotatingFileLogger