[hibernate-dev] Context-based Logging
Steve Ebersole
steve at hibernate.org
Tue Oct 19 12:26:26 EDT 2010
On Tuesday, October 19, 2010, at 11:07 am, John Verhaeg wrote:
> I'm currently going through the codebase trying to convert our use of slf4j
> for logging to jboss-logging. In doing so, I've noticed that all of the
> current loggers are named using the package-qualified name of the
> enclosing class that define them. JBoss-logging offers a similar concept
> in that loggers are associated with category names, but with the
> difference that multiple loggers can be associated with the same category.
>
> I'm still fairly new to working with the Hibernate codebase, but based on
> other projects I've worked on, I was thinking that maybe we should
> *additionally* introduce some type of context-based logging moving
> forward, where we'd supply logging contexts that represent the processes
> in play, as opposed to the structural organization of loggers that names /
> categories typically represent. To fully realize the power of these
> contexts, you'd want to support the idea of sub-contexts that could be
> active within other contexts (capturing when sub-processes are executed
> within higher-level processes).
>
> Just to clarify via an example, consider the code involved with making a
> query using hql. From what I can see in the existing code, one of the
> sub-processes involved with such a query involves copying the result set
> so that a pristine copy can be maintained and cached by the session, such
> that it won't be impacted by local changes to those results by the user
> between commits. So let's assume there's some issue a developer
> encounters while creating a query, and the underlying problem has
> something to do with copy sub-process. Using contexts, the developer
> would be able to configure his underlying logging framework to enable,
> say, the "query" context and set the logging level to debug or trace.
This is a bit of a misnomer I think. First, I think we need to say that the
"context logging" is NDC/MDC based. I do not know of a framework that has
built in support for specifying log levels/granularity based on NDC/MDC that
is the realm of the category in every framework of which I am aware. What you
suggest is possible by, for example, cranking up logging all the way and then
using the framework's notion of a filter. But the "problem there" is stuff
like logger.isDebugEnabled(), etc will return true there all the time if they
go that route.
And as I have said all along, basing category names on this "context" is not
feasible.
> Ideally, he'd get enough information from these logs to determine that
> things begin to go awry after the results are copied. This, of course,
> presumes a message is logged in the "query" context indicating when the
> "copy results" sub-process is triggered, possibly even specifying in! that
> message the sub-context associated with that sub-process. Now the
> developer knows to enable this new context and run through the scenario
> again to isolate the problem. He doesn't have to care or know which or
> how many classes are involved in either the outer hql process or the
> subprocess responsible for copying results.
>
> So one intended benefit of using contexts would be to make it easier for
> developers, and possibly even developers' end-users, to determine which
> log messages to enable/filter related to some problem their trying to hunt
> down, while minimizing their need to understand the structure of code
> internal to the Hibernate libraries. This approach should also help
> decouple the logging and coding concerns such that, for instance, if a
> method is moved to a different class, there is no impact on how messages
> are logged (assuming the same contexts are still applicable).
>
> While we certainly could specify category names that more represent
> processes or logical structure rather than simple package and class names
> (physical structure), I'd still be concerned about code that happens to be
> reused within multiple processes or services. Assuming it's important for
> a significant amount of this type of "utility" code to log messages (this
> might be a big assumption), which category of logger would you choose?
> You could pass in the logger, but that would require changes to any
> existing APIs. You could also just provide a separate category for this
> type of code, but then you'd blurring what it means for a category to
> represent a "process".
>
> So I'm thinking that using the jboss-logging NDC facility might be a good
> way to support process-based contexts. This facility allows us to push
> and pop contexts on and off a global stack (maintained by the
> jboss-logging framework) at the boundaries of these processes. Of course,
> we'd have to document the contexts that we use and the processes that
> they're tied to. The disadvantage here would be the discipline we'd have
> to exercise to do this properly. Pushing and popping contexts would need
> to be treated similarly to beginning and ending a transaction, where
> contexts that are popped off of the NDC stack would reside within finally
> blocks. One other thing to consider is we'd probably want to provide some
> documentation about how to support NDC using simple JDK logging, since
> this isn't supported out-of-the-box.
>
> So is any of this worth the effort? Are my concerns valid? Is using
> category names to represent logical structure enough? Thoughts?
>
> JPAV
>
>
>
>
>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
---
Steve Ebersole <steve at hibernate.org>
http://hibernate.org
More information about the hibernate-dev
mailing list