Log4j: Pfad zur log4j.xml explizit angeben - DOMConfigurator.configure()

Kryptaesthesie

Erfahrenes Mitglied
Guten Tag,
ich möchte gerne eine zweite log4j.xml definieren und muss dazu den Pfad neu angeben und habe mal folgendes probiert:
Code:
URL path2Conf = this.getClass().getClassLoader().getResource("de/hes/log4j/applets/log4j.xml");
DOMConfigurator.configure(path2Conf);
Das Ganze soll dann in einem Applet laufen und das Applet sucht die XML jetzt in C:\Programme\Mozilla Firefox\de\hes\log4j\applets\log4j.xml

Wie kann ich die Datei aus der jar laden?
Wisst ihr da Rat?


Warum nicht alles in einer XML?
Weil Konfigurationen, die bei dem einen benutzt werden, in dem anderen Programm nicht zu sehen sein sollen, wenn jemand die Jar entpackt und reinschaut.


Gruß
Gerrit
 
Könnte ja auch null sein das Objekt. Das meine ich. Vielleicht kann log4j aber nicht mir URLs innerhalb eines JARs umgehen. Schau doch mal ob man auch mit nem InputStream konfigurieren kann.
 
Hallo nochmal :)

Also ich komme einfach nicht weiter. Habe es jetzt auf die verschiedensten Varianten probiert. Aber das Einlesen einer Resource will einfach nicht klappen.
Versuche es mit folgenden Code:
Code:
    private Element getElement4Log4j()
    {
        try
        {
            File f = new File (this.getClass().getClassLoader().getResource("de/xyz/log4j/applets/log4j.xml").getFile());
            
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse( f );
      // ---- Get list of nodes to given element tag name ----
      NodeList ndList = document.getElementsByTagName( "log4j:configuration" );

      System.out.println("ndList length: " + ndList.getLength());
      Element el = (Element) ndList.item(0);
      return el;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        return null;
    }
Und bekomme in der Javakonsole, wenn ich die Webseite mit dem Applet aufrufe folgende Meldung:
java.io.FileNotFoundException: C:\Programme\Mozilla Firefox\http:\172.30.54.239:8080\mdtscan\work\listedrucken.jar!\de\hes\log4j\applets\log4j.xml (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at de.hes.web.applets.ListeDruckenGUI.getElement4Log4j(ListeDruckenGUI.java:187)
at de.hes.web.applets.ListeDruckenGUI.init(ListeDruckenGUI.java:63)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Und egal wie ich das Ganze wende und drehe - auch mit URL - ich komme immer wieder bei diesem Problem heraus.


Weiß jemand Rat?


Vielen Dank
Gruß
Gerrit
 
Wie ich schon sagte: Verwende getResourceAsStream und lies aus dem InputStream ein.
:-) man muss es nur richtig machen und schon funktioniert es!

Danke zeja :)


Sieht nun so aus:
Code:
public class SpecialLog4jUtils
{

    private Class parentClass;
    
    
    public SpecialLog4jUtils(Class classThisObjIsCalledIn)
    {
        this.parentClass = classThisObjIsCalledIn;
    }
    
    /**
     * Liest eine XML-Datei aus und gibt diese als <code>Element</code> zurück.
     * 
     * @param path2log4jxml - Package (mit beginnendem Slash!) und Dateiname der Konfig: <code>/de/hes/conf/log4j.xml</code>
     * @return
     */
    public Element getElement4Log4j(String path2log4jxml)
    {
        try
        {
            InputStream is = this.parentClass.getResourceAsStream(path2log4jxml);
            
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse( is );
      
      return document.getDocumentElement();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            
            return null;
        }
    }
}
Und der Aufruf an sich sieht dann so aus:
Code:
DOMConfigurator.configure(new SpecialLog4jUtils(this.getClass()).getElement4Log4j("/de/xyz/log4j/applets/log4j.xml"));
Hoffe, das hilft evtl. weiter!
Gruß
Gerrit
 
Ich wollte damit eigentlich bewirken dass du in die API schaust und dir nicht irgendwas abenteuerliches selber bastelst.

Java:
new DOMConfigurator().doConfigure(is, LogManager.getLoggerRepository());
 
Ich wollte damit eigentlich bewirken dass du in die API schaust und dir nicht irgendwas abenteuerliches selber bastelst.

java Code: new DOMConfigurator().doConfigure(is, LogManager.getLoggerRepository());

oh ja, das ist wirklich viel schöner als meine Bastelei :-)
Code:
// spezielles Log-File für das Applet festlegen - muss erste Anweisung sein!
new DOMConfigurator().doConfigure(this.getClass().getResourceAsStream("/de/xyz/log4j/applets/log4j.xml"), LogManager.getLoggerRepository());
Danke! :)
 
Zurück