NAME

Log::ger::Manual::Internals - Log::ger internals

VERSION

version 0.006

DESCRIPTION

When an importer package does this:

use Log::ger;

Basically all Log::ger does is construct logging routines and install them to importer's package (target), e.g. log_warn, log_debug, log_is_debug and so on. Log::ger also records the importer's package name. When a resetup is requested (e.g. due to a change of log level or outputs), Log::ger will again construct logging routines and install them for each importer that has been recorded, updating the routines.

Actually, instead of installing routines to a package, Log::ger can also target a hash or an object (which is basically the same as installing to a package, but a "random" package name will be used for the object).

HOOKS AND PLUGINS

Hooks are how Log::ger provides its flexibility. At various times (phases), Log::ger will turn to running hooks to get some behavior or result. For example when wanting to construct a logging routine or formatting routine or before/after installing a logging routine. Plugins, which are modules in the Log::ger::{Plugin,Output,Format,Filter,...} namespaces, can supply these hooks.

Hooks are stored in the %Global_Hooks variable, where the key is phase name and the value an array of hook records. Each hook record is in the form of:

[$key, $prio, $coderef]

where $key is package name, $prio is a number between 0-100 (the lower the number, the higher the priority and the earlier it is run), $coderef is the actual hook routine.

A hook routine is passed a hash argument and is expected to return an array:

[$result, $flow_control]

By the default each hook will be executed in order of its priority. $flow_control can be set to 1 by a hook to stop immediately after this hook instead of continuing to the next. Some phases will nevertheless stop after the first hook that returns non-undef $result. A hook that returns undef is effectively declining and causing Log::ger to move to the next hook in the chain.

Aguments received by hook: target (str, can be package if installing to a package, or hash or object), target_arg (str, when target is package, will be the package name; when target is hash will be the hash; when target is object will be the object's package), init_args (hash, arguments passed to Log::ger when importing). In some phases, hook will receive more arguments (see phase documentation below).

Available phases:

  • create_filter

  • create_formatter

  • create_routine_names

    Used to construct routine names. Hook must return this:

    [{
      log_subs    => [ [NAME, STR_LEVEL], ... ],
      is_subs     => [ [NAME, STR_LEVEL], ... ],
      log_methods => [ [NAME, STR_LEVEL], ... ],
      is_methods  => [ [NAME, STR_LEVEL], ... ],
    }]
  • create_log_routine

    Used to create "log_level" routines. Run for each level. Extra arguments received by hook: level (numeric level), str_level.

  • create_is_routine

    Used to create "log_is_level" routines. Run for each level. Extra Arguments received by hooks: level (numeric level), str_level.

  • before_install_routines

    Extra arguments received by hooks: routines which is in the form of:

    [
      [$coderef, $name, $level, $flags],
      ...
    ]

    where $flags has this bits: 1 is set if routine is a "log_LEVEL" routine instead of a "log_is_LEVEL" routine, 2 is set if routine is expected to be called as a method instead of a subroutine.

  • after_install_routines

    Extra arguments received by hooks: routines.

Aside from the global hooks, there are also per-target hooks, which are stored in %Per_Package_Hooks, %Per_Hash_Hooks, %Per_Object_Hooks.

TARGETS

Log::ger can install logger routines to a package, or an object (which is similar to installing to a package), or a hash (usually for testing).

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by perlancar@cpan.org.

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