Hosted by
Protomatter Free Software version 1.1.8
SourceForge Project Summary Page
Released April 23, 2003.


On-Line Links:

Syslog Links:

Download Links:


Note: Mail to has been suspended, since it's now totally overrun with spam.


Third Party Libraries:

Release Notes and Change History Since 1.1.7:



Release Notes and Change History Since 1.1.6:

com.protomatter.pool.*: and com.protomatter.jdbc.pool.*:
  • Changed all references to java.util.Hashtable to be references to java.util.Map. This will not affect any old code, as Hashtable in JDK 1.2 implements Map, but it cleans up the API a bit.

  • Changed out all hard-coded strings for exceptions, etc, to be loaded from resource bundles. This will help when using the connection pool in an internationalized setting.

  • Added this package to experiment with JMX. Currently, this stuff only works with JBoss. JBoss users -- this allows you to load and configure Syslog when JBoss boots, and even has a rudimentary control panel. As of version 1.1.8, these classes have since been removed! Please use either the Jakarta Commons adapter, or the SyslogInitServlet to configure Syslog with JBoss.

  • Changed out all hard-coded strings for exceptions, etc, to be loaded from resource bundles. This will help when using Syslog in an internationalized setting.

  • Fixed a bug in detail formatting in SimpleSyslogTextFormatter (thanks to Johannes Brodwall for finding this!)

  • You can now get the current and previous file from LengthRolloverLog and TimeRolloverLog.

  • Fixed a bug in MailLog where it was not sending mail to people on the CC or BCC list, and was including the BCC header information, which it should not have been. Thanks to Louis Thomas for finding this bug.

  • Fixed a bug in BasicLogger_Helper where the name attribute wasn't really optional (which it is). Thanks to Louis Thomas for pointing this out.

  • Changed out most hard-coded strings for exceptions, etc, to be loaded from resource bundles. This will help when using this package in an internationalized setting.

  • Fixed a bug in the JavaDoc for SyslogInitServlet, which was found by Cord Focke. Thanks!


Release Notes and Change History Since 1.1.5:


  • Fixed a contention problem in the PerClassPolicy policy object that was causing messages to be dropped during very high message volumes. Sorry for not giving credit to the person who found the bug -- I lost your email!

  • Modified the DatabaseLog so that it will truncate data before attempting to write it to the database. Each field length is configurable (see the JavaDoc for more information). Also, writing the detail column to the database has been delegated to implementations of the DatabaseLogStatementAdapter. This allows different ways of setting large amounts of data, depending on what features the JDBC driver has.

  • Changed the internal values for log levels. This was done to make log masks easier to compute and to make it easier to convert to/from text representations of complex log masks. Changing these values and how log masks are interpreted should not affect anyone because the real values of these things were always hidden behind constants. Note: this will affect you if you're using the DatabaseLog logger because it has a reference table containing the explicit values of each level.

  • Allow for easier text specifications of log masks. Now, if you want to specify a log mask that lets only INFO and WARNING messages (but nothing else) pass, you can simply say "=INFO,=WARNING" when specifying the log mask. Log masks are easier to calculate in code, also. To do the same as the above using the symbolic constants on the Syslog class, you can do this: "Syslog.INFO | Syslog.WARNING" (using the binary or operator).

  • Moved policy checking out of the log() method on loggers and into Syslog itself. It simplifies the code for loggers because the log(...) method will never be called unless the chosen policy has given its blessing.

  • Separated XML configuration stuff to its own package. Due to popular demand, the base syslog classes can be compiled without any fancy XML parsers, J2EE classes, etc, etc, etc. All the XML configuration goodies have been placed in their own package: com.protomatter.syslog.xml (You will probably only ever use the SyslogXML class from this package)

    If you were doing this before:

      import com.protomatter.syslog.Syslog;
      Syslog.configure(new File("blah.xml"));

    now you need to do this:

      import com.protomatter.syslog.xml.SyslogXML;
      SyslogXML.configure(new File("blah.xml"));

    Other than that, configuration is exactly the same as before. If you're using the SyslogT3Startup class to start Syslog from inside WebLogic Server, the you don't need to do anything because the startup class takes care of everything.

    Several users had requested these changes, and they make sense. In some cases, production environments don't want to have the most bleading-edge technologies (like XML, etc) thrown around all over the place. Also, if you're deploying syslog to a Java-enabled toaster or something, you might not want all the extra libraries needed to do XML parsing. In any case, there you go. You can still configure Syslog via an XML file and get a current configuration written back out. You can also still use API calls to configure everything.

    Also, the XML parser used to parse the configuration file can now be specified using the "Syslog.xml.parser" system property. The value of that property (if used) should be set to the full classname of a SAX parser, such as "org.apache.xerces.parsers.SAXParser".

  • Added the SyslogInitServlet which allows easy configuration of syslog when a Web Application is loaded by an application server. This makes it easy to integrate Syslog with any application- or web-server that supports initializing servlets on startup (part of the Servlet 2.2 specification).

  • Modified the SimpleSyslogTextFormatter formatter so that you can specify the field width for the class name, host name, thread name and channel name sections now.

  • Added the Wl6SyslogTextFormatter formatter, which mimics the log output of WebLogic Server 6.x. The other WLS formatter (WlSyslogTextFormatter) mimics the output of WebLogic Server 4.x and 5.x.

  • Added the Channel class, which makes it easier to write messages to channels.

  • Added the PerChannelPolicy class, which is exactly like the PerClassPolicy extept that it matches regular expression sets against channel names. With the recent emphasis on channels as easy segmentation tools, this class adds a lot of flexability in the channel direction.


    Fancy JDK 1.4 Support

  • Added the SyslogHandler class, which is a JDK 1.4 java.util.logging.Handler implementation that routes log messages from the new logging API into Syslog.

    This adapter class allows you to use only JDK 1.4 logging API calls have have everything routed to Syslog without including any syslog calls in your code.

    Compiling that class with the rest of the system is a bit tricky, because it needs JDK 1.4, and the JDBC connection pooling code is currently not able to be compiled with JDK 1.4 (extra methods in JDBC). So, if you want to compile it yourself, build everything else with JDK 1.3 and then switch to JDK 1.4 and build the "compile-jdk-14" target in the build file. I'll clean this up, but for now you'll just have to deal with it. The jar file that ships has that class compiled in it.

    Also, at the risk of editorializing here, the new logging API is not very good. There's all kinds of cruft in there and my guess is that it's there because the API tries to satisfy too many people. A couple things that bug me:

    • Why do you need seven log levels? Fine, finer and finest? Huh?
    • Log entries are represented with a LogRecord class, but elsewhere it is called a log message (in the formatter).
    • LogRecord has a getMillis() method instead of something that makes sense, like getTime().
    • An int is used to represent a thread. How about its name?
    • Every object is just about as heavy-weight as it could possibly be, and it looks like object instances are wasted all over the place.
    • The new API is big on segregating things based on subsystem name (by which they almost always mean package), which is not always the best thing to do. I think flexibility is more important.

    And that's just what came to mind in the last few minutes. Still, as a colleague of mine is fond of saying "standard is better than good" -- and the new API is the standard. Still, with the adapter class, you can easily route all messages from the new API into Syslog, where you'll still have full flexibility to route messages into databases, JMS, text files, email, etc.

  • Added the JDK14SyslogTextFormatter class, which is a log formatter that uses new APIs included in JDK 1.4 to get the correct class name, method name and file line number for each log call. This is the default text formatter for systems running under JDK 1.4. Check it out -- it's pretty cool.

  • Added the JDK14PerClassPolicy class, which is an implementation of the PerClassPolicy policy class. Instead of using the ORO matcher, it uses the new JDK 1.4 regular expression matching classes.

  • Added the JDK14PerChannelPolicy class, which is an implementation of the PerChannelPolicy policy class. Instead of using the ORO matcher, it uses the new JDK 1.4 regular expression matching classes.


  • Modified the checkout() method on SimpleObjectPool so that if the beforeObjectPoolObjectCheckout() method on an ObjectPoolObject instance invalidates the pooled object before checkout, it will be evicted from the pool and another object will be used.


  • Added the pool.maxCheckoutRefreshAttempts and pool.checkoutRefreshWaitTime configuration params to the JdbcConnectionPool class. It was possible to get into an infinite loop if you had pool.validateOnCheckout set to true and database was gone. The driver just kept trying to refresh the connection forever. Thanks to Ralph Brandes for finding this bug.

  • Changed the JdbcConnectionPoolConnection class so that when it initializes, if the getCatalog() method on the underlying connection throws a SQLException we assume that you just can't get the catalog, rather than assuming the connection is broken. Sybase (and possibly other DBs) requires you to install metadata tables and stored procs to get that information, and not everyone wants to do that. Thanks to Davesh Patel for pointing this out.


  • Added the ProtoMessageEJB class which is a base class for Message Driven EJBs (part of the EJB 2.0 spec).



The Future:

Future direction for this project will include better JMX management beans for Syslog, and support for more app servers. I'd also like to add basic SNMP support so that Syslog could generate SNMP traps -- this would allow you to (among other things) monitor your apps with tools like BMC Patrol and other "enterprise" management and monitoring tools.

Send email to if you have questions.
Everything here is ©1998-2003 Nate Sammons (