PerlDancer / Dancer2

Perl Dancer Next Generation (rewrite of Perl Dancer)
http://perldancer.org/
Other
537 stars 272 forks source link

Proposal: Using references to log messages in logging hooks #1705

Open cromedome opened 6 months ago

cromedome commented 6 months ago

I was making some minor corrections in the logging docs when I happened upon hooks in our logging engine (what a nice surprise!). I noticed they were not documented, and as I tried to use them to make some examples, I got a bit frustrated by them. I'd like to discuss a possible change.

In Dancer2::Core::Role::Logger, we have:

around 'log' => sub {
    my ($orig, $self, @args) = @_;

    $self->execute_hook( 'engine.logger.before', $self, @args );
    $self->$orig( @args );
    $self->execute_hook( 'engine.logger.after', $self, @args );
};

In other places (such as Dancer2::Core::Role::Template), we pass around a reference so we can manipulate content in the hooks before continuing execution. This isn't possible in the logger hook, at least not trivially (unless I am missing something - which is completely likely!). So you'd have to push that functionality down into the logging adapter/logger engine, or create another wrapper method for log().

What are your thoughts about making @args a reference instead? This would allow developers to add additional information to log messages (such as a request ID or other metadata) without repeating code.

On the other hand, you can make a solid argument for not wanting to alter log messages. And maybe that was the original intent. I wasn't here for that. If that is the case, I can close this and you all can disregard.

Dancers, what are your thoughts here? Am I simply missing the point of what you're supposed to do with this hook?

GeekRuthie commented 6 months ago

I'd suggest making the change, and then giving it a try; make sure it passes all the tests, etc. But I'm all for being able to manipulate that data in a hook. This shouldn't be too large a change, I wouldn't think.

SysPete commented 6 months ago

Although it is unlikely that this hook is heavily used, especially since it is undocumented, we still risk breaking live code if this change is made. I've know I've used undocumented hooks in the past, but I can't remember which ones, and this may well be one of them, so I'm not keen on this change.

When adding extra data to logs, my preference is to do that using Log4perl, though still leaving the original message intact.