Mojo::Log(3)

πŸ’– Mojo::Log πŸ’–

okay so bestie, welcome to Mojo::Log(3) β€” yes that's the manual page name, and yes it's from the User Contributed Perl Documentation pile, and no you don't have to be scared of it. this is literally the simplest logger in the Mojo universe and we're gonna get through it together. grab a matcha. πŸ“


✨ NAME ✨

Mojo::Log β€” a Simple logger. that's the whole pitch. that's it. simple. logger. slay. πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

here's the vibe in code form, copy-paste ready:

  use Mojo::Log;

  # Log to STDERR
  my $log = Mojo::Log->new;

  # Customize log file location and minimum log level
  my $log = Mojo::Log->new(path => '/var/log/mojo.log', level => 'warn');

  # Log messages
  $log->trace('Doing stuff');
  $log->debug('Not sure what is happening here');
  $log->info('FYI: it happened again');
  $log->warn('This might be a problem');
  $log->error('Garden variety error');
  $log->fatal('Boom');

look at that range. from "doing stuff" all the way to "Boom". character development. 😭


πŸ¦‹ DESCRIPTION πŸ¦‹

Mojo::Log is a simple logger for Mojo projects. periodt. that's the description. it logs. it's simple. it's a Mojo project thing. iykyk. ✨


🌈 EVENTS 🌈

Mojo::Log inherits all events from Mojo::EventEmitter (all of them, no gatekeeping) and can emit this new one:

🌸 message 🌸

  $log->on(message => sub ($log, $level, @lines) {...});

Emitted when a new message gets logged. that's the moment. main character energy. πŸ‘‘

  $log->on(message => sub ($log, $level, @lines) { say "$level: ", @lines });

πŸ’œ ATTRIBUTES πŸ’œ

Mojo::Log implements the following attributes. get comfy, there's a few. 🫢

πŸ’– color πŸ’–

  my $bool = $log->color;
  $log     = $log->color($bool);

Colorize log messages with the levels warn, error and fatal using Term::ANSIColor. defaults to the value of the MOJO_LOG_COLOR environment variables. yes bestie, your warnings can be pretty. 🌈

πŸ’– format πŸ’–

  my $cb = $log->format;
  $log   = $log->format(sub {...});

A callback for formatting log messages. you get to decide what they look like. icon behavior.

  $log->format(sub ($time, $level, @lines) { "[2018-11-08 14:20:13.77168] [28320] [info] I β™₯ Mojolicious\n" });

(note the β™₯, we love a legend.)

πŸ’– handle πŸ’–

  my $handle = $log->handle;
  $log       = $log->handle(IO::Handle->new);

Log filehandle used by default message event, defaults to opening path or STDERR. so if you don't say anything, it's either going to your file or straight to STDERR. no cap. πŸ’€

πŸ’– history πŸ’–

  my $history = $log->history;
  $log        = $log->history([[time, 'debug', 'That went wrong']]);

The last few logged messages. the receipts. the paper trail. 🧚

πŸ’– level πŸ’–

  my $level = $log->level;
  $log      = $log->level('debug');

Active log level, defaults to trace. Available log levels are trace, debug, info, warn, error and fatal, in that order. that order matters, bestie β€” it's a ladder. πŸͺœ

πŸ’– max_history_size πŸ’–

  my $size = $log->max_history_size;
  $log     = $log->max_history_size(5);

Maximum number of logged messages to store in history, defaults to 10. ten little memories. πŸŽ€

πŸ’– path πŸ’–

  my $path = $log->path
  $log     = $log->path('/var/log/mojo.log');

Log file path used by handle. where the lore gets written down. πŸ““

πŸ’– short πŸ’–

  my $bool = $log->short;
  $log     = $log->short($bool);

Generate short log messages without a timestamp but with journald log level prefix, suitable for systemd environments, defaults to the value of the MOJO_LOG_SHORT environment variables. systemd girlies rise. πŸ”₯


⭐ METHODS ⭐

Mojo::Log inherits all methods from Mojo::EventEmitter and implements these new ones:

πŸ¦‹ append πŸ¦‹

  $log->append("[2018-11-08 14:20:13.77168] [28320] [info] I β™₯ Mojolicious\n");

Append message to handle. just shove it right in there. πŸ’Œ

πŸ¦‹ capture πŸ¦‹

  my $messages = $log->capture;
  my $messages = $log->capture('debug');

Capture log messages for as long as the returned object exists, useful for testing log messages. the way that this just… holds onto your logs for you. obsessed. 😭

  # Test your log messages
  my $messages = $log->capture('trace');
  $log->fatal('Something very bad happened');
  $log->trace('Just some debug information');
  like $messages, qr/Something very bad happened/, 'logs contain fatal message';
  like $messages->[-1], qr/Just some debug information/, 'trace message was last';
  undef $messages;

see that undef $messages; at the end? that's the release. it stops capturing when the object goes away. don't forget it. πŸ™ˆ

πŸ¦‹ context πŸ¦‹

  my $new = $log->context('[extra]', '[information]');

Construct a new child Mojo::Log object that will include context information with every log message. baby logger. spawn. πŸ‘‘

  # Log with context
  my $log = Mojo::Log->new;
  my $context = $log->context('[17a60115]');
  $context->debug('This is a log message with context information');
  $context->info('And another');

πŸ¦‹ debug πŸ¦‹

  $log = $log->debug('You screwed up, but that is ok');
  $log = $log->debug('All', 'cool');
  $log = $log->debug(sub {...});

Emit message event and log debug message. gentle roasting included free of charge. 🫢

πŸ¦‹ error πŸ¦‹

  $log = $log->error('You really screwed up this time');
  $log = $log->error('Wow', 'seriously');
  $log = $log->error(sub {...});

Emit message event and log error message. escalated. πŸ”₯

πŸ¦‹ fatal πŸ¦‹

  $log = $log->fatal('Its over...');
  $log = $log->fatal('Bye', 'bye');
  $log = $log->fatal(sub {...});

Emit message event and log fatal message. this is the dramatic one. πŸ’€

πŸ¦‹ info πŸ¦‹

  $log = $log->info('You are bad, but you prolly know already');
  $log = $log->info('Ok', 'then');
  $log = $log->info(sub {...});

Emit message event and log info message. just a lil FYI. ✨

πŸ¦‹ is_level πŸ¦‹

  my $bool = $log->is_level('debug');

Check active log level. vibe check for your logging threshold. 🌸

  # True
  $log->level('debug')->is_level('debug');
  $log->level('debug')->is_level('info');

  # False
  $log->level('info')->is_level('debug');
  $log->level('fatal')->is_level('warn');

πŸ¦‹ new πŸ¦‹

  my $log = Mojo::Log->new;
  my $log = Mojo::Log->new(level => 'warn');
  my $log = Mojo::Log->new({level => 'warn'});

Construct a new Mojo::Log object and subscribe to message event with default logger. three ways, all valid, pick your fighter. πŸ’…

πŸ¦‹ trace πŸ¦‹

  $log = $log->trace('Whatever');
  $log = $log->trace('Who', 'cares');
  $log = $log->trace(sub {...});

Emit message event and log trace message. the most unbothered level. whatever. who cares. correct. 🌈

πŸ¦‹ warn πŸ¦‹

  $log = $log->warn('Dont do that Dave...');
  $log = $log->warn('No', 'really');
  $log = $log->warn(sub {...});

Emit message event and log warn message. a gentle "bestie no". πŸ™ˆ


🧚 SEE ALSO 🧚

go read them. they're iconic. πŸ‘‘


and that's the whole page, bestie!! πŸŽ€πŸ’–πŸ¦‹

cute lil sign-off: this beauty comes from perl v5.42.0, dated 2026-07-15, and it's Mojo::Log(3) β€” screenshot it, frame it, put it on your wall. βœ¨πŸ’œ
πŸ“¦ where this page comes from