preaction / Log-Any

Simple, fast Perl logging API compatible with any logging system
Other
13 stars 19 forks source link

[challenge] caller depth #99

Open XSven opened 1 year ago

XSven commented 1 year ago

I have created an Exception class that consumes the Throwable Moo role. The Exception class is the base class of further classes like for example XML::Exception. This is an excerpt from the Exception class

has _logger => ( is => 'lazy', isa => InstanceOf[ 'Log::Any::Proxy' ], init_arg => undef );

sub BUILD {
  my ( $self ) = @_;
  $self->_logger->errorf( $self->message ) if $self->has_message;
  return;
}

sub _build__logger {
  my ( $self ) = @_;
  return Log::Any->get_logger( category => blessed( $self ) );
}

As you can see errorf() is called in the BUILD() method.

What I want is to log at the place where the exception is raised.

If my consumer is Log::Log4perl, I have to do some wrapper registration

Log::Log4perl->wrapper_register( 'XML::Exception' );
Log::Log4perl->wrapper_register( 'Exception' );
Log::Log4perl->wrapper_register( 'Throwable' );

I dislike that although I cannot clearly state why. First it works only for Log::Log4perl. Second who is responsible for the adjustment of the "caller depth"? Is it the producer or the consumer? Do we need an amendment of the Log::Any::Adapter interface so that "caller depth" information can be passed to any adapter whether he needs it or not?