# Eclipse Klasse (org.slf4j.impl.StaticLoggerBinder)



## Crusha (9. Mai 2014)

Hi,

ich versuche gerade ein OpenSource Java Programm für Battleye Client in Eclipse einzufügen und auszuführen, aber leider kommt diese Fehlermeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See SLF4J Error Codes for further details.

Bei dem Paket lag schon die slf4j-api-1.7.5.jar bei und ich habe die aktuelle auch schon heruntergeladen und zu den Libraries hinzugefügt, aber leider kommt immer wieder der Fehler.

In der einen Datei habe ich auch gesehen das die Library so "import org.slf4j.LoggerFactory;" am Anfang drin steht, obwohl die slf4j.jar Library ILoggerFactory.class heißt. Ist das normal ?


Das Programm habe ich von hier: https://github.com/deadfred666/ber4j

Ich arbeite noch nicht sehr lange mit Eclipse, aber hätte denn bitte jemand ein paar Tipps wo evtl der Fehler liegt ohne mich gleich zu steinigen ?

Danke im voraus


----------



## turtle (10. Mai 2014)

> In der einen Datei habe ich auch gesehen das die Library so "import org.slf4j.LoggerFactory;" am Anfang drin steht


Ist auch richtig so.

slf4j ist eine Facade für ein beliebiges Logging-Toolkit;also beispielsweise log4j oder  java.util.logging oder...

Die Fehlermeldung  besagt, das slf4jkeine Konfiguration für das zu nutzende Logging-Toolkit gefunden oder falsch eingerichtet ist. 

Möchtest du beispielsweise log4j als Logging-Tool einsetzen, musst du slf4j-log4j12*.jar und log4j zum Classpath hinzunehmen und natürlich log4j-konform eine log4j.properties anlegen.



> obwohl die slf4j.jar Library ILoggerFactory.class heißt. Ist das normal ?


Ist auch richtig so.


----------



## Crusha (10. Mai 2014)

Ok danke, ich habe mal die slf4j-log hinzugefügt, aber dann wird das mit den Fehlermeldungen nur noch schlimmer glaub ich ^^:


Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NoClassDefFoundError: org/apache/log4j/Level
	at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
	at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
	at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
	at arma.ber4j.BattlEyeClient.<clinit>(BattlEyeClient.java:22)
	at arma.ber4j.Main.main(Main.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Level
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 7 more
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Level
	at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
	at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
	at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
	at arma.ber4j.BattlEyeClient.<clinit>(BattlEyeClient.java:22)
	at arma.ber4j.Main.main(Main.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Level
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 7 more


Kann es sein das ich das Java Projekt (https://github.com/deadfred666/ber4j) vielleicht falsch hinzugefügt habe ? Habe das src Paket von der Seite ins Projekt "kopiert" und die library "slf4j-api-1.7.5.jar" auch eingestellt, aber dort ist noch ein Ordner ".idea" mit dem ich nichts anfangen konnte. Liegt es vielleicht daran das der Ordner nicht mit enthalten ist, dass die Fehlermeldungen kommen ? 
Sorry nochmal für die doofen fragen. Habe derzeit nur mit swt wegen der Uni gearbeitet.


----------



## turtle (11. Mai 2014)

> Ok danke, ich habe mal die slf4j-log hinzugefügt, aber dann wird das mit den Fehlermeldungen nur noch schlimmer glaub ich ^^:


na ja, wie mans nimmt

Fehlermeldung ist aber eindeutig, oder


> java.lang.*NoClassDefFoundError*: org/apache/log4j/Level


Wie ich in meinem Post geschrieben habe


> musst du slf4j-log4j12*.jar und *log4j *


Du hast anscheinend den ersten Teil gemacht, den zweiten aber vergessen

Damit log4j loggen kann, musst du (natürlich) die Library deinem Projekt hinzufügen. Bei log4j1 ist das wenn ich mich nicht irre, aktuell die Version 1.2.17. Aber eine andere 1.2er Version sollte es auch tun.


----------



## Crusha (11. Mai 2014)

Oh ok sry stimmt, überlesen. Also ich habe von der log4j die Version 1.7.7. Habe davon das "*import org.slf4j.impl.Log4jLoggerFactory;*" noch hinzugefügt, aber das wird von Eclipse schon erkannt das dies "*unused*" ist und es kommen leider weiterhin die Fehlermeldungen.


----------



## turtle (11. Mai 2014)

ich sehe nicht wo log4j*.jar als Referenced Library erscheint???:L

Ich sehe slf4j-log4j12-1.7.7.jar (gut) und slf4j-api-1.7.5.jar (gut), aber kein log4j-1.2.17.jar (schlecht)


----------



## Crusha (11. Mai 2014)

turtle hat gesagt.:


> ich sehe nicht wo log4j*.jar als Referenced Library erscheint???:L
> 
> Ich sehe slf4j-log4j12-1.7.7.jar (gut) und slf4j-api-1.7.5.jar (gut), aber kein log4j-1.2.17.jar (schlecht)



Ok ich dachte slf4j-log4j12 und log4j wären die gleichen Dateien. Die log4j ist jetzt auch drin und habe "*import org.apache.log4j.*;*" hinzugefügt und jetzt kommt nur noch: 

log4j:WARN No appenders could be found for logger (arma.ber4j.BattlEyeClient).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See Apache log4j 1.2 - Frequently Asked Technical Questions for more info.
onDisconnected: ConnectionFailed

als Fehlermeldung.

Laut Galileo Java Insel (Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 25 Logging und Monitoring) müsste ich jetzt eine log4j.properties anlegen. Ist das soweit richtig ? Wenn ja wo muss ich die jetzt noch hinpacken bzw zuweisen ?



*@EDITH: Ok ich habe einfach mal darum gespielt. Die log4j.properties habe ich zu dem Package Verzeichnis hinzugefügt und es kommt jetzt nur noch:

0    [ber4j receive data thread] DEBUG arma.ber4j.BattlEyeClient  – connection failed to /46.4.25.176:2302
onDisconnected: ConnectionFailed

Liegt das daran das die properties jetzt falsche Einstellungen hat ?*


----------



## turtle (11. Mai 2014)

> Ok ich dachte slf4j-log4j12 und log4j wären die gleichen Dateien.


Diesen Eindruck hatte ich auch, das du nicht genau verstanden hast, was slf4j überhaupt macht.

Wie ich "andeutete" ist slf4j ein Facade, die nach aussen (deiner Applikation) eine API anbietet. ("import org.apache.log4j. ist daher wahrscheinlich unnötig). 

Welches reale Logging-Toolkit tatsächlich verwendet wird, ist völlig transparent. 

Dies ist deshalb interessant, weil deine bisherige Applikation bereits mit log4j arbeitete. Nun möchtest du ja nicht, nur weil da eine andere Lib hinzukommt, dieses komplett umstellen, nur weil diese Lib mit einem anderen Framework loggt. Und daher kann sl4j eingesetzt und eingerichtet werden, das es weiterhin mit log4j zusammenarbeitet.

Also hast du *SOWOHL *slf4j und weil slf4j an log4j delegieren soll, die "Brücke" slf4j-log4j12-1.7.6.jar aus dem slf4j Paket, *ALS AUCH* log4j selbst, weil ja diese Bibliothek das eigentliche Logging tun soll.

Zu deiner Fehlermeldung:


> log4j:WARN No appenders could be found for logger (arma.ber4j.BattlEyeClient).
> log4j:WARN Please initialize the log4j system properly.
> log4j:WARN See Apache log4j 1.2 - Frequently Asked Technical Questions for more info.


Diese Meldung (von log4j) sagt aus, das es keine Konfiguration gefunden hat. 

Gut ist, das log4j anscheinend via slf4j richtig angesprochen wird, schlecht da offensichtlich keine log4j-Konfiguration gefunden wird.

Ich bevorzuge bei log4j1 immer die Konfiguration über die Datei *log4j.properties*. Diese muss im Classpath gefunden werden können.

Ich schreibe häufig ein kleines Miniprogramm um zu testen, ob log4j "zufrieden" ist.

```
private static Logger logger = Logger.getLogger(MinProg.class);

	public static void main(String[] args) {
		logger.info("Hello World");
	}
```




> onDisconnected: ConnectionFailed


Diese Meldung sagt mir nix.


----------



## turtle (11. Mai 2014)

Poste mal bitte deine log4j.properties


----------



## Crusha (11. Mai 2014)

turtle hat gesagt.:


> Poste mal bitte deine log4j.properties



Hatte jetzt nochmal google gefragt und habe über diese Seite: 

log4j.properties example

dies einfach damit mal getestet:

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Ich denke mal es funktioniert soweit jetzt alles, weil als "Fehlermeldung" kommt jetzt noch (aber vom Skript aus) nur noch: "*onDisconnected: ConnectionFailed*", obwohl aber die IP + Port vom Server stimmen.
Denke da kannst du mir nicht mehr weiterhelfen, weil das Skript abhängig ist, aber ich bedanke mich recht Herzlich für deine Hilfe. Vielen vielen Dank !! :toll::applaus:


----------

