Security Advisories (2)
CVE-2024-58134 (2025-05-03)

Mojolicious versions from 0.999922 for Perl uses a hard coded string, or the application's class name, as a HMAC session secret by default. These predictable default secrets can be exploited to forge session cookies. An attacker who knows or guesses the secret could compute valid HMAC signatures for the session cookie, allowing them to tamper with or hijack another user's session.

CVE-2024-58135 (2025-05-03)

Mojolicious versions from 7.28 for Perl may generate weak HMAC session secrets. When creating a default app with the "mojo generate app" tool, a weak secret is written to the application's configuration file using the insecure rand() function, and used for authenticating and protecting the integrity of the application's sessions. This may allow an attacker to brute force the application's session keys.

NAME

Mojo::Log - Simple logger

SYNOPSIS

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');

DESCRIPTION

Mojo::Log is a simple logger for Mojo projects.

EVENTS

Mojo::Log inherits all events from Mojo::EventEmitter and can emit the following new ones.

message

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

Emitted when a new message gets logged.

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

ATTRIBUTES

Mojo::Log implements the following attributes.

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.

format

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

A callback for formatting log messages.

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

handle

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

Log filehandle used by default "message" event, defaults to opening "path" or STDERR.

history

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

The last few logged messages.

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.

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.

path

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

Log file path used by "handle".

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.

METHODS

Mojo::Log inherits all methods from Mojo::EventEmitter and implements the following new ones.

append

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

Append message to "handle".

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.

# 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;

context

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

Construct a new child Mojo::Log object that will include context information with every log message.

# 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.

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.

fatal

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

Emit "message" event and log fatal message.

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.

is_level

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

Check active log "level".

# 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.

trace

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

Emit "message" event and log trace message.

warn

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

Emit "message" event and log warn message.

SEE ALSO

Mojolicious, Mojolicious::Guides, https://mojolicious.org.