Chapter 20: Logging

This chapter deals with the logging API, which is used by Jini 2. This can be used for auditing or debugging.

20.1. Logging

Jini 2.0 introduced use of the java.util.logging package. This can be used for auditing, or possibly for debugging. The logging package allows an application to write to named logs. Typically the name of a log is a package name. For example, the log for LookupDiscovery objects is "net.jini.discovery.LookupDiscovery". Each object will write a record of its activities to the class log. These messages will have levels such as SEVERE, INFO, etc, down to FINEST. For example, LookupDiscovery objects will write these messages, among others:

  1. SEVERE if a network interface is bad or not configured for multicast
  2. INFO when any exception other than an InterruptedIOException occurs while attempting unicast discovery
  3. FINEST whenever a discovered, discarded, or changed event is sent

In order to see what is put into a log, a Handler must be added to the log. There are several supplied handlers, including:

  1. ConsoleHandler. This handler writes all log messages to the console that have INFO level or above. The format is given by the SimpleFormatter object, and just gives brief readable messages
  2. FileHandler. This handler writes all messages to a file, using an XML format. If you only want simple messages, this can be set to be a SimpleFormatter

20.2. Logging LookupDiscovery

A program to log activities of a LookupDiscovery object is given by this program, which just adds logging to the earlier MulticastRegister program

package basic;

import net.jini.discovery.LookupDiscovery;
import net.jini.discovery.DiscoveryListener;
import net.jini.discovery.DiscoveryEvent;
import net.jini.core.lookup.ServiceRegistrar;
import java.lang.reflect.*;

import java.util.logging.*;


public class MulticastRegisterLogger implements DiscoveryListener {

    static final String DISCOVERY_LOG = "net.jini.discovery.LookupDiscovery";
    static final Logger logger = Logger.getLogger(DISCOVERY_LOG);
    private static FileHandler fh;
    static public void main(String argv[]) {
	new MulticastRegisterLogger();

	// stay around long enough to receive replies
	try {
	} catch(java.lang.InterruptedException e) {
	    // do nothing
    public MulticastRegisterLogger() {
	try {
	    // this handler will save ALL log messages in the file
	    fh = new FileHandler("mylog.txt");
	    // the format is simple rather than XML
	    fh.setFormatter(new SimpleFormatter());
	} catch(Exception e) {
	// this handler will write all INFO and 
	// above messages to the console
	logger.addHandler(new ConsoleHandler());

	System.setSecurityManager(new java.rmi.RMISecurityManager());
        LookupDiscovery discover = null;
        try {
            discover = new LookupDiscovery(LookupDiscovery.ALL_GROUPS);
        } catch(Exception e) {
    public void discovered(DiscoveryEvent evt) {

        ServiceRegistrar[] registrars = evt.getRegistrars();

        for (int n = 0; n < registrars.length; n++) {
	    ServiceRegistrar registrar = registrars[n];

	    // the code takes separate routes from here for client or service
	    System.out.println("found a service locator");

    public void discarded(DiscoveryEvent evt) {

} // MulticastRegister

When this is run, a few messages will be printed to the console. A great deal more will be written to the mylog.txt file, including a line like

FINEST:     discovered locator  = jini://
whenever a lookup locator is found.

20.3. Copyright

If you found this chapter of value, the full book "Foundations of Jini 2 Programming" is available from APress or Amazon .

This file is Copyright (©) 1999, 2000, 2001, 2003, 2004, 2005 by Jan Newmarch (

Creative Commons License This work is licensed under a Creative Commons License, the replacement for the earlier Open Content License.