[hibernate-dev] Context-based Logging
John Verhaeg
jverhaeg at redhat.com
Tue Oct 19 13:07:11 EDT 2010
On Oct 19, 2010, at 11:26 AM, Steve Ebersole wrote:
> 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.
I've just realized there's an expectation I had for supporting contexts I failed to convey: My expectation is that the handlers/filters for the underlying logging framework would not only ensure the NDC context values are used, but also that they'd offer users a way to filter messages based upon those contexts. I should also state that by "set the logging level to debug or trace", I should have said within the global logger, assuming that level is inherited by all child loggers.
>
>> 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
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
JPAV
More information about the hibernate-dev
mailing list