Using log4j to log messages to the TCP/IP stream
December 20, 2007
Filed under Uncategorized
Tags: code, java, log4j, logging, SocketAppender
Overview
Using org.apache.log4j.net.SocketAppender to log messages to a socket. The idea is that, incoming messages can be interpreted and possibly displayed graphically. What follows is a quick and dirty approach.
log4j.properties
log4j.appender.socket=org.apache.log4j.net.SocketAppender log4j.appender.socket.port=56445 log4j.appender.socket.remoteHost=localhost log4j.rootCategory=all, socket
SocketLoggerTest.java
package com.filler.l4j;
import org.apache.log4j.Logger;
public class SocketLoggerTest
{
private static Logger log = Logger.getLogger(SocketLoggerTest.class);
public static void main(String args[])
{
log.trace("tracing you, because you are idiot");
log.debug("no more debugs");
log.info("do you want information");
log.warn("warning up");
log.error("to err is computer");
log.fatal("fat al");
}
}
SocketLoggerListener.java
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.EOFException;
import java.io.IOException;
import org.apache.log4j.spi.LoggingEvent;
public class SocketLoggerListener
{
public static void main(String args[]) throws IOException
{
final ServerSocket serverSocket = new ServerSocket(56445);
final Socket socket = serverSocket.accept();
serverSocket.close();
final InputStream is = socket.getInputStream();
final ObjectInputStream ois = new ObjectInputStream(is);
while(true) {
final Object o;
try { o = ois.readObject(); }
catch(EOFException eofe) { break; }
catch(ClassNotFoundException cnfe) { continue; }
if(o instanceof LoggingEvent) {
final LoggingEvent logEvent = (LoggingEvent) o;
processEvent(logEvent);
}
}
ois.close();
socket.close();
}
public static void processEvent(LoggingEvent logEvent)
{
System.out.print("[" + logEvent.getLevel() + "] ");
System.out.println(logEvent.getMessage());
}
}
Running on Linux
javac -classpath log4j.jar:./ SocketLoggerListener.java java -classpath log4j.jar:./ SocketLoggerListener
This will make the ServerSocket listen to the port. Now, use
javac -classpath log4j.jar:./ -d ./ SocketLoggerTest java -classpath log4j.jar:./ com.filler.l4j.SocketLoggerTest
Running on Windows
javac -classpath log4j.jar;./ SocketLoggerListener.java java -classpath log4j.jar;./ SocketLoggerListener
This will make the ServerSocket listen to the port. Now, use
javac -classpath log4j.jar;./ -d ./ SocketLoggerTest java -classpath log4j.jar;./ com.filler.l4j.SocketLoggerTest
Better use an ant build file to do the job elegantly.