# log4j Appender Frage



## Otz (5. Mai 2015)

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


----------



## Joose (5. Mai 2015)

Otz hat gesagt.:


> 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).



Otz hat gesagt.:


> 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


----------



## Otz (5. Mai 2015)

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?


----------



## Joose (5. Mai 2015)

Otz hat gesagt.:


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



Doch, aber wenn du einem anderen Logger keines zuweist wird normalerweise das vom RootLogger übernommen


----------



## Otz (5. Mai 2015)

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


----------



## Otz (5. Mai 2015)

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:

```
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:

```
String[] arguments = {"myPort", "src/main/resources/.../log4j.properties"};
	  SimpleSocketServer.main(arguments);
```

Server - log4j.properties

```
# 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

```
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

```
#------------------#
# 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
```


----------



## Otz (7. Mai 2015)

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!?


----------

