#!/usr/bin/perl =pod =head1 NAME Spline::Log - Utilities for logging =head1 SYNOPSIS use Spline::Log qw(...); set_stderr($bool); set_verbose($bool); set_log_context($context); debug($message); info($message); =head1 DESCRIPTION =cut package Spline::Log; use strict; use warnings; use feature 'say'; use Sys::Syslog; use base 'Exporter'; our @EXPORT = qw(); our @EXPORT_OK = qw( set_stderr set_verbose set_log_context debug info ); my $context = undef; my $verbose = 0; my $syslog = 0; =head2 set_stderr set_stderr($bool); =cut sub set_stderr($) { my $value = shift; if ($value) { if (defined $syslog && $syslog) { closelog(); } $syslog = undef; } else { $syslog = 0 unless defined $syslog; } } =head2 set_verbose set_verbose($bool); Specify if you want to see the debug messages. If the supplied value is true, you will see this messages, otherwise only the info messages are logged. =cut sub set_verbose($) { my $value = shift; if ($value) { $verbose = 1; } else { $verbose = 0; } } =head2 set_log_context set_log_context($context); Set the logging context, that should be added to all messages. If you may have interleaving log lines, you could use this context to tag the correlating lines. This method set the new context and returns the previous value. =cut sub set_log_context($) { my $old = $context; $context = '' . shift; return $old; } =head2 debug debug($message); Lop the supplied message, but only if verbose is set. The message is prepended with the logging context (if defined). =cut sub debug($) { my $msg = shift; if ($verbose) { _log('DEBUG', $msg); } } =head2 info info($message); Log the supplied message, regardless of the verbosity. The message is prepended with the logging context (if defined). =cut sub info($) { my $msg = shift; _log('INFO', $msg); } =head2 _get_context $context = _get_context(); If the logging context is defined, return the context followd by a colon and a space (ready for output). If the context is undefined an empty space is returned. =cut sub _get_context() { return '' unless defined $context; return "$context: "; } =head2 _log _log($level, $msg); Log the supplied message. The message is prepended with the logging context (if defined). So the log format is something like this: CONTEXT: MESSAGE The supplied level is only used for syslog. =cut sub _log($$) { my ($level, $msg) = @_; my $output = _get_context() . $msg; if (defined $syslog) { unless ($syslog) { openlog('dmarc_milter', 'ndelay,pid', 'mail'); } syslog($level, $output); } else { say STDERR $output; } } =head1 AUTHOR Alexander Sulfrian =cut 1; # vim: set et tabstop=4 tw=70: