[kepler-dev] Logging frameworks in Kepler

Christopher Brooks cxh at eecs.berkeley.edu
Sat Dec 3 09:15:35 PST 2005


Looking at logging is a great idea.

If I'm running an application by clicking on an icon, where do the log
messages go? 

We've had a ton of problems in Ptolemy where there is a nice error
message printed to standard out, but the error message is either
lost or obscured.

Log messages are a similar sort of issue, though not as critical.

I'd probably slightly prefer to see vanilla Sun Java 1.4 logging used
without the overhead of using Apache Jakarta Commons Logging or
log4j. The reason is that Java 1.4 logging will always be there, which
could be useful for deploying smaller Java programs in a distributed
fashion.

I don't feel that strongly about this, just vaguely.

Ptolemy needs to do more with logging.  Revamping how
we listen to actors and directors could be useful.

_Christopher



--------

    Thanks Kevin - nice work! If anyone needs a brief intro (or reminder) 
    for which logging levels to use (without having to RTFM :-), here's a 
    short summary I wrote in a previous lifetime:
    
    -----------------
    
    You can debug using one of 5 methods, depending on the level of severity:
       log.fatal(String msg);
       log.error(String msg);
       log.warn(String msg);
       log.info(String msg);
       log.debug(String msg);
    
    Severity levels are as follows (in decreasing order of severity and 
    increasing frequency of usage):
    
    FATAL level designates very severe error events that will presumably
           lead the application to abort.
           EXAMPLE >> Use this just before you do a System.exit(1)
    
    ERROR level designates error events that might still allow the
           application to continue running.
           EXAMPLE >> Use this when you catch an exception
    
    WARN  level designates potentially harmful situations.
           EXAMPLE >> If something happens that isn't critical, but may make
           the software misbehave
    
    INFO level designates informational messages that highlight the progress
           of the application at coarse-grained level.
           EXAMPLE >> When "milestone" events occur. This would be the
           default level for development when not debugging. Show restraint
           when using "info" - otherwise printouts cause information overload
    
    DEBUG Level designates fine-grained informational events that are most
           useful to debug an application.
           EXAMPLE >> use for all other printouts of minutae that are
           interesting only to someone who is specifically debugging the app.
           Preferred level, unless you have a good reason for going higher.
    
    
    -- 
    
    ---------------------------------------------
    Matthew Brooke, Ph.D.
    Marine Sciences Research Building, Room #3407
    University of California
    Santa Barbara, CA  93106-6150
    ph: (805) 893-7108   fx: 805-893-8062
    brooke at nceas.ucsb.edu
    ---------------------------------------------
    
    
    Kevin Ruland wrote:
    > Hi.
    > 
    > As some of you know, we are using some 3rd party jars which require use
    > of the Apache Jakarta Commons Logging
    > http://jakarta.apache.org/commons/logging/index.html system.  In
    > particular this package is required by the Jena code used within SMS. 
    > To make a long story short, we have the facilities to do runtime
    > configurable logging so we might as well take advantage.
    > 
    > Towards this end, I played around with this a little this morning and
    > have found a way to use and configure it when running Kepler.  There are
    > two parts required to use it:  the java code must use the proper API
    > when issuing logging messages, and the runtime system must have access
    > to the proper configuration files.
    > 
    > Commons logging is a unified api to mutliple backend logger
    > implementations.  It supports log4j, jdk1.4 built in logging, and a
    > couple of others.  Since we have to have log4j (used by other jar files)
    > this is the most natural back end to use.  In order to have
    > commons-logging configure log4j you only need to have a log4j.properties
    > file in the classpath.  One easy place to put this is in build/classes
    > and it will be loaded when you do ant run-dev.  I have gone so far as to
    > change my build.xml to automatically copy this file to the correct place
    > each time I do a run-dev.
    > 
    > I have committed a simple log4j.properties file which can be used as an
    > example.  This particular file logs to CONSOLE (stdout) and only logs
    > messages with priority > WARN (warn, error, fatal).  It formats the
    > messages nicely.  You can peruse
    > http://logging.apache.org/log4j/docs/manual.html to learn a little more
    > about log4j if you wish.  You can adjust the log verbosity by changing
    > the default log level (first line), or you can change it for particular
    > categories of log messages.  I have found Jena to be very noisy (and not
    > helpful) so I put this line in my local log4j.properties:
    > 
    > log4j.logger.com.hp.hpl.jena=WARN
    > 
    > Finally, to use Commons Logging in a java class you need to:
    > 
    > 1) Import the commons logging classes.
    > 
    > import org.apache.commons.logging.Log;
    > import org.apache.commons.logging.LogFactory;
    > 
    > 2) In the class create a static variable to hold the logger:
    > 
    > private static Log logger = LogFactory.getLog( <category> );
    > 
    > here <category> is a string which represents the logging category.  Many
    > people like each java class to define a different category so you would
    > replace <category> with Classname.class.getName().  However, it might be
    > beneficial to have multiple classes log to the same 'logical category'
    > in which case all those classes should use the same category string. 
    > For example, Matthew's xml/svg icon stuff might want to log everything
    > to a single category called "org.kepler.XMLIcons".  Or whatever.
    > 
    > 3)  Whenever you want to issue a diagnotic message call the logger method
   s:
    > 
    > logger.debug( "Here is a debug message");
    > 
    > The commons-logging user guide
    > http://jakarta.apache.org/commons/logging/guide.html has some
    > suggestions about using code guards when the arguments require some
    > computation, and also lists the available logging methods.  These
    > methods take either an Object (on which it calls toString()), or an
    > Object and a Throwable.  The Throwable will be used to print a stack trac
   e.
    > 
    > I think runtime configuration of logging is in generate A Good Thing
    > (tm) and can help people focus on the problems in specific pieces of code
   .
    > 
    > Kevin
    > _______________________________________________
    > Kepler-dev mailing list
    > Kepler-dev at ecoinformatics.org
    > http://mercury.nceas.ucsb.edu/ecoinformatics/mailman/listinfo/kepler-dev
    _______________________________________________
    Kepler-dev mailing list
    Kepler-dev at ecoinformatics.org
    http://mercury.nceas.ucsb.edu/ecoinformatics/mailman/listinfo/kepler-dev
--------


More information about the Kepler-dev mailing list