Logging mit log4j

Status
Nicht offen für weitere Antworten.

seven-12

Aktives Mitglied
Hallo,

ich habe es im Internet ´gefunden:
Code:
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.apache.log4j.*;
import org.apache.log4j.xml.DOMConfigurator;

public class MeinLogger
{
  private static final String LOG4J_CONFIG_FILE  = "log4j.xml";
  private static final String MEIN_LOGGER_NAME   = "MeinLogger";
  private static final String MESSAGES_RESBUNDLE = "messages.properties";
  private static ResourceBundle messagesResBundle;
  private static MeinLogger meinLogger;
  private static Logger log4jLogger;

  // private damit Singleton
  private MeinLogger()
  {
    init();
  }

  private synchronized void init()
  {
    try {
    	
      DOMConfigurator.configureAndWatch( LOG4J_CONFIG_FILE, 60*1000 );
      log4jLogger = Logger.getLogger( MEIN_LOGGER_NAME );
      messagesResBundle = ResourceBundle.getBundle( MESSAGES_RESBUNDLE );
      log4jLogger.setResourceBundle( messagesResBundle );
    } catch( MissingResourceException ex ) {
      System.err.println( "Fehler: '" + MESSAGES_RESBUNDLE + "'-.properties-Datei fehlt!" );
    } catch( Exception ex ) {
      System.err.println( "Fehler bei Logger-Initialisierung!" );
    } 
  }

  // Singleton-Instanz
  public static synchronized MeinLogger getInstance()
  {
    if( meinLogger == null ) meinLogger = new MeinLogger();
    return meinLogger;
  }

  public void log( Level level, Object caller, String id, String[] parms ) 
  {
    MDC.put( "clss", caller.getClass().getName() );
    MDC.put( "id", id );

    String message = id;
    if( null != messagesResBundle ) {
      try {
        message = messagesResBundle.getString( id );
      } catch( MissingResourceException ex ) {/**/}
    }
    if( null != parms )
      message = MessageFormat.format( message, parms );

    switch( level.toInt() ) {
      case Priority.ALL_INT:  
      case Priority.DEBUG_INT: log4jLogger.debug( message ); break;
      case Priority.INFO_INT:  log4jLogger.info(  message ); break;
      case Priority.WARN_INT:  log4jLogger.warn(  message ); break;
      case Priority.ERROR_INT: log4jLogger.error( message ); break;
      case Priority.FATAL_INT: log4jLogger.fatal( message ); break;                        
    }
  }

  public boolean isEnabledFor( Level level )
  {
     return log4jLogger.isEnabledFor( level );
  }
}

Es ist genau das, was ich brauche.
Was ich aber nicht verstehe, warum kann ich nicht logger.log nur im Konstruktor nutzen.


Code:
public class MeineKlasse1
{
  private static MeinLogger logger = MeinLogger.getInstance();

 
  {
    logger.log( Level.ERROR, this, "E002", new String[] { "abc", "xyz" } );
  }
}

Wie kann ich auf diese Methode log zugreifen?

Ich möchte einfacj innerhalb von if Schleifen logger.log aufrufen.

WAs mache ich falsch?

Danke Euch,

seven-12
 
S

SlaterB

Gast
logger ist ein statisches Attribut deiner Klasse,
damit kannst es von ÜBERALL innerhalb deines Objektes aufrufen,
nur bei statischen Operationen siehts etwas schlecht aus

für andere Klassen müsstest du analog wiederum ein statisches Objek definieren,
potentiell ist logger und damit logger.log also von all deinen Objekten erreichbar,

was genau ist das Problem?,
funktioniert die Zeile
logger.log( Level.ERROR, this, "E002", new String[] { "abc", "xyz" } );
an anderen Stellen nicht?
 

seven-12

Aktives Mitglied
Vielen Dank für die Erklärung.

Jetzt funktioniert es, ich weiss nicht warum vorher es nicht funktioniert hat.
 
G

Gast

Gast
ich habe noch eine kleine Frage .
wo muss die Datei message.properties liegen,
damit ich keine Meldung bekomme:Fehler: 'messages.properties'-.properties-Datei fehlt!

private static final String MESSAGES_RESBUNDLE = "messages.properties";

Danke und gruß,
seven-12
 

seven-12

Aktives Mitglied
hallo,

ich habe auch mit:
private static final String MESSAGES = "resources/messages";
Probleme Ich habe im Verzeichniss: resources/messages" eine Datei erstellt messages.properties und ich bekomme immer die Meldung:
Fehler: 'messages.properties'-.properties-Datei fehlt!


Kann jemand helfen?

Gruß,
seven-12
 
S

SlaterB

Gast
die Fehlermeldung sollte dich doch recht deutlich darauf hinweisen,
dass es
private static final String MESSAGES_RESBUNDLE = "messages";
heißen muss,
dass .properties wird automatisch hinzugefügt
 

seven-12

Aktives Mitglied
klar,

ich habe :
private static final String MESSAGES = "messages";

und es kommt die gleiche Fehlermeldung...
 
S

SlaterB

Gast
tja, dann weiß ich auch nicht,
allgemeine Tipps: m stat messages um Rechtschreibfehler zu vermeiden,
auf genaue Schreibweise der Endung achten:
m.properties

----

Im Programm an gleicher Stelle eine Datei TestData.txt erstellen und schauen, wo im Dateisystem diese Datei erstellt wird.

-----
Datei m.properties in alle. Verzeichnisse des Projektes sowie in Oberverzeichnissen bis zum Root-Verzeichnis, im user.home-Verzeichnis, in bin- oder sonstigen verdächtigen Verzeichnissen von Java/ Eclipse/ anderen Programmierumgebungen oder Servern, sonstigen Verzeichnissen im Classpath erstellen.
Überall wo Log4 potentiell nachschaut ;)
 

seven-12

Aktives Mitglied
Hallo,

vielen Dank,.. wie erstelle ich es im Classpath?

Datei m.properties in alle. Verzeichnisse des Projektes sowie in Oberverzeichnissen bis zum Root-Verzeichnis, im user.home-Verzeichnis, in bin- oder sonstigen verdächtigen Verzeichnissen von Java/ Eclipse/ anderen Programmierumgebungen oder Servern, sonstigen Verzeichnissen im Classpath erstellen.
Überall wo Log4 potentiell nachschaut

Danke Dir,

seven-12
 
S

SlaterB

Gast
probier doch erstmal
> Im Programm an gleicher Stelle eine Datei TestData.txt erstellen und schauen, wo im Dateisystem diese Datei erstellt wird.

was kommt da raus?
--------
und ich meinte nicht, die Datei in den Classpath einzufügen,
sondern nachzuschauen, welche Verzeichnisse im Classpath sind,
und dort (edit: dort in diese Verzeichnisse auf der Festplatte!!) per Hand die Datei einzufügen (edit: zu kopieren),
eher eine verzweifelter Versuch als dass man da noch genauer drüber reden sollte
 

seven-12

Aktives Mitglied
ok, ich habe im classpath eingetragen:
<classpathentry kind="lib" path="lib/messages"/>
es kommt auch die gleiche Fehlermeldung, wenn ich eine txt datei erstelle... TestData.txt nicht gefunden...
 
S

SlaterB

Gast
zum zweiten mal: ich spreche NICHT davon, die Datei in den Classpath einzufügen...

----------

Wenn du auf deinem Rechner keine Dateinen erzeugen kannst,
nun, dann freue dich, dann musst du dir zumindest um das Logging keine Sorgen mehr machen,
dann hast du ein viel größeres Problem. ;)

Code:
import java.io.File;
import java.io.IOException;

public class Test {

	public static void main(String args[]) throws IOException {
		createTestFile();
	}
	
	public static void createTestFile() throws IOException {
		File f = new File("TestDatei.txt");
		System.out.println("f: " + f.getAbsolutePath()); 
          // dieser Pfad sagt dir, wo du deine messages.properties hinlegen musst!!
		if (f.exists()) {
			System.out.println("f existiert");
		} else {
			boolean create = f.createNewFile();
			System.out.println("hat Erzeugung funktioniert?: " + create);
		}
	}
}
 

seven-12

Aktives Mitglied
HI Slater,

es hat doch noch nicht geholfen:
Fehler: 'TestDatei.txt'-.properties-Datei fehlt!
Ich habe
private static final String MESSAGES_RESBUNDLE = "TestDatei.txt";
Ich bin verzweifelt....

Gruß,
seven-12
 
S

SlaterB

Gast
tja, du verstehst mich eben nicht,
du sollst nicht TestDatei.txt in den String MESSAGES_RESBUNDLE schreiben, was sollte das bringen?

du sollst in deinem Programm eine Datei ERZEUGEN/ erstellen/ anlegen, wie auch immer,
in der Hoffung, dass du diese Datei dann auf deiner Festplatte wiederfindest,
und damit erkennst, welches Verzeichnis von deinem Programm überhaupt verwendet wird,
DANN kannst du dort in dieses Verzeichnis die messages.resources-Datei einfügen...
 

seven-12

Aktives Mitglied
danke, ich habe es verstanden, ich habe in diesem Verzeichniss die Datei messages_de.properties erstellt und
private static final String MESSAGES_RESBUNDLE = "Meinpackage\messages";
es funktioniert trotzdem nicht,
 
S

SlaterB

Gast
nun mal immer Schritt für Schritt,
vor allem: jede Art von packages zunächt weglassen,
sondern nur im default-package (zum testen) arbeiten

Also: in welchem Verzeichnis wird denn die Testdatei erstellt?

Doch wohl hoffentlich im gleichen Verzeichnis, direkt im Projekt-Grundverzeichnis wo auch die .java und .class-Datei von MeinLogger und einer evtl. zweiten Klasse zum Aufruf liegen?

Falls dein Programm zu kompliziert ist benutze so ein einfaches wie folgt:
Code:
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.apache.log4j.*;
import org.apache.log4j.xml.DOMConfigurator;

public class MeinLogger {
	private static final String LOG4J_CONFIG_FILE = "log4j.xml";
	private static final String MEIN_LOGGER_NAME = "MeinLogger";
	private static final String MESSAGES_RESBUNDLE = "messages";
	private static ResourceBundle messagesResBundle;
	private static MeinLogger meinLogger;
	private static Logger log4jLogger;

	// private damit Singleton
	private MeinLogger() {
		init();
	}

	private synchronized void init() {
		try {

			DOMConfigurator.configureAndWatch(LOG4J_CONFIG_FILE, 60 * 1000);
			log4jLogger = Logger.getLogger(MEIN_LOGGER_NAME);
			messagesResBundle = ResourceBundle.getBundle(MESSAGES_RESBUNDLE);
			log4jLogger.setResourceBundle(messagesResBundle);
		} catch (MissingResourceException ex) {
			ex.printStackTrace();
			System.err.println(
				"Fehler: '"
					+ MESSAGES_RESBUNDLE
					+ "'-.properties-Datei fehlt!");
		} catch (Exception ex) {
						ex.printStackTrace();
			System.err.println("Fehler bei Logger-Initialisierung!");
		}
	}

	// Singleton-Instanz
	public static synchronized MeinLogger getInstance() {
		if (meinLogger == null)
			meinLogger = new MeinLogger();
		return meinLogger;
	}

	public void log(Level level, Object caller, String id, String[] parms) {
		MDC.put("clss", caller.getClass().getName());
		MDC.put("id", id);

		String message = id;
		if (null != messagesResBundle) {
			try {
				message = messagesResBundle.getString(id);
			} catch (MissingResourceException ex) { /**/
			}
		}
		if (null != parms)
			message = MessageFormat.format(message, parms);

		switch (level.toInt()) {
			case Priority.ALL_INT :
			case Priority.DEBUG_INT :
				log4jLogger.debug(message);
				break;
			case Priority.INFO_INT :
				log4jLogger.info(message);
				break;
			case Priority.WARN_INT :
				log4jLogger.warn(message);
				break;
			case Priority.ERROR_INT :
				log4jLogger.error(message);
				break;
			case Priority.FATAL_INT :
				log4jLogger.fatal(message);
				break;
		}
	}

	public boolean isEnabledFor(Level level) {
		return log4jLogger.isEnabledFor(level);
	}

	public static void main(String[] args) {
		MeinLogger logger = MeinLogger.getInstance();
		Object o = new Object();

		logger.log(Level.ERROR, o, "E002", new String[] { "abc", "xyz" });
	}
}

Wenn dann noch messages.properties da ist, kann ja wohl nix mehr schiefgehen.

Notfalls die Library auch in das Verzeichnis kopieren und per Konsole starten mit
java -cp.;logXY.jar MeinLogger
 

seven-12

Aktives Mitglied
Danke, ich habe es geschafft OHne Deine HIlfe würde es nicht klappen, EIne kleine Frage dazu:

ich habe im message_de.properties:
TEST=Hello

Mit diesem Aufruf :meinlogger.log(Level.ERROR,this,"TEST") dachte ich , bekomme ich Hello in meine Log Datei, ich habe aber nur TEST

Was kann hier falsch sein, ich habe log Methode so geändert:
public void log( Level level, Object caller, String id )
{
MDC.put( "clss", caller.getClass().getName() );
MDC.put( "id", id );
String message = id;


if( null != messagesResBundle ) {
try {
message = messagesResBundle.getString(id);
System.out.println("message"+message);
} catch( MissingResourceException ex ) {/**/}
}


switch( level.toInt() ) {
case Priority.ALL_INT:
case Priority.DEBUG_INT: log4jLogger.debug( message ); break;
case Priority.INFO_INT: log4jLogger.info( message ); break;
case Priority.WARN_INT: log4jLogger.warn( message ); break;
case Priority.ERROR_INT: log4jLogger.error( message ); break;
case Priority.FATAL_INT: log4jLogger.fatal( message ); break;
}
}

Danke Dir :)
Gruß,
seven-12
 
S

SlaterB

Gast
tja, was ist denn nun wieder message_de.properties?
hoffentlich nur umbenannt die normale Datei?
mehrere verschiedene Dateien, das wär ja was nach den ersten Problemen..

ich wüßte nun nicht wirklich was man falsch machen könnte,
hast du den String in die falsche von mehreren Dateien geschrieben?
vielleicht mit einem seltsamen Editor der eine Datei in ungünstigen Format erzeugt?
versuche mal irgendwo anders eine fertige property-Datei zu klauen und kopiere sie nur/ benenne sie um, aber nicht den Inhalt verändern,
klappts mit deren Keys?

------

gib im Programm doch mal alle enthaltenen Keys aus mit

Code:
try {
				Enumeration en = messagesResBundle.getKeys();
				while (en.hasMoreElements()) {
					String key = (String) en.nextElement();
					System.out.println("key: "+key+" -> "+messagesResBundle.getString(key));
				}
				message = messagesResBundle.getString(id);
				System.out.println("message: " + message);
			} catch (MissingResourceException ex) {
				ex.printStackTrace();
			}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Logging mit org.apache.logging.log4j Allgemeine Java-Themen 1
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
S log4j - doppeltes Logging Allgemeine Java-Themen 4
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
DEvent log4j, commons logging, log4j.properties and co Allgemeine Java-Themen 12
J Log4j / commons-logging Allgemeine Java-Themen 3
K Logging mit Log4j Allgemeine Java-Themen 2
M Rat gesucht: Logging (log4J oder java.util.logging oder .) Allgemeine Java-Themen 5
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
S Input/Output Jave.utill.logging ohne Default-Locale also in Englisch Allgemeine Java-Themen 3
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
P Logging levels Allgemeine Java-Themen 2
X Logging Messages - mehr Details? Allgemeine Java-Themen 4
F Error Logging - best practices? Allgemeine Java-Themen 3
L util.logging Log Rotation Allgemeine Java-Themen 3
W Java Logging Problem Allgemeine Java-Themen 3
H java.util.logging Formatter Optionen setzen Allgemeine Java-Themen 2
D Logging XMLFormatter Allgemeine Java-Themen 3
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
D Technologiefragen, logging, JMX Allgemeine Java-Themen 3
S Tomcat java.util.logging - keine Logs Allgemeine Java-Themen 12
J Logging mehrerer Methoden Allgemeine Java-Themen 21
B Logging von Exceptions Allgemeine Java-Themen 7
P SLF4J Logging Level einstellen Allgemeine Java-Themen 2
DamienX Google Guice AOP + Logging Allgemeine Java-Themen 3
T CP Problem: Webstart + Logging properties file + eigener Handler Allgemeine Java-Themen 7
A java logging api scheint nicht thread save zu sein Allgemeine Java-Themen 22
T Java Logging API in Multi Threaded API Allgemeine Java-Themen 2
P fehlende Mehrfachvererbung logging.Handler impl. Observable Allgemeine Java-Themen 5
M Verbieten Applets die Nutzung von Commons Logging? Allgemeine Java-Themen 7
F Java logging Allgemeine Java-Themen 4
F Java logging Leerzeile als Standardeinstellung Allgemeine Java-Themen 4
S Java logging konfigurieren? Allgemeine Java-Themen 5
J Logging Allgemeine Java-Themen 10
G Logging Allgemeine Java-Themen 4
S Logging Allgemeine Java-Themen 9
T Logging Allgemeine Java-Themen 12
T Transaction Logging Allgemeine Java-Themen 2
M log4j Problem mit jlink Allgemeine Java-Themen 19
T Log4j integrieren, wie? Allgemeine Java-Themen 7
M Schutz vor Log4J Allgemeine Java-Themen 2
W Sicherheitslücke in Log4j Allgemeine Java-Themen 66
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
MiMa mit Log4j einzeln Protokollieren Allgemeine Java-Themen 7
A JWS application - log4j wie configurieren Allgemeine Java-Themen 1
A Log4j configurieren Allgemeine Java-Themen 1
L Applet Wo loggt log4j bei Applets Allgemeine Java-Themen 0
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
D Log4J RollingFileAppender rolliert nicht Allgemeine Java-Themen 3
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
O log4j - Verständnisfrage Allgemeine Java-Themen 1
O [log4J] Unterschied SocketServer <-> SimpleSocketServer Allgemeine Java-Themen 0
O log4j pfad per umgebungsvariable setzen Allgemeine Java-Themen 5
T [log4j] Wie nutzt man log4j.properties? Allgemeine Java-Themen 7
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
O log4j - eigenes Log für einzelne Klasse Allgemeine Java-Themen 5
J log4j ohne propertiedatei Allgemeine Java-Themen 4
H [Logback || log4j] Wie richtig loggen / Log Instanzen verwalten Allgemeine Java-Themen 2
A Threads Log4J Logger wird "überschrieben" Allgemeine Java-Themen 3
N Log4J PatternLayout Allgemeine Java-Themen 2
S Frage zu Format Modifiers in Log4j Allgemeine Java-Themen 11
S log4j, root logger logt nur FATAL? Allgemeine Java-Themen 9
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
C Grundsätzliches zu log4j Allgemeine Java-Themen 8
C Log4J mit 2 Appender Allgemeine Java-Themen 4
reibi log4j - Bestes Konzept Allgemeine Java-Themen 10
F System.out.println mit log4j ersetzen Allgemeine Java-Themen 10
F Log4J - Detaillierte Logeinträge Allgemeine Java-Themen 2
F log4j DailyRollingFileAppender Allgemeine Java-Themen 2
T Wahrscheinlich Problem mit log4j.properties Allgemeine Java-Themen 19
B Log4J und Categories Allgemeine Java-Themen 4
P Log4J - logt nicht Allgemeine Java-Themen 5
L log4j layout Allgemeine Java-Themen 3
S Log4j und SLF4J - Laufzeitänderungen Allgemeine Java-Themen 11
E Eclipse Axis, Jena, HTTPClient - log4j Meldungen deaktivieren? Allgemeine Java-Themen 6
ruutaiokwu log4j appender in log4j.xml in java referenzieren... Allgemeine Java-Themen 6
G log4j File erzeugen und Pfad bestimmen Allgemeine Java-Themen 3
ruutaiokwu System.out auf files umlenken in log4j.xml Allgemeine Java-Themen 4
H log4j & taskname Allgemeine Java-Themen 3
C log4j.properties wird nicht verwendet?? Allgemeine Java-Themen 3
S log4j, Datum in Fileappendern formatieren Allgemeine Java-Themen 4
G Log4J Verzeichnis der Log-Datei konfigurieren Allgemeine Java-Themen 8
K log4j-Warnung mit Quartz Allgemeine Java-Themen 3
G log4j package filter Allgemeine Java-Themen 10
G log4j - Behandlung nicht explizit abgefangener Exceptions Allgemeine Java-Themen 5
R log4j - Ausgabe der Logs Allgemeine Java-Themen 3
MQue log4j mit hibernate Allgemeine Java-Themen 3
G Log4J - Logs älter als 3 Tage löschen Allgemeine Java-Themen 5
S log4j.dtd nicht in jar gefunden Allgemeine Java-Themen 7
H log4j - täglichen DailyRollingFileAppender Allgemeine Java-Themen 2
H Mit Log4j erzeugte Datei einlesen Allgemeine Java-Themen 2
hdi log4j in eine Datei Allgemeine Java-Themen 21
S Log4J DailyRollingFileAppender Allgemeine Java-Themen 4
M Log4J funktioniert nicht unter anderem Benutzer Allgemeine Java-Themen 5
B Log4j --- Welchen Appender, wie konfigurieren Allgemeine Java-Themen 3
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
T Log4J: Bei Programmstart immer eine neue LogDatei erzeugen Allgemeine Java-Themen 9
ARadauer log4j DailyRollingFileAppender Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben