Ruby remote logging | December 31, 2005-->
December 31, 2005
Logger:
Log listener:
# == Synopsis # # Simple remote debug class # # == Author # Stefan Saasen s@juretta.com # # == Copyright # Copyright (c) 2005 juretta.com Stefan Saasen # Licensed under the same terms as Ruby. # == Version # Version 0.1 ($Id: logger.rb 5 2006-01-01 12:51:04Z stefan $) require 'socket' require 'singleton' require 'timeout' class SimpleLogger include Singleton attr_writer :port, :host attr :session def initialize @host = "localhost" @port = 3333 # !In use: http://www.iana.org/assignments/port-numbers end def method_missing(method, *args) if method.to_s =~ /(debug|notice|info|error|warn|fatal)/i return self.log(method.to_s, args[0]) end # do nothing false end def log(level, msg) begin Timeout::timeout(1) do @session = TCPSocket.new(@host, @port) @session.puts Time.new.strftime("%Y-%m-%d %H:%M:%S") + \ " " + "[" + level.upcase + "]: " + msg + "\n" @session.close end rescue => e return false end true end end logger = SimpleLogger.instance #logger.port = 3030 logger.host = "192.168.0.10" logger.debug "debug called" logger.info "info called" logger.fatal "Fatal error"
# == Synopsis # # Log listener. # # == Usage # # ruby log_listener.rb [options] # Options: -h | --help -> show the help message # # == Version # Version 0.1 ($Id: log_listener.rb 11 2006-01-02 15:17:41Z stefan $) require 'socket' require 'optparse' require 'rdoc/usage' port = 12123 # Default port options = OptionParser.new options.banner = "Usage: ruby log_listener.rb [options]" options.on('-a', '--about', 'Show the about message') { RDoc::usage } options.on('-h', '--help', 'Show the help message') { # Show OPtions usage puts options.to_s exit } options.on('-i', '--interactive', 'Set options interactive') { print "Bitte geben Sie einen Port für den LogListener an (Default: #{PORT}): " port_input = gets.strip port = (port_input =~ /^(\d+)$/) ? port_input : port } options.on('-p', '--port PORT', 'Define the port to listen to') { |p| port = p.to_i } begin rest = options.parse(ARGV) #rescue RDoc::usage('usage') rescue => ex STDERR.puts "E: #{ex.message}" STDERR.puts options.to_s exit 1 end # Start the LogListener puts "Starting listener (localhost:#{port})\nPress \"Enter\" to stop!" server = TCPServer.new(port) server_thread = Thread.start do while (session = server.accept) puts session.gets session.close end end STDIN.gets.strip server_thread.exit exit
powerbook:~ sts$ ruby log_listener -p 3333Log Listener in java:
import java.io.*;
import java.net.*;
class LogListener {
public static void main(String argv[]) throws Exception {
String clientSentence;
// change accordingly
ServerSocket welcomeSocket = new ServerSocket(3333);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
clientSentence = inFromClient.readLine();
System.out.println(clientSentence);
}
}
}
powerbook:~ sts$ java -cp . LogListener

Stefan says:
java -classpath ./log4j-1.2.12.jar org.apache.log4j.net.SimpleSocketServer 3333 simplesocketserver.properties
server SocketServer.properties
—-—-—-—-—-—-—-—-—-—-—
-log4j.rootCategory=DEBUG,file
log4j.category.org.apache.log4j.net.SocketNode=DEBUG
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%7r %16d %t %c %x – %m%n
log4j.appender.file.MaxBackupIndex=20
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.File=./log/server.log
—-—-—-—-—-—-—-—-—-——