Lightweight web application logging on tomcat 6

Some Days ago, I had to refactor a web application to make it fit for production. The existing code was more like a proof-of-concept, not really an application. Especially the logging part was a mess.
In this post I will explain the improvements and also simplifications I made for the logging.

The requirements were quite simple: Log was happen and send an email if an exception occurs.
After study the existing Sourcecode I found in the web-application:

  • Used Log4J component
  • Own programmed Loghandler
  • JavaMail component

My simplification: kick them all out!
All requirements can be accomplished with functions from JDK and the usage of tomcat.

java.util.logging.Logger

Maybe early the java standard logger was limited and log4j was/is great, but since I’m coding in java, I could fulfill all logging requirements with the java standard logger API.

So I added to all class with a logging method a new logger field as follow:

private static transient Logger logger = Logger.getLogger(MyClass.class.getName());

transient because some classes are ‘’Serializable’’ and the logger don’t have to be persistent.

Next part, was to rewrite the logging statements

logger.log(Level.SEVERE, ex.toString());
// or
logger.log(Level.FINE, "MyMessage ({0}): {1}", new Object[]{id, myObject.getText()});

Until now, it was straightforward.

logging.properties – the configuration file

This can be a bit wired. Because of the major limitation of the jdk implementation (configure the logging per web-application), tomcat us JULI. With the JULI implementation, you can configure logging at a variety of levels

  • Globally for the JVM ($JAVA_HOME/jre/lib/logging.properties)
  • Per Tomcat Runtime instance ($TOMCAT_HOME/conf/logging.properties)
  • Per Web Application (WEB-INF/classes/ logging.properties)

At each level you can use a logging.properties file to configure logging granularity.

The default tomcat logging.properties file ($TOMCAT_HOME/conf/) specifies two types of handlers: ConsoleHandler for routing logging to stdout and a FileHandler for writing to a file.

When you configure the logging.properties file for tomcat instance or web application, you use a similar configuration as that of the JDK logging.properties file. You can also specify additional extensions to allow better flexibility in assigning loggers. Some Hints:

  • Declare a list of handlers using handlers
  • Set handlers for the root logger using the .handlers property
  • define a list of handlers using the loggerName.handlers property
  • Use the handlerName.level property to specify the level of logging you want for a given handler
  • System property replacement for property values expressed using the format ${systemPropertyName}

See the example config file on the end of this blog entry. This should clarify this above.

Email send

Next step what I had to re-implement (or configure) was sending emails, when an exception occur. Fortunately it exists a smtphandler for the java.util.logging library (smtphandler). It uses the JavaMail API to communicate with the SMTP server. Because of that, I had to copy the library smtphandler-0.7.jar, mailapi.jar, smtp.jar, activation.jar in the endorsed folder of tomcat (see java.endorsed.dirs property). You find them on the smtphandler page or with your favorite search engine.
After that, I had to set the smtphandler as a new log handler and configure it. That’s all.
See the example config file on the end of this blog entry. This should clarify this above.

Console output

The tomcat server will run as a service on a solaris system. No one will sit in front of a console and follow the stdout (or read the catalina.out file). For a better performance the console handler can be removed. From

handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

To

.handlers = 1catalina.org.apache.juli.FileHandler

That stops anything getting written to catalina.out – file.

Log Level

You can set a various log level in the logging.properties files (ALL, SEVERE,… ,FINEST, OFF). Enabling logging at a given level also enables logging at all higher levels. In general, the lower level of logging you enable, the more data is written to the log files, so be careful when setting the logging level very low.

To configure the applications log level, set the level property of the specific handler (f.e. 10aailogin.org.apache.juli.FileHandler.level = FINEST. It is possible to configure the log level for each package or class. ch.enterpriselab.login.level = INFO. The log level of the handler has to be lower than that of the package or class.

Example Configuration Files

For better readability on blog page, I omit all standard comment line

$TOMCAT_HOME/conf/logging.properties

The most part was untouched from the default file.

# Created tdmarti, HSLU T&A - D3S (2011)
handlers =  1catalina.org.apache.juli.FileHandler, 
            2localhost.org.apache.juli.FileHandler, 
            3manager.org.apache.juli.FileHandler, 
            4host-manager.org.apache.juli.FileHandler, 
            java.util.logging.ConsoleHandler
 
.handlers = 1catalina.org.apache.juli.FileHandler
 
1catalina.org.apache.juli.FileHandler.level = SEVERE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
 
2localhost.org.apache.juli.FileHandler.level = SEVERE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
 
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
 
4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler

WEB-INF/classes/ logging.properties

# Created tdmarti, HSLU T&A - D3S (2011)
handlers =  10webappname.org.apache.juli.FileHandler, 
            smtphandler.SMTPHandler
.handlers = 10webappname.org.apache.juli.FileHandler, 
            smtphandler.SMTPHandler
 
## Define my webapplication logger
#Set the log level
10aailogin.org.apache.juli.FileHandler.level = FINEST
10aailogin.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
10aailogin.org.apache.juli.FileHandler.prefix = webappname.
10aailogin.org.apache.juli.FileHandler.limit = 5242880
10aailogin.org.apache.juli.FileHandler.count = 5
 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/secure].level = FINEST
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/secure].handlers = 10webappname.org.apache.juli.FileHandler
 
#Set the log level per package
ch.enterpriselab.login.level = INFO
 
smtphandler.SMTPHandler.level=SEVERE
smtphandler.SMTPHandler.smtpHost=mta.mymta.com
smtphandler.SMTPHandler.to=admin@mymta.com
smtphandler.SMTPHandler.from=webapp@mymta.com
smtphandler.SMTPHandler.subject=[SMTPHandler] Application message
smtphandler.SMTPHandler.bufferSize=512
smtphandler.SMTPHandler.formatter=java.util.logging.SimpleFormatter

How can you reduce employee’s productivity

In my work environment with various young engineers there are some incidents which act as a work interrupt. Almost every work will be put aside for a (short certainly) while. Here the top 5 which I have observed the last 2-3 months in our department

  • New Hardware likes an smartphone, tablet, input devices, Pandora (console), embedded devices (thanks to the main gadgets provider)
  • Beta programs (“invite me”, “invite me”, …and then “We’ve temporarily exceeded our capacity” – *grrrr*
  • A defect on the coffee machine (greeting to Antoine ;-) )
  • Women walking through the office (sadly women are still very rare in this domain – why?)
  • Some snacks/cakes on the coffee table

The reason for this post: I’m now a “google+” user and want to buy an “Arduino” based development kit, like this from seeed studio instead of writing a blog post about logging in apache tomcat with a java based web application. Maybe it comes later…

2011-07-09 | Posted in: D3S, work | Comments Closed

Patentstreitigkeiten – die Verlierer sind wir!

Wer hat’s erfunden? Als stolze Schweizer würden wir diese Frage selbsverständlich wie die weltweilt berühmte Ricola-Werbung beantworten. Doch für einmal scheint dies nicht der Fall zu sein. Früher waren Patente eine tolle Methode in einem Land sein Produkt davor zu schützen, dass es von einem anderen Hersteller kopiert oder teilweise übernommen wurde. Das funktionierte in den 60er Jahren warscheinlich sogar sehr gut, da der Weltmarkt noch nicht so globalisert und Wissen noch nicht wie heute so schnell übers Internet verbreitet werde konnte. Durch diese Globalisierung ist der Konkurrenzdruck und insbesondere dabei auch der Zeitdruck auf Neuentwicklungen so stark angestiegen, dass es heute oft schwierig ist, ohne jeden Zweifel festzustellen wer was erfunden hat, oder dann, wer wem abgeschaut hat. Es ist ein Dilemma in welchem sich die nationalen Justizsysteme in dieser Frage befinden. Ich nenne es auch oft, das Ricola-Dilemma.

In den letzten Jahren beginnt mich eine Entwicklung sehr zu beunruhigen. Nahmhafte Firmen im IT-Bereich beginnen damit, riesige jurstische Abteilungen zu gründen, welche den ganzen Tag nichts anderes tun, als anderen Firmen auf die Finger zu schauen, und sie so schnell wie nur möglich vor Gericht zu bringen, wenn etwas auch nur im entfertnesten ähnliches auf den Markt kommt, was sie bereits mit einem Patent geschützt haben. Den jüngsten und warscheinlich bald grössten Urheberrechtsstreit fechten gerade der amerikanische IPhone-Hersteller Mac und der südkoeranische Technologiekonzern Samsung aus. Samsung wurde von Mac vor einem US-amerikanischen Gericht verklagt, weil der Konzern mehr als 20 Patente des mobilen Betriebssystems IOS verletzt habe.

Als Antwort darauf kauft sich Samsung die Firma S3 Graphics welche in einem Rechtsstreit wegen zwei Patentverletzungen gegen Mac auftritt und macht sich damit vom Verklagten zum Kläger. Solche Paktiken scheinen in sich in der SmartPhone-Banche langsam aber sicher einzubürgern, bezahlt doch der taiwanesische SmartPhone-Hersteller HTC pro SmartPhone 5 Dollar Lizenzgebühren an Microsoft, wenn Googles OS Android auf dem Gerät installiert wurde.

Warscheinlich geht es noch anderen so wie mir: Ich habe die Nase voll davon in den IT-News zu lesen, welcher Softwarekonzern wieder den Konkurrenten verklagt. Was diese Grossfirmen jedoch in ihrem Patent-Wahn zu vergessen scheinen ist, dass Innovation nicht vor Gericht stattfindet, sondern auf dem Markt und in den Labors all jener Firmen, welche verstanden haben, dass sie auf Innovation setzen müssen, und nicht auf Patente.

Wir als Kunden interessieren in diesen Rechtsstreitigkeiten peripher warschienlich jedoch überhaupt nicht. In diesem Rechtsstreitigkeiten geht es nur um eines: Den Hochmut der IT-Riesen. Wie sagt man so schön: Hochmut kommt vor dem Fall!
Wir als Kunden verlieren bei diesen Streitereien hingegen doppelt: Die beiden klagenden Parteien müssen ihre exorbitanten Anwaltskosten mittels total überhöhten Preise Ihrer Produkte wieder berappen und die Geräte, welche wir dann trotzdem (blauäugig wie der Durchschnittbenutzer halt ist) zu diesen Preisen kaufen sind kaum noch innovativ – geschweigen denn mit kreativen neuen Lösungen ausgestattet.

Ich empfehle den grossen IT-Konzernen wie MAC, Microsoft, Google, HTC, Samsung und all jenen, welche ich hier nicht aufführe, wieder in Innovation zu investieren (Mac investierte in den letzten Jahren im Verhältniss zu ihrem Umsatz immer weniger in Innovation und Forschung!) und nicht mehr in Gerichtsverfahren. Legen Sie sich wieder einen Stolz zu und freuen sie sich darüber wenn Ihre Firma innovativ ist. Patente haben keinen Wert, das einzige was in der schnellebigen IT-Branche einen Wert hat, sind innovative Mitarbeiter. Doch Juristen – so wichtig sie für unser Zusammenleben auch sein mögen – sind nicht innovativ.