The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Log::Handler::Config - The main config loader.

SYNOPSIS

    use Log::Handler;

    my $log = Log::Handler->new();

    $log->config(
        filename => 'file.conf',
        plugin   => 'YAML',
        section  => 'section-name',
    );

Or

    use Log::Handler;
    use Log::Handler::Config;

    my $conf = Log::Handler::Config->config(
        filename => 'file.conf',
        plugin   => 'YAML',
        section  => 'section-name',
    );

    my $log = Log::Handler->new();

    while ( my ($type, $config) = each %$conf ) {
        $log->add($type => $config);
    }

DESCRIPTION

This module makes it possible to load the configuration from a file.

METHODS

config()

With this method it's possible to load the configuration for your outputs.

The following options are valid:

filename

The configuration file.

plugin

With this option you can set the plugin you want to use. There are 3 plugins available at the moment:

    Config::General
    Config::Properties
    YAML

If the option is not set then the file extension is used to determine the configuration style:

    Config::General     -   cfg, conf 
    Config::Properties  -   props, jcfg, jconf
    YAML                -   yml, yaml

Examples:

    # use file.conf and YAML

    $log->config(
        filename => 'file.conf',
        plugin   => 'YAML'
    );

    # automatically use YAML

    $log->config(
        filename => 'file.yaml'
    );

    # automatically use Config::General

    $log->config(
        filename => 'file.conf'
    );

If the extension is not defined then Config::General is used by default.

section

If your configuration is placed in file where you configure your complete program you can push your output configuration into a sub section:

    <output>
        <file>
            <mylog>
                filename = file.log
                minlevel = 0
                maxlevel = 7
            </mylog>
        </file>
    </output>

    <Another_Script_Config>
        foo = bar
    </Another_Script_Config>

Now your configuration is placed in the output section. You can load this section with

    $log->config(
        filename => 'file.conf',
        section  => 'output',
    );

    # or if you load the configuration yourself to $config

    $log->config(
        config  => $config,
        section => 'output',
    );

    # or just

    $log->config( config => $config->{output} );
config

With this option you can pass a configuration that you loaded already but it must have the correct hash structure! Take a look to the examples!

PLUGINS

    Config::General     -  inspired by the well known apache config format
    Config::Properties  -  Java-style property files
    YAML                -  optimized for human readability

EXAMPLES

Config structure

For each output object it must exist a own section. Here a example as hash:

    my %config = (

        # the configuration for a file

        file => {
            foo => {
                filename => 'file1.log',
                maxlevel => 'info',
                minlevel => 'warn',
            },
            bar => {
                filename => 'file2.log',
                maxlevel => 'error',
                minlevel => 'emergency',
            }
        }

        # the configuration for email

        email => {
            foo =>
                host     => 'foo.example',
                from     => 'me@me.example',
                to       => 'you@foo.example',
                maxlevel => 'error',
                minlevel => 'emergency',
            },

            # and_so_on ...
        }
    );

You can store your configuration to a file and loads it. There are different config plugins available.

A default section

If your configuration contains a default section then this parameters are used for all other sections. Example:

    my %config = (
        # the configuration for a file
        file => {
            default => {
                mode     => 'append',
            },
            foo => {
                filename => 'file1.log',
                maxlevel => 'info',
                minlevel => 'warn',
            },
            bar => {
                filename => 'file2.log',
                maxlevel => 'error',
                minlevel => 'emergency',
            },
            baz => {
                filename => 'file3.log',
                maxlevel => 'debug',
                minlevel => 'debug',
                mode     => 'trunc',
            },
        },
        # the configuration for dbi
        dbi => {
            ...
        }
    );

The option mode is set to append for the log file file1.log and file2.log. The configuration for file3.log will be set to trunc.

Examples for the config plugins

Config::General

    <file>
        <mylog>
            fileopen = 1
            reopen = 1
            permissions = 0640
            maxlevel = info
            mode = append
            timeformat = %b %d %H:%M:%S
            debug_mode = 2
            filename = example.log
            minlevel = warn
            prefix = '%T %H[%P] [%L] %S: '
            newline = 1
        </mylog>
    </file>

YAML

    ---
    file:
      mylog:
        debug_mode: 2
        filename: example.log
        fileopen: 1
        maxlevel: info
        minlevel: warn
        mode: append
        newline: 1
        permissions: 0640
        prefix: '%T %H[%P] [%L] %S: '
        reopen: 1
        timeformat: '%b %d %H:%M:%S'

Config::Properties

    file.mylog.reopen = 1
    file.mylog.fileopen = 1
    file.mylog.maxlevel = info
    file.mylog.permissions = 0640
    file.mylog.mode = append
    file.mylog.timeformat = %b %d %H:%M:%S
    file.mylog.debug_mode = 2
    file.mylog.minlevel = warn
    file.mylog.filename = example.log
    file.mylog.newline = 1
    file.mylog.prefix = '%T %H[%P] [%L] %S: '

Load the config from a certain section

The config (Config::General)

    <output>
        <file>
            <default>
                newline     = 1
                permissions = 0640
                timeformat  = %b %d %H:%M:%S
                fileopen    = 1
                reopen      = 1
                mode        = append
                prefix      = "%T %H[%P] [%L] %S: "
                debug_mode  = 2
            </default>

            <common>
                filename    = example.log
                maxlevel    = info
                minlevel    = warn
            </common>

            <error>
                filename    = example-error.log
                maxlevel    = warn
                minlevel    = emergency
            </error>

            <debug>
                filename    = example-debug.log
                maxlevel    = debug
                minlevel    = debug
            </debug>
        </file>
    </output>

Load the config

    $log->config(
        filename => 'file.conf',
        section  => 'output',
    );

Simple configuration without a certain section

The config (Config::General)

    <file>
        <default>
            newline     = 1
            permissions = 0640
            timeformat  = %b %d %H:%M:%S
            fileopen    = 1
            reopen      = 1
            mode        = append
            prefix      = "%T %H[%P] [%L] %S: "
            debug_mode  = 2
        </default>

        <common>
            filename    = example.log
            maxlevel    = info
            minlevel    = warn
        </common>

        <error>
            filename    = example-error.log
            maxlevel    = warn
            minlevel    = emergency
        </error>

        <debug>
            filename    = example-debug.log
            maxlevel    = debug
            minlevel    = debug
        </debug>
    </file>

Load the config

    $log->config( filename => 'file.conf' );

The config as hash

    $log->config(
        config => {
            file => {
                default => {
                    newline     => 1,
                    permissions => '0640',
                    timeformat  => '%b %d %H:%M:%S',
                    fileopen    => 1,
                    reopen      => 1,
                    mode        => 'append
                    prefix      => '%T %H[%P] [%L] %S: ',
                    debug_mode  => 2,
                },
                common => {
                    filename    => 'example.log',
                    maxlevel    => 'info',
                    minlevel    => 'warn',
                },
                error => {
                    filename    => 'example-error.log',
                    maxlevel    => 'warn',
                    minlevel    => 'emergency',
                },
                debug => {
                    filename    => 'example-debug.log',
                    maxlevel    => 'debug',
                    minlevel    => 'debug',
                },
            }
        }
    );

Configuration for different outputs

    <output>
        <file>
            <default>
                newline     = 1
                permissions = 0640
                timeformat  = %b %d %H:%M:%S
                fileopen    = 1
                reopen      = 1
                mode        = append
                prefix      = "%T %H[%P] [%L] %S: "
                debug_mode  = 2
            </default>

            <common>
                filename    = example.log
                maxlevel    = info
                minlevel    = warn
            </common>

            <error>
                filename    = example-error.log
                maxlevel    = warn
                minlevel    = emergency
            </error>
        </file>

        <email>
            <default>
                timeout     = 60
                debug       = 0
                subject     = My subject
                buffer      = 100
                interval    = 300
                prefix      = "%T %H[%P] [%L] %S: "
                debug_mode  = 2
            </default>

            <admin>
                host        = foo.example
                from        = me@me.example
                to          = you@foo.example
                maxlevel    = error
                minlevel    = emergency
            </admin>

            <op>
                host        = bar.example
                from        = me@me.example
                to          = you@bar.example
                maxlevel    = warn
                minlevel    = emergency
            </op>
        </email>
    </output>

PREREQUISITES

    Carp
    Params::Validate
    UNIVERSAL::require

EXPORTS

No exports.

REPORT BUGS

Please report all bugs to <jschulz.cpan(at)bloonix.de>.

AUTHOR

Jonny Schulz <jschulz.cpan(at)bloonix.de>.

QUESTIONS

Do you have any questions or ideas?

MAIL: <jschulz.cpan(at)bloonix.de>

If you send me a mail then add Log::Handler into the subject.

TODO

    * Log::Handler::Output::DBI
    * Log::Handler::Output::Socket

COPYRIGHT

Copyright (C) 2007 by Jonny Schulz. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

DISCLAIMER OF WARRANTY

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.