Security Advisories (6)
CPANSA-Mojolicious-2022-03 (2022-12-10)

Mojo::DOM did not correctly parse <script> tags.

CPANSA-Mojolicious-2021-02 (2021-06-01)

Small sessions could be used as part of a brute-force attack to decode the session secret.

CVE-2021-47208 (2021-03-16)

A bug in format detection can potentially be exploited for a DoS attack.

CVE-2020-36829 (2020-11-10)

Mojo::Util secure_compare can leak the string length. By immediately returning when the two strings are not the same length, the function allows an attacker to guess the length of the secret string using timing attacks.

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->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 {
  my ($log, $level, @lines) = @_;
  ...
});

Emitted when a new message gets logged.

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

ATTRIBUTES

Mojo::Log implements the following attributes.

format

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

A callback for formatting log messages.

$log->format(sub {
  my ($time, $level, @lines) = @_;
  return "[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 debug. Available log levels are 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, suitable for systemd, 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".

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.

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.