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

NAME

XLog::Module - logging module with separate settings

SYNPOSIS

    package NetworkLayer;
    our $xlog_module = XLog::Module->new("network");
    ...
    XLog::debug($xlog_module, "data received: $raw_data");
    
    package LogicLayer;
    our $xlog_module = XLog::Module->new("logic");
    ...
    XLog::debug($xlog_module, "message: ".Dump($msg));

    ...
    #somewhere
    $NetworkLayer::xlog_module->set_level(XLog::DEBUG);
    # or
    XLog::set_level(XLog::DEBUG, "network");
    ...
    $NetworkLayer::xlog_module->set_logger(XLog::File->new({file => 'network.log'}));
    $NetworkLayer::xlog_module->set_formatter($formatter);
    

DESCRIPTION

Log modules are used to separate logs of one part of the application from another. For example image you have network layer in your application and logic layer.

    # network layer
    ...
    XLog::debug("data received: $raw_data");
    
    #logic layer
    ...
    XLog::debug("message: ".Dump($msg));
    
    ...
    #somewhere
    XLog::set_level(XLog::DEBUG);

You want to debug your network layer and enable debug logs but you don't want to enable debug logs everywhere across your app. In this case you can create 2 log modules, use it when logging and enable debug log only for certain log module.

    package NetworkLayer;
    our $xlog_module = XLog::Module->new("network");
    ...
    XLog::debug($xlog_module, "data received: $raw_data");
    
    package LogicLayer;
    our $xlog_module = XLog::Module->new("logic");
    ...
    XLog::debug($xlog_module, "message: ".Dump($msg));

    ...
    #somewhere
    $NetworkLayer::xlog_module->set_level(XLog::DEBUG);
    # or
    XLog::set_level(XLog::DEBUG, "network");

Now min level DEBUG is only set for network log module while logic still have WARNING as min level.

Module parameter to log functions can be omitted if variable's name holding log module is xlog_module and it is global and in the same package or lower package as logging code.

    {
        package MyApp;
        our $xlog_module = XLog::Module->new("myapp");
    
        {
            package MyApp::Other;
            XLog::debug("hello"); # logging to myapp
        }
        {
            package MyApp::NetworkLayer;
            our $xlog_module = XLog::Module->new("network");
            XLog::debug("hello"); # logging to network module
        }
        XLog::debug("hi"); # logging to myapp module
    }
    XLog::debug("hi"); # logging to root module

Modules can be organised in hierarchies (parent-child).

    package AAA;
    our $xlog_module = XLog::Module->new("aaa");
    
    package BBB;
    our $xlog_module = XLog::Module->new("bbb", $AAA::xlog_module);
    

In this case, module bbb is a child of module aaa and setting log level for aaa also sets level for bbb but not vice-versa. Child modules partially inherits names from their parents, so in this case the name of BBB module will be aaa::bbb.

Also modules support setting custom logger and formatter. By default, if none is set to any module, all modules will use logger/formatter from the root module (set via XLog::set_logger/set_formatter).

If you set logger or formatter explicitly for some module

    $xlog_module->set_logger($my_logger);
    $xlog_module->set_formatter($my_formatter);
    

then $xlog_module and all of its children will use logger/formatter provided.

To revert to default behaviour (inherit logger/formatter from parent) set them to undef

    $xlog_module->set_logger(undef);
    $xlog_module->set_formatter(undef);

METHODS

new($name, [$min_level=WARNING)

Creates a new module with root module as its parent. $min_level is minimal logging level for all logs written with this module. The default is .

new($name, $parent_module, [$min_level=WARNING])

Creates a module with $parent_module as its parent. $min_level is minimal logging level for all logs written with this module.

The name of the newly created module is its parent name plus the name of the module separated by "::"

If $parent_module is undef then creates a new root module. Such module and its children will not react to XLog::set_level/set_logger/etc, but only to direct configuring.

    $module->set_level(...);
    $module->set_logger(...);

name()

Returns full module name

level()

Returns minimal log level for this module

set_level($new_min_level)

Sets minimal log level for this module and all of its children

set_logger($logger, [$passthrough = false])

Sets logger backend for this module. Logging that is done with this module or any of its children will use this logger unless some child has its own logger configured explicitly.

See XLog's set_logger for details on what $logger can be.

To revert to using parent's logger, just set it to undef.

    $module->set_logger(undef);
    

Setting undef as logger for root module (module with no parent) disables logging for such module and its children except for child modules that has its own logger configured explicitly.

If $passthrough is set, after logging to this logger, will log also to parent's logger is if this logger wasn't present

set_formatter($formatter)

Sets formatter for this module. Logging that is done with this module or any of its children will use this formatter unless some child has its own formatter configured explicitly.

See XLog's set_formatter for details on what $formatter can be.

To revert to using parent's formatter, just set it to undef.

    $module->set_formatter(undef);
    

Setting undef as formatter for root module (module with no parent) reverts to using default formatter (XLog::Formatter::Pattern with default pattern).

passthrough()

Returns true if $passthrough was set on last set_logger call to this module.