SYNOPSIS

    In your module (producer):

     package Foo;
     use Log::ger; # will import some logging methods e.g. log_warn, log_error
    
     # produce some logs
     sub foo {
         ...
         log_warn "an error occurred";
         log_error "an error occurred: %03d - %s", $errcode, $errmsg;
     }
     1;

    In your application:

     use Foo;
     use Log::ger::Output::Screen;
    
     foo();

DESCRIPTION

    EARLY RELEASE, EXPERIMENTAL.

    This is yet another logging framework. Like Log::Any, it separates
    producers and consumers. Unlike Log::Any (and like Log::Contextual), it
    uses plain functions (non-OO). Some features:

      * Low startup overhead;

      * Low overhead;

      * Customizable levels;

      * Changing levels and outputs during run-time;

      For example, you can debug your running server application to turn on
      trace logs temporarily when you need to investigate something.

      * Option to optimize away the logging statements when unnecessary;

      See Log::ger::Import::OptAway.

      * Interoperability with other logging frameworks;

      See Log::ger::Import::LogAny to interop with Log::Any.

INTERNALS

 Hooks

    Hooks are how Log::ger provides its flexibility. A hook is passed a
    hash argument and is expected to return an array:

     [$err*, ...]

    $err is a string and can be set to "" to signify success or a non-empty
    error message to signify error. Log::ger usually dies after a hook
    returns error.

 Create_Log_Routine hook

    Used to create "log_level" routines.

    Arguments received: name (name of subroutine, e.g. log_warn), level
    (numeric level), package, prev (coderef).

    Expected return:

     [$err*, $code, $continue]

    Hook that wants to decline can return undef in $code. Log::ger will
    stop after the hook that produces a non-undef code unless when set to
    $continue 1 then Log::ger will continue to the next hook and passing
    the code to prev to allow onion-style nesting of code.

 Create_Log_Is_Routine hook

    Used to create "log_level" routines.

 Install_Routine hook

    Used to install to the caller (log producer) package.

    Arguments: package (target package to install to), name (routine name),
    code (routine code), level (the numeric level of the routine).

    Expected return:

     [$err*, $installed]

    $installed can be set to 1 to signify that the hook has installed the
    routine, so Log::err will stop. Otherwise, Log::ger will try the next
    hook.

 Plans

      * Multiple loggers

      To support logging to two+ different loggers in the same producer
      package, a la in Log::Any:

       $log->debugf("Headers is: %s", $http_res->{headers});
       $log_dump->debug($http_res->{content});

      we can do something like (XXX find a more appropriate name):

       my $log      = Log::ger::install_to_object(...); # instead of installing to package
       my $log_dump = Log::ger::install_to_object(...); # or perhaps install to hash?
       $log->log_debug(...);
       $log_dump->log_debug(...);

      * Custom formatting

      For example, a la Log::Contextual:

       log_warn { 'The number of stuffs is: ' . $obj->stuffs_count };

      * Multiple outputs, filtering based on category

      With the exception of the default/null routines (and perhaps the
      simple Screen output too), the other logging routines should be
      constructed using a code generation approach so we can have multiple
      outputs, etc.

SEE ALSO

    Some other recommended logging frameworks: Log::Any, Log::Contextual.

