You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tuscany.apache.org by Jean-Sebastien Delfino <js...@apache.org> on 2007/08/31 00:18:06 UTC
JDKLogger calls, was: Monitoring, logging and exceptions (again)
Raymond Feng wrote:
> I just created https://issues.apache.org/jira/browse/TUSCANY-1635 to
> track the aspectj-based tracing.
>
> Thanks,
> Raymond
>
> ----- Original Message ----- From: "Jean-Sebastien Delfino"
> <js...@apache.org>
> To: <tu...@ws.apache.org>
> Sent: Wednesday, August 29, 2007 11:06 AM
> Subject: Re: Monitoring, logging and exceptions (again)
>
>
>> Simon Laws wrote:
>>> On 8/20/07, Simon Laws <si...@googlemail.com> wrote:
>>>
>>>>
>>>> On 8/20/07, Simon Nash <nash@hursley.ibm.com > wrote:
>>>>
>>>>> See inline.
>>>>>
>>>>> Simon
>>>>>
>>>>> Raymond Feng wrote:
>>>>>
>>>>>
>>>>>> Comments inline.
>>>>>>
>>>>>> Thanks,
>>>>>> Raymond
>>>>>>
>>>>>> ----- Original Message ----- From: "Jean-Sebastien Delfino"
>>>>>> < jsdelfino@apache.org>
>>>>>> To: < tuscany-dev@ws.apache.org>
>>>>>> Sent: Friday, August 17, 2007 9:27 AM
>>>>>> Subject: Re: Monitoring, logging and exceptions (again)
>>>>>>
>>>>>>
>>>>>>
>>>>>>> [snip]
>>>>>>> ant elder wrote:
>>>>>>>
>>>>>>>
>>>>>>>> And also my 2p inline...
>>>>>>>>
>>>>>>>> ...ant
>>>>>>>>
>>>>>>>> On 8/16/07, Simon Laws < simonslaws@googlemail.com> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>> A number of different requirements have been discussed and
>>>>>>>>>
>>>>> solutions
>>>>>
>>>>>>>>> proposed. My 2p (I'm using Raymond's definitions b.t.w)
>>>>>>>>>
>>>>>>>>> Tracing: Dump out input/output/exception for method calls for the
>>>>>>>>> purpose
>>>>>>>>> of
>>>>>>>>> debugging/troubleshooting. (Target for developers/technical
>>>>>>>>>
>>>>> support)
>>>>>
>>>>>>>>> I feel that tracing of execution paths through the Tuscany
>>>>>>>>> codebase
>>>>>>>>> would
>>>>>>>>> be
>>>>>>>>> useful but agree that " it's a lot of work and will be
>>>>>>>>> difficult to
>>>>>>>>> maintain
>>>>>>>>> and keep consistent" if we did it manually. I'm happy that
>>>>>>>>> this is
>>>>>>>>>
>>>>> the
>>>>>
>>>>>>>>> responsibility of whoever wants to trace through the code and
>>>>>>>>> not a
>>>>>>>>> core
>>>>>>>>> part of the codebase. For the Tuscany developer community AspectJ
>>>>>>>>>
>>>>> have
>>>>>
>>>>>>>>> been
>>>>>>>>> proposed a couple of times and support has been prototyped. We
>>>>>>>>>
>>>>> could
>>>>>
>>>>>>>>> choose
>>>>>>>>> SLF4J as the interface through which messages are output.
>>>>>>>>>
>>>>>>>>>
>>>>>>>> I'm not sure we need to use SLF4J if we go the AspectJ route.
>>>>>>>> SLF4J
>>>>>>>>
>>>>> is a
>>>>>
>>>>>>>> facade for logging APIs, so you can code to the SLF4J API and
>>>>>>>> then
>>>>>>>> plug in
>>>>>>>> whatever logging impl you like, but if the only logging calls we
>>>>>>>>
>>>>> have
>>>>>
>>>>>>>> are
>>>>>>>> confined to a single tracing aspect we might as well just code
>>>>>>>> that
>>>>>>>> aspect
>>>>>>>> to a specific logging API like JDK logging. That avoids the extra
>>>>>>>> dependency
>>>>>>>> on SLF4J and anyone can add additional aspects if they really want
>>>>>>>>
>>>>> to
>>>>>
>>>>>>>> use a
>>>>>>>> different logger. The main other benefit of SLF4J is its
>>>>>>>>
>>>>> parameterized
>>>>>
>>>>>>>> message logging (avoids all the "if(logger.isDebugEnabled())" )
>>>>>>>> but
>>>>>>>> again if
>>>>>>>> all the logging calls are in a single aspect thats not so useful.
>>>>>>>>
>>>>>>>>
>>>>>>> Makes sense to me. If we go the aspectj route for tracing method
>>>>>>> entry/exit, I agree that using the JDK logger directly is simpler.
>>>>>>>
>>>>>>>
>>>>>> Since the aspect is on the side, we're flexible. JDK logger can be
>>>>>> default and it can be replaced easily if the embedders or users
>>>>>> choose
>>>>>> to do so.
>>>>>>
>>>>>>
>>>>>>> A few more questions on this: What dependencies will aspectj add to
>>>>>>> our distribution? aspectjweaver is more than 1Mb, do we need it?
>>>>>>>
>>>>>> I'll try to spend some time to explore both the compile-time and
>>>>>> load-time weaving.
>>>>>>
>>>>>>
>>>>>>>> What about mid-method logging of specific interesting events, for
>>>>>>>> example
>>>>>>>> the contents of requests as the enter and leave bindings and
>>>>>>>> implementation
>>>>>>>> types and things like that? That sort of logging is often all a
>>>>>>>> lot
>>>>>>>> of users
>>>>>>>> want to see not the detail tracing of every method entry/exit.
>>>>>>>> Could
>>>>>>>> we add
>>>>>>>> things like this in specific places?
>>>>>>>>
>>>>>>>>
>>>>> +1 for the ability to produce this level of information. This is my
>>>>> preferred approach for debugging or understanding how some part of
>>>>> the
>>>>> code works. Having every method entry and exit produce a trace line
>>>>> often creates a huge amount of output that obscures the essential
>>>>> details
>>>>> of what is happening.
>>>>>
>>>>>
>>>>>>> Can this mid-method logging be split in two categories?
>>>>>>>
>>>>>>> a) Debug tracing
>>>>>>> A simple solution is to split the method in two, and then leverage
>>>>>>>
>>>>> the
>>>>>
>>>>>>> entry/exit method tracing as discussed above.
>>>>>>>
>>>>> In many cases this would lead to a convoluted code structure with
>>>>> local
>>>>> variables needing to be passed as parameters between the two
>>>>> methods, or
>>>>> methods that contain a single line of code (if a trace line needs
>>>>> to be
>>>>> produced from within a loop).
>>>>>
>>>>>
>>>>>> We can use JDK logger to add statements in the middle of a method.
>>>>>>
>>>>> Then
>>>>>
>>>>>> we can use an aspect to capture such calls to dump out the
>>>>>>
>>>>> information.
>>>>>
>>>>>> For example, if we have the following statement in a method:
>>>>>> logger.debug(...);
>>>>>> The apsect can trap it by a point cut like "call *
>>>>>> java.util.logger.Logger.debug(..).
>>>>>>
>>>>>>
>>>>> If the logger call is already there, why is an aspect needed to
>>>>> trap it?
>>>>> Why not just let it execute?
>>>>>
>>>>>
>>>>>>> b) End-user readable information (info that a binding is
>>>>>>> sending/receiving a message for example)
>>>>>>> This falls into the second category discussed in this thread,
>>>>>>> reporting significant events to a management console.
>>>>>>>
>>>>>> The above suggestion should help too. The key here is to have some
>>>>>>
>>>>> calls
>>>>>
>>>>>> to indicate such requirements and they can be then trapped to
>>>>>> provide
>>>>>> the concrete logic.
>>>>>>
>>>>>>
>>>>>>> I think we're starting to see concrete solutions for (a) with
>>>>>>>
>>>>> aspectj.
>>>>>
>>>>>>> I have not seen any real concrete proposal for (b) yet.
>>>>>>>
>>>>>>> --
>>>>>>> Jean-Sebastien
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
>>>>> For additional commands, e-mail: tuscany-dev-help@ws.apache.org
>>>>>
>>>> I agree that entry and exit tracing can be overwhelming in a lot of
>>>> situations. I think this is an advantage of taking the AspectJ
>>>> approach. If
>>>> people want to add this kind of tracing then we can make that
>>>> possible with
>>>> no direct impact on the tuscany code base.
>>>>
>>>> A concrete proposal for other messages...
>>>>
>>>> I've been poking around to see what others do and, on closer
>>>> inspection,
>>>> CXF have a rather nice, IMHO, approach which is a combination of a
>>>> home
>>>> grown logging util class and the JDK logger that.
>>>>
>>>> uses parameters to reduce the formatting load for inactive log
>>>> statements
>>>> uses message property files for message lookup
>>>> encompasses basic internationalization support using ICU and the
>>>> message
>>>> files behind the scenes
>>>> handles exceptions and strings (although it doesn't localize
>>>> exception
>>>> strings)
>>>>
>>>> SLF4J does very similar things to this but we didn't seem to get much
>>>> traction with that before on this thread. It seems that we all have
>>>> different requirements for reducing dependencies vs providing logging
>>>> function. If we can reach a satisfactory level of function while
>>>> relying on
>>>> the built in JDK logging features then that seems to be a good
>>>> compromise.
>>>> Also with some home grown utilities we can at least make life a little
>>>> easier for ourselves in terms of recording user oriented messages
>>>> related to
>>>> model elements.
>>>>
>>>> Looking at the CXF code this is what you build.
>>>>
>>>> MyModule
>>>> src
>>>> main
>>>> java
>>>> somepath
>>>> SomeTuscanyClassA
>>>> Messages.properties
>>>> resources
>>>> logging.properties
>>>>
>>>> Nothing too surprising there. They have a LogUtil class (see
>>>> cxf-common-utilities) which provides an interface for getting JDK
>>>> loggers
>>>> and for logging with them. I'm assuming they created it but we
>>>> should check.
>>>> Here is an example of how to use it.
>>>>
>>>> import java.util.logging.Level;
>>>> import java.util.logging.Logger;
>>>>
>>>> import org.apache.cxf.common.logging.LogUtils;
>>>>
>>>> public class SomeTuscanyClassA {
>>>>
>>>> private static final Logger Log1 = LogUtils.getL7dLogger (
>>>> SomeTuscanyClassA.class);
>>>>
>>>> public SomeTuscanyClassA() {
>>>> Integer params[] = {8, 9, 4};
>>>>
>>>> LogUtils.log(Log1,
>>>> Level.INFO,
>>>> "TEST_MESSAGE",
>>>> null,
>>>> (Object[])params);
>>>>
>>>> Exception ex = new IllegalStateException("some exception
>>>> string");
>>>>
>>>> LogUtils.log(Log1,
>>>> Level.INFO ,
>>>> "TEST_MESSAGE",
>>>> ex,
>>>> (Object[])params);
>>>>
>>>>
>>>> }
>>>>
>>>> We could then extend this to allow for common Tuscany situations. For
>>>> example, by allowing a model element to be passed in,
>>>>
>>>> LogUtils.log(Log1,
>>>> Level.INFO,
>>>> composite, // or some other
>>>> specialization of
>>>> Base where the component name, uri can be read from
>>>> "TEST_MESSAGE",
>>>> null,
>>>> (Object[])params);
>>>>
>>>> We could then chose to use
>>>>
>>>> SEVERE
>>>> WARNING
>>>> INFO
>>>> CONFIG
>>>>
>>>> To record our end user readable information. This proposal assumes
>>>> people
>>>> are comfortable with committing to JDK logging. If people are
>>>> comfortable
>>>> with this then I don't see why we can't use.
>>>>
>>>> FINE
>>>> FINER
>>>> FINEST
>>>>
>>>> for mid method tracing.
>>>>
>>>> So is this going in the right direction? Or do people have completely
>>>> different approaches in mind?
>>>>
>>>> Regards
>>>>
>>>> Simon
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> I have noticed JDK logger statements appearing in various places in
>>>> the
>>>>
>>> code. Did we reached a conclusion on this?
>>>
>>> Simon
>>>
>>>
>>
>> Looks like System.out.println calls have been replaced by JDK logger
>> calls in revision r568417:
>> http://svn.apache.org/viewvc?view=rev&revision=568417
>>
>> I'm happy with that change, JDK logger is probably not perfect... but
>> which logger library is? Sorry for bringing that up :)
>>
>> I don't think we've reached any clear conclusion on tracing. Here's
>> my opinion:
>>
>> I'm +1 on using JDK logger;
>>
>> would prefer to avoid a home-grown logger layer on top of it (as we
>> have better things to do than grow yet another not perfect logger API);
>>
>> and I'm happy with using aspectj to generate entry/exit trace calls
>> externally without polluting the runtime source code, but I think we
>> should just provide a sample + documentation showing how to do it on
>> the side instead of embedding aspectj in our runtime.
>>
>> I don't have a firm opinion on monitoring - which is a different
>> subject IMO - yet.
>>
>> --
>> Jean-Sebastien
>>
>>
So how about we all spend a few hours going through the modules we've
been working on and add JDKLogger calls to log important events, infos,
errors (like I'm starting a component, sending a message, about to fail
etc.)?
--
Jean-Sebastien
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-dev-help@ws.apache.org