log4j Appender Frage

Otz

Bekanntes Mitglied
Hallo zusammen,

für ein Projekt arbeite ich mich gerade in das Thema log4j ein.
Meine Aufgabe ist es, die von einem Server der bei uns im Netzwerk steht geworfenen Logging-Nachrichten in meiner Java Anwendung zu empfangen und dort weiter zu verarbeiten.

Dazu habe ich nun kleine Verständnisfragen die ich hoffentlich hier beantwortet bekommen 🙂

  • Welche Art von Appender muss ich hierfür verwenden?!

    So wie ich das jetzt verstanden habe, bietet ein "SocketAppender" genau diese Funktionalität. Er sendet an einen bestimmten Port seine Nachrichten udn diese kann ich dann in meiner Anwendung empfangen. odeR?!

    oder wäre ein "syslog" appender hierfür besser geeignet?
  • Und was ist eigentlich der Sinn eines RootLoggers?!

Vielen Dank
 
Zuletzt bearbeitet:
  • Welche Art von Appender muss ich hierfür verwenden?!

    So wie ich das jetzt verstanden habe, bietet ein "SocketAppender" genau diese Funktionalität. Er sendet an einen bestimmten Port seine Nachrichten udn diese kann ich dann in meiner Anwendung empfangen. odeR?!

    oder wäre ein "syslog" appender hierfür besser geeignet?
Genau deine Anwendung horcht auf einen bestimmten Port und der Server schickt seine Logs an diesen Port.

Der "SyslogAppender" ist ebenso ein "SocketAppender" schickt aber die Logs in einen bestimmten Format (siehe Dokumentation).

  • Und was ist eigentlich der Sinn eines RootLoggers?!

Du kannst eine beliebige Anzahl an Loggern definieren in deiner Anwendung.
Einer loggt nur die Datenbankzugriffe, ein andere alle UI Events.

Die Logger sind hierarchisch aufgebaut und der RootLogger ist in diesem Fall der oberste (den gibt es immer). Dieser stellt eben eine "Basiskonfiguration" zur Verfügung
 
Zuletzt bearbeitet:
ok, vielen dank. das hilft mir schonmal ein bischen weiter...

wenn ich alse dem RootLogger ein bestimmte LogLevel zuordne, dann können die anderen Logger kein "kleineres" Level auswählen oder?!

und gibt es irgendwo ein gutes beispiel in dem eine solche socket kommunikation erklärt wird?
 
Zuletzt bearbeitet:
ok, verstanden 😉

jetzt bräuchte ich nur noch ein kleines tutorial oder ein beispiel wie ich gesendete log nachrichten wieder empfangen kann. eins zum senden habe ich gefunden
 
Also, aktuell habe ich es soweit hinbekommen, dass ich auf dem Client verschiedene Log-Meldungen auslese, und diese auf dem Server auf der Console ausgebe.
Jedoch bleibt dabei immer das Programm hängen. Gibt es da ne möglichkeit, dass seperat laufen zu lassen sodass ich meine GUI noch bedienen kann?

Folgende Meldung bekomme ich dabei angezeigt:
Code:
INFO  [17:41:10.948] Listening on port 9875
INFO  [17:41:10.949] Waiting to accept a new client.


Hier mal mein Code:
Server:
Code:
	  String[] arguments = {"myPort", "src/main/resources/.../log4j.properties"};
	  SimpleSocketServer.main(arguments);

Server - log4j.properties
Code:
# Set root logger
log4j.rootLogger=info, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-5p [%d{HH:mm:ss.SSS}{GMT}] %m%n
log4j.appender.CONSOLE.threshold=info

Client
Code:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SocketAppender;

public class Main {

	private static Logger logger = Logger.getLogger(Main.class);
	static int port = 9875;

	public static void main(String[] args) {
		try {
			// PropertyConfigurator.configure("log4j.properties");

			logger.setLevel(Level.INFO);
			logger.addAppender(new SocketAppender("localhost", port));
			
			logger.debug("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");
			logger.info("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII");
			logger.warn("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW");
			logger.error("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");
			logger.fatal("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");

			System.out.println("Logged successfully !!");

		} catch (Exception e) {
			System.out.println("Failed to LOG by client : " + e.getMessage());
		}
	}
}

Client - log4j.propertes
Code:
#------------------#
# Remote appenders #
#------------------#

#The Socket Appender (log4j.properties)
log4j.rootCategory=INFO, Socket
log4j.appender.Socket=org.apache.log4j.net.SocketAppender
log4j.appender.Socket.Threshold=DEBUG
# log4j.appender.Socket.RemoteHost=192.168.31.200
log4j.appender.Socket.RemoteHost=localhost
log4j.appender.Socket.Port=9875
log4j.appender.Socket.ReconnectionDelay=5000
log4j.appender.Socket.LocationInfo=true
 
also kurzer zwischentand:

ich habe das jetzt mittlerweile soweit hinbekommen, dass ich in nem extra Thread einen SimpleSocketServer laufen habe, der von unterschiedlichen Anwendungen Log-Nachrichten empfangen kann.

Jetzt habe ich jedoch noch einen weitere Frage udn zwar ist es möglich (vieleicht durch einen bestimmten Appender) die empfangen Log-Nachrichten jeweils in einer String-Variablen zu speichern?
Also nicht wie bei einem Consolen-Appender diese auf der Console ausgeben, sondern sodass ich die Nachrichten innerhalb meines Programmcodes weiterverwenden kann!?
 

Zurück
Oben