Hallo,
ich möchte in meinem Programm bestimmte Aktionen loggen. Geloggt werden soll es unter den Syslog logs von Linux (Ubuntu).
Im Internet gab es vorgefertigte Klassen dafür. Habe mir diese runtergeladen und versucht auszuführen. Was allerdings fehlschlägt.
Er gibt mir jedesmal die Exception "ICMP Port unreachable". Das bedeutet doch, er könne zum Port 514 keine Verbindung aufbauen, da er nicht geöffnet sei!?
Jedenfalls kann ich manuell in der Shell ohne Probleme etwas loggen, auch wenn ich den Parameter -d (dass die Nachricht als Datagram geschickt wird) mit angebe.
Ich verstehe nicht, warum der Code (Benutzerdefiniertes Logging: Syslog) bei mir nicht funktioniert. Habe im Internet schon nach der Exception geschaut, werde aber nicht schlau daraus.
Würde mich sehr freuen wenn ihr mir helfen könntet.
Hier der Code
DatagramHandler:
SyslogFormatter:
Main:
Meine Exception:
[XML]java.util.logging.ErrorManager: 1: ICMP Port Unreachable
java.net.PortUnreachableException: ICMP Port Unreachable
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:629)
at DatagramHandler.publish(DatagramHandler.java:61)
at Main.main(Main.java:32)[/XML]
ich möchte in meinem Programm bestimmte Aktionen loggen. Geloggt werden soll es unter den Syslog logs von Linux (Ubuntu).
Im Internet gab es vorgefertigte Klassen dafür. Habe mir diese runtergeladen und versucht auszuführen. Was allerdings fehlschlägt.
Er gibt mir jedesmal die Exception "ICMP Port unreachable". Das bedeutet doch, er könne zum Port 514 keine Verbindung aufbauen, da er nicht geöffnet sei!?
Jedenfalls kann ich manuell in der Shell ohne Probleme etwas loggen, auch wenn ich den Parameter -d (dass die Nachricht als Datagram geschickt wird) mit angebe.
Ich verstehe nicht, warum der Code (Benutzerdefiniertes Logging: Syslog) bei mir nicht funktioniert. Habe im Internet schon nach der Exception geschaut, werde aber nicht schlau daraus.
Würde mich sehr freuen wenn ihr mir helfen könntet.
Hier der Code
DatagramHandler:
Java:
public class DatagramHandler extends Handler {
DatagramSocket socket;
SocketAddress address;
InetAddress i;
int p;
/**
* Erzeugt einen DatagramHandler, der seine Eintr�ge an einen
* bestimmten Host und Port schickt.
*/
public DatagramHandler(String host, int port) throws SocketException, UnknownHostException {
// Erzeuge DatagramSocket mit Verbindung zum Logging-Host
socket = new DatagramSocket();
address = new InetSocketAddress(host, port);
socket.connect(address);
}
/**
* Schlie�t den zugrundeliegenden Socket.
*/
public void close() {
// Schlie�en des Socket
socket.close();
}
public void flush() {
// Leeren von Puffern nicht notwendig,
// da alle Daten direkt geschrieben werden.
}
/**
* Schreibt den �bergebenen LogRecord zum Ziel.
*/
public void publish(LogRecord rec) {
if (isLoggable(rec)) {
try {
// Formatiere Nachricht
Formatter formatter = getFormatter();
String message = formatter.format(rec);
byte[] data = message.getBytes();
// Addressiere Paket und setze Daten
DatagramPacket packet = new DatagramPacket(data, data.length, address);
// Verschicke das Paket
socket.send(packet);
} catch (Exception ex) {
reportError(ex.getMessage(), ex,
ErrorManager.WRITE_FAILURE);
}
}
}
}
SyslogFormatter:
Java:
public class SyslogFormatter extends Formatter {
private static SimpleDateFormat dateFormatter;
private static Map levelMap;
String hostname;
static {
// F�lle Puffer mit Zuordnungen von Java-Log-Levels zu
// Syslog-Priorit�ten. Die Syslog-Priorit�t berechnet sich
// aus Facility * 8 + Severity. Als Facility wird "User-Level"
// vorausgesetzt (Wert 1).
levelMap = new HashMap();
// Error-Message
levelMap.put(Level.SEVERE, "11");
// Warning-Message
levelMap.put(Level.WARNING, "12");
// Information-Message
levelMap.put(Level.INFO, "14");
// Config-Messages gibt es in Syslog nicht, deshalb
// werden sie als Information-Message behandelt
levelMap.put(Level.CONFIG, "14");
// Debug-Messages
levelMap.put(Level.FINE, "15");
levelMap.put(Level.FINER, "15");
levelMap.put(Level.FINEST, "15");
// Initialisiere Datum-Formatierer mit Syslog-Format
dateFormatter = new SimpleDateFormat("MMM dd HH:mm:ss");
}
public SyslogFormatter() throws UnknownHostException {
// Hole lokale Adresse zum sp�teren Einbauen in
// die formatierte Nachricht.
InetAddress localhost = InetAddress.getLocalHost() ;
hostname = localhost.getHostName();
}
/**
* F�hrt die Formatierung des �bergebenen Log-Eintrags durch und gibt
* den formatierten Eintrag zur�ck.
*/
public String format(LogRecord rec) {
StringBuffer message = new StringBuffer();
try {
// Priorit�t
message.append("<");
message.append(levelMap.get(rec.getLevel()));
message.append(">");
// Datum
message.append(dateFormatter.format(new Date(rec.getMillis())));
message.append(" ");
// Hostname
message.append(hostname);
message.append(" ");
// Message
message.append(rec.getSourceClassName());
message.append(".");
message.append(rec.getSourceMethodName());
message.append(": ");
message.append(rec.getLevel());
message.append(" ");
message.append(rec.getMessage());
message.append("\n");
} catch (Exception ex) {
ex.printStackTrace();
}
// Syslog Nachrichten sind max. 1024 Bytes lang
if (message.length() > 1024) {
return message.substring(0, 1024);
}
return message.toString();
}
}
Main:
Java:
public class Main {
public static void main(String args[]) {
try {
Logger logger = Logger.getLogger("");
Handler h = new DatagramHandler("127.0.0.1",514);
h.setFormatter(new SyslogFormatter());
logger.addHandler(h);
logger.info("Syslog setup OK");
LogRecord lr = new LogRecord(Level.parse("14"), "Abgeschickt");
h.publish(lr);
} catch (SocketException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnknownHostException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Meine Exception:
[XML]java.util.logging.ErrorManager: 1: ICMP Port Unreachable
java.net.PortUnreachableException: ICMP Port Unreachable
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:629)
at DatagramHandler.publish(DatagramHandler.java:61)
at Main.main(Main.java:32)[/XML]