Manual for developing new log::any adapters
version 0.11
The adapter module:
package Log::Any::Adapter::YAL; use strict; use warnings; use Log::Any::Adapter::Util qw(make_method); use base qw(Log::Any::Adapter::Base); # Optionally initialize object # sub init { my ($self) = @_; $self->{attr} = ...; } # Create logging methods: debug, info, etc. # foreach my $method ( Log::Any->logging_methods() ) { make_method($method, sub { ... }); } # Create detection methods: is_debug, is_info, etc. # foreach my $method ( Log::Any->detection_methods() ) { make_method($method, sub { ... }); }
and the application:
Log::Any->set_adapter('YAL');
This document describes how to implement a new Log::Any adapter.
The easiest way to start is to look at the source of existing adapters, such as Log::Any::Adapter::Log4perl and Log::Any::Adapter::Dispatch.
If you are going to publicly release your adapter, call it 'Log::Any::Adapter::something' so that users can use it with
Log::Any->set_adapter(I<something>);
If it's an internal driver, you can call it whatever you like and use it like
Log::Any->set_adapter('+My::Log::Adapter');
All adapters must directly or indirectly inherit from Log::Any::Adapter::Base.
The constructor (\*(C`new\*(C') is provided by Log::Any::Adapter::Base. It will:
place any adapter arguments into a hash, along with the category
bless the hash into your subclass
call \*(L"init\*(R" which may be optionally provided by your subclass
At this point, overriding the default constructor is not supported. Hopefully it will not be needed.
The constructor is called whenever a log object is requested. e.g. If the application initializes Log::Any like so:
Log::Any->set_adapter('Log::YAL', yal_object => $yal, depth => 3);
and then a class requests a logger like so:
package Foo; use Log::Any qw($log);
Then $log will be populated with the return value of:
Log::Any::Adapter::Yal->new(yal_object => $yal, depth => 3, category => 'Foo');
This is memoized, so if the same category should be requested again (e.g. through a separate \*(C`get_logger\*(C' call, the same object will be returned. Therefore, you should try to avoid anything non-deterministic in your \*(L"init\*(R" function.
The following methods have no default implementation, and \s-1MUST\s0 be defined by your subclass:
These methods log a message at the specified level. To help generate these methods programmatically, you can get a list of the sub names with #_\|_METHOD Log::Any->logging_methods
These methods return a boolean indicating whether the specified level is active. To help generate these methods programmatically, you can get a list of the sub names with #_\|_METHOD Log::Any->detection_methods
The following methods have no default implementation but \s-1MAY\s0 be provided by your subclass:
This is called after the adapter object is created and blessed into your class. It will be a hash containing the parameters that were passed to new(). Perform any necessary validation or initialization here.
The following methods are useful for defining adapters: Handle the specified $method by calling $adapter_method on the object contained in $self->{$slot}. See Log::Any::Adapter::Dispatch and Log::Any::Adapter::Log4perl for examples of usage.
Returns a list of logging methods: debug, info, etc.
Returns a list of detection methods: is_debug, is_info, etc.
Returns a combined list of logging and detection methods.
Log::Any
This software is copyright (c) 2011 by Jonathan Swartz.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.