summaryrefslogtreecommitdiffstats
path: root/Spline/Log.pm
blob: 32080dcb62f589d6152955e7938bb940bef715e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#!/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 <alex@spline.inf.fu-berlin.de>

=cut

1;
# vim: set et tabstop=4 tw=70: