You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Scott M Stark <Sc...@displayscape.com> on 2001/02/17 03:07:38 UTC

Using NDC to enable logging over a thread of control

One common logging task I use frequently in server development is the ability to
enable logging across a thread of control beginning at some entry point. An example
is enabling all log msgs regardless of priority that are executed within a particular
servlet's service() method. Going through the log4j api I can't see a way to do this.
Is this possible?



Re: Using NDC to enable logging over a thread of control

Posted by John Carnahan <ca...@protos.lifesci.ucla.edu>.
Scott,

I do not know about overriding priority but I do know how to correlate msgs with the active
thread. It is a bit of a hack but at the start of your service method use Thread.setName to
something unique and identifiable. Then the log can be easily parsed by thread name. Like I
said it seems to be a bit of a hack but I have used it for things like benchmarking with
success.

John

Scott M Stark wrote:

> I'm looking to correlate msgs with the active thread and to have the Priority of
> the thread override any Category.xxx() log msg invocation so that all log statements
> in this thread of control are rendered.
>
> The use case for this is a production J2EE server housing many EJBs, servlets, etc.
> and there is a problem report for particular user interacting with one servlet. I don't
> want to have to crank up the priority limit to dump out all possible msgs. I just want
> to toggle a request parameter that triggers logging throughout one particular thread of
> control the user is interacting with.
>
> ----- Original Message -----
> From: "Christopher Taylor" <cs...@pacbell.net>
> To: "LOG4J Users Mailing List" <lo...@jakarta.apache.org>
> Sent: Friday, February 16, 2001 6:27 PM
> Subject: Re: Using NDC to enable logging over a thread of control
>
> > Could you go into a little more detail?  Do you want to correlate messages with Threads
> > or with clients?
> >
> > -Chris
> >
> > Scott M Stark wrote:
> >
> > > One common logging task I use frequently in server development is the ability to
> > > enable logging across a thread of control beginning at some entry point. An example
> > > is enabling all log msgs regardless of priority that are executed within a particular
> > > servlet's service() method. Going through the log4j api I can't see a way to do this.
> > > Is this possible?
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> > > For additional commands, e-mail: log4j-user-help@jakarta.apache.org
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: log4j-user-help@jakarta.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org


Re: Using NDC to enable logging over a thread of control

Posted by Christopher Taylor <cs...@pacbell.net>.
I've never tried the NDC approach before... do you think it would work?


On Friday, February 16, 2001, at 07:55 PM, Scott M Stark wrote:

> I think you have part of the picture correct, but what I'm missing here 
> is how all of the
> log msgs in code that the thread interacts with ends up getting 
> associated with this
> 'UserDebug' category.
>
> For example, I'm using a Category per Java package paradigm in which 
> every
> class in a package logs through a Category with a name equal to the 
> package name.
> So, if the servlet interacts with two packages in addition to the 
> servlet code,
> say com.dscape.security and com.dscape.mail, I want any msgs issued 
> through
> the Category("com.dscape.security") and Category("com.dscape.mail") to 
> show
> up in the Category("'UserDebug") appender regardless of their priority 
> for this
> particular call stack only. If my understanding of Category is correct, 
> I'm looking
> for a transient heirachy of Categorys based on the thread stack rather 
> than any
> static category namespace.
>
> ----- Original Message -----
> From: Christopher Taylor
> To: LOG4J Users Mailing List
> Sent: Friday, February 16, 2001 6:56 PM
> Subject: Re: Using NDC to enable logging over a thread of control
>
>
> If I'm understanding your need correctly, you could probably do this in 
> the following way without any code changes to Log4J:
>
> - if the user is authenticated, you can get the principal from the 
> HttpServletRequest.
> - If that user has been "enabled for debugging", get an instance of a 
> category for that user that is one step below a well-known
> debugging category (for example, category "UserDebug" logs to a special 
> appender called "DebugUserProblems"). So, if I was
> authenticated with an SSL certificate any my distinguished name was 
> "uid=ctaylor,dc=java-internals,dc=com", you could make the
> category name "UserDebug.ctaylor". One technique for doing this is to 
> always get an instance of a category for logging in your
> application, but it depends if the user is on the debug list or not if 
> calls go to the special log. You can put that instance of the
> Category into the request attributes.
>
> Let me know if I'm misinterpreting you.
>
> -Chris
>
> On Friday, February 16, 2001, at 06:50 PM, Scott M Stark wrote:
>
>
> I'm looking to correlate msgs with the active thread and to have the 
> Priority of
> the thread override any Category.xxx() log msg invocation so that all 
> log statements
> in this thread of control are rendered.
>
> The use case for this is a production J2EE server housing many EJBs, 
> servlets, etc.
> and there is a problem report for particular user interacting with one 
> servlet. I don't
> want to have to crank up the priority limit to dump out all possible 
> msgs. I just want
> to toggle a request parameter that triggers logging throughout one 
> particular thread of
> control the user is interacting with.
>
> ----- Original Message -----
> From: "Christopher Taylor" <cs...@pacbell.net>
> To: "LOG4J Users Mailing List" <lo...@jakarta.apache.org>
> Sent: Friday, February 16, 2001 6:27 PM
> Subject: Re: Using NDC to enable logging over a thread of control
>
>
>
> Could you go into a little more detail? Do you want to correlate 
> messages with Threads
> or with clients?
>
> -Chris
>
> Scott M Stark wrote:
>
>
> One common logging task I use frequently in server development is the 
> ability to
> enable logging across a thread of control beginning at some entry 
> point. An example
> is enabling all log msgs regardless of priority that are executed 
> within a particular
> servlet's service() method. Going through the log4j api I can't see a 
> way to do this.
> Is this possible?
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>

Re: Using NDC to enable logging over a thread of control

Posted by Scott M Stark <Sc...@displayscape.com>.
I think you have part of the picture correct, but what I'm missing here is how all of the
log msgs in code that the thread interacts with ends up getting associated with this
'UserDebug' category.

For example, I'm using a Category per Java package paradigm in which every
class in a package logs through a Category with a name equal to the package name.
So, if the servlet interacts with two packages in addition to the servlet code,
say com.dscape.security and com.dscape.mail, I want any msgs issued through
the Category("com.dscape.security") and Category("com.dscape.mail") to show
up in the Category("'UserDebug") appender regardless of their priority for this
particular call stack only. If my understanding of Category is correct, I'm looking
for a transient heirachy of Categorys based on the thread stack rather than any
static category namespace.

----- Original Message -----
From: Christopher Taylor
To: LOG4J Users Mailing List
Sent: Friday, February 16, 2001 6:56 PM
Subject: Re: Using NDC to enable logging over a thread of control


If I'm understanding your need correctly, you could probably do this in the following way without any code changes to Log4J:

- if the user is authenticated, you can get the principal from the HttpServletRequest.
- If that user has been "enabled for debugging", get an instance of a category for that user that is one step below a well-known
debugging category (for example, category "UserDebug" logs to a special appender called "DebugUserProblems"). So, if I was
authenticated with an SSL certificate any my distinguished name was "uid=ctaylor,dc=java-internals,dc=com", you could make the
category name "UserDebug.ctaylor". One technique for doing this is to always get an instance of a category for logging in your
application, but it depends if the user is on the debug list or not if calls go to the special log. You can put that instance of the
Category into the request attributes.

Let me know if I'm misinterpreting you.

-Chris

On Friday, February 16, 2001, at 06:50 PM, Scott M Stark wrote:


I'm looking to correlate msgs with the active thread and to have the Priority of
the thread override any Category.xxx() log msg invocation so that all log statements
in this thread of control are rendered.

The use case for this is a production J2EE server housing many EJBs, servlets, etc.
and there is a problem report for particular user interacting with one servlet. I don't
want to have to crank up the priority limit to dump out all possible msgs. I just want
to toggle a request parameter that triggers logging throughout one particular thread of
control the user is interacting with.

----- Original Message -----
From: "Christopher Taylor" <cs...@pacbell.net>
To: "LOG4J Users Mailing List" <lo...@jakarta.apache.org>
Sent: Friday, February 16, 2001 6:27 PM
Subject: Re: Using NDC to enable logging over a thread of control



Could you go into a little more detail? Do you want to correlate messages with Threads
or with clients?

-Chris

Scott M Stark wrote:


One common logging task I use frequently in server development is the ability to
enable logging across a thread of control beginning at some entry point. An example
is enabling all log msgs regardless of priority that are executed within a particular
servlet's service() method. Going through the log4j api I can't see a way to do this.
Is this possible?

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org





---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org


Re: Using NDC to enable logging over a thread of control

Posted by Christopher Taylor <cs...@pacbell.net>.
If I'm understanding your need correctly, you could probably do this in 
the following way without any code changes to Log4J:

- if the user is authenticated, you can get the principal from the 
HttpServletRequest.
- If that user has been "enabled for debugging", get an instance of a 
category for that user that is one step below a well-known debugging 
category (for example, category "UserDebug" logs to a special appender 
called "DebugUserProblems").  So, if I was authenticated with an SSL 
certificate any my distinguished name was "uid=ctaylor,dc=java-
internals,dc=com", you could make the category name 
"UserDebug.ctaylor".  One technique for doing this is to always get an 
instance of a category for logging in your application, but it depends 
if the user is on the debug list or not if calls go to the special log.  
You can put that instance of the Category into the request attributes.

Let me know if I'm misinterpreting you.

-Chris

On Friday, February 16, 2001, at 06:50 PM, Scott M Stark wrote:

> I'm looking to correlate msgs with the active thread and to have the 
> Priority of
> the thread override any Category.xxx() log msg invocation so that all 
> log statements
> in this thread of control are rendered.
>
> The use case for this is a production J2EE server housing many EJBs, 
> servlets, etc.
> and there is a problem report for particular user interacting with one 
> servlet. I don't
> want to have to crank up the priority limit to dump out all possible 
> msgs. I just want
> to toggle a request parameter that triggers logging throughout one 
> particular thread of
> control the user is interacting with.
>
> ----- Original Message -----
> From: "Christopher Taylor" <cs...@pacbell.net>
> To: "LOG4J Users Mailing List" <lo...@jakarta.apache.org>
> Sent: Friday, February 16, 2001 6:27 PM
> Subject: Re: Using NDC to enable logging over a thread of control
>
>
>> Could you go into a little more detail?  Do you want to correlate 
>> messages with Threads
>> or with clients?
>>
>> -Chris
>>
>> Scott M Stark wrote:
>>
>>> One common logging task I use frequently in server development is the 
>>> ability to
>>> enable logging across a thread of control beginning at some entry 
>>> point. An example
>>> is enabling all log msgs regardless of priority that are executed 
>>> within a particular
>>> servlet's service() method. Going through the log4j api I can't see a 
>>> way to do this.
>>> Is this possible?
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
>>> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>

Re: Using NDC to enable logging over a thread of control

Posted by Scott M Stark <Sc...@displayscape.com>.
I'm looking to correlate msgs with the active thread and to have the Priority of
the thread override any Category.xxx() log msg invocation so that all log statements
in this thread of control are rendered.

The use case for this is a production J2EE server housing many EJBs, servlets, etc.
and there is a problem report for particular user interacting with one servlet. I don't
want to have to crank up the priority limit to dump out all possible msgs. I just want
to toggle a request parameter that triggers logging throughout one particular thread of
control the user is interacting with.

----- Original Message ----- 
From: "Christopher Taylor" <cs...@pacbell.net>
To: "LOG4J Users Mailing List" <lo...@jakarta.apache.org>
Sent: Friday, February 16, 2001 6:27 PM
Subject: Re: Using NDC to enable logging over a thread of control


> Could you go into a little more detail?  Do you want to correlate messages with Threads
> or with clients?
> 
> -Chris
> 
> Scott M Stark wrote:
> 
> > One common logging task I use frequently in server development is the ability to
> > enable logging across a thread of control beginning at some entry point. An example
> > is enabling all log msgs regardless of priority that are executed within a particular
> > servlet's service() method. Going through the log4j api I can't see a way to do this.
> > Is this possible?
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: log4j-user-help@jakarta.apache.org
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
> 
> 


Re: Using NDC to enable logging over a thread of control

Posted by Christopher Taylor <cs...@pacbell.net>.
Could you go into a little more detail?  Do you want to correlate messages with Threads
or with clients?

-Chris

Scott M Stark wrote:

> One common logging task I use frequently in server development is the ability to
> enable logging across a thread of control beginning at some entry point. An example
> is enabling all log msgs regardless of priority that are executed within a particular
> servlet's service() method. Going through the log4j api I can't see a way to do this.
> Is this possible?
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org