# log4j Logging über mehrere Klassen



## SegFault (13. Dez 2009)

Kann ich mit einen logger verschiedene Klassen abfragen? Ich habe gerade für einige meiner Klassen einen logger angelegt.
[Java]
Logger logger = Logger.getLogger(Myclass.class);
[/Java]
Wenn jetzt die Klasse selbst in einen unter package ist also de.foo.bar.myclass
loggt ein logger für ("de.foo.bar") Automatisch alle Klassen aus den Package?
also könnte ich Logger.getLogger("de.foo.bar").setLevel(...) machen um alle Logger innerhalb des Packages zu erreichen?
Ich versuche das gerade um einen eigenen Appender ein zu richten aber irgendwie klappt das nicht:


```
try 
{
        FileAppender fa = new FileAppender(layout,"logs/"+logname+cal.get(Calendar.DAY_OF_MONTH)+"-"+cal.get(Calendar.MONTH)+"-"+cal.get(Calendar.YEAR)+"("+cal.get(Calendar.HOUR_OF_DAY)+"h"+cal.get(Calendar.MINUTE)+"m).log",true);
        Logger logger = Logger.getLogger("de.foo.bar.MyClass");
        logger.addAppender(fa);
}
catch (IOException e) 
{
     LogLog.error("Fehler beim anlegen des logs",e);
}
```


----------



## fastjack (14. Dez 2009)

Warum nimmst Du nicht die XML-Konfiguration von log4j. Da kannst Du mit 

[XML]<category name="a.b.c.Foo"> 
<priority value="INFO"/>
</category>[/XML]

genau diesen Effekt erzielen.


----------



## bygones (14. Dez 2009)

nein - [c]Logger logger = Logger.getLogger("de.foo.bar")[/c] wuerde nicht fuer alle Klassen automatisch im package de.foo.bar loggen. Der String ist nur ein identifizierer, mehr nicht.

fuer "komplexeres" logging siehe antwort drueber


----------



## SegFault (14. Dez 2009)

ich suche gerade nach entsprechenden Tutorials darüber, finde aber nichts passendes. Problem ist immer noch. Ich möchte für verschiedene Logevents einmal in einer datei, einmal in ein entsprechendes Fenster loggen. 
es gibt klassen
a.b.c.Klasse1
a.b.c.Klasse2
a.b.c.Irgendwas
a.b.c.Irgendwas_anderes
ich möchte nun für Klasse1 und Klasse 2 separat in 2 verschiedene Files loggen. Sowas wie Klasse1-Log.log und Klasse2-Log.log und alle anderen aus den package a.b.c sollen in default-Log.log geschrieben werden. Wenn das nicht geht wäre das auch nicht so schlimm aber allgemein möchte ich irgendwie die Logging ausgaben von a.b.c abfangen. Ich weiss aber nicht wie. 
Das Problem ist auch das meine Appender in Klassen anhängen die eh erst zur laufzeit erstellt werden. Ich hab ein LogWindowAppender erstellt der eine funtkion addLogWind(MyLogWindow) hat mit dem mache ich bekannt in welches Fenster dieser Appender schreiben soll. D.H. ich kanns wohl nicht direkt per XML so konfigurieren. Zumindest finde ich nichts wie ich das verhalten umsetzen kann.


----------



## Der Müde Joe (14. Dez 2009)

>ich kanns wohl nicht direkt per XML so konfigurieren.

ach was.


```
<appender name="LOG1" class="org.apache.log4j.RollingFileAppender">
        <param name="threshold" value="DEBUG" />
        <param name="file" value="../log/log1.log" />
        <param name="maxFileSize" value="3MB" />
        <param name="maxBackupIndex" value="9" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
        </layout>
    </appender>
    <appender name="LOG2" class="org.apache.log4j.RollingFileAppender">
        <param name="threshold" value="DEBUG" />
        <param name="file" value="../log/log2.log" />
        <param name="maxFileSize" value="3MB" />
        <param name="maxBackupIndex" value="9" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
        </layout>
    </appender>

    <logger name="fi.fa.Foo" >
        <level value="DEBUG" />
        <appender-ref ref="LOG1" />
    </logger>
    <logger name="bli.bla.Blub" >
        <level value="DEBUG" />
        <appender-ref ref="LOG2" />
    </logger>
```


----------



## SegFault (14. Dez 2009)

Bei den File Appendern möchte ich den filename vom Programm vergeben lassen. Mein eigener Appender braucht halt eine Referenz zu einen Fenster in dem er die Logausgaben machen soll. Und diese Daten kann ich wohl schlecht per xml einstellen. Es sei denn ich mach mir eine LogWindowFactory... Wie ist das wenn ich ein param habe wird das in meiner Appender Klasse direkt auf eine Variable gemapped? oder muss ich dafür was tun?


----------



## SegFault (14. Dez 2009)

Ich hab immer noch Probleme damit, folgende Meldung kommt:

```
log4j:WARN No appenders could be found for logger (de.weiss.werkstatt.server.util.ServiceUtil).
log4j:WARN Please initialize the log4j system properly.
```
Hier die xml Datei:

```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
		</layout>
	</appender>
	<root>
		<priority value="debug"></priority>
		<appender-ref ref="stdout"/>
	</root>
	<appender name="DefaultDateFile" class="de.weiss.werkstatt.server.util.DateRollingFileAppender">
		<param name="threshold" value="DEBUG" />
		<param name="fname" value="DefaultLog" />
		<param name="maxFileSize" value="5MB" />
		<param name="maxBackupIndex" value="9" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="DefaultLogwindow" class="de.weiss.werkstatt.server.util.LogPanelAppender">
		<param name="wname" value="Default-Log" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="NutzerverwaltungDateFile" class="de.weiss.werkstatt.server.util.DateRollingFileAppender">
		<param name="threshold" value="DEBUG" />
		<param name="fname" value="NutzerverwaltungLog" />
		<param name="maxFileSize" value="5MB" />
		<param name="maxBackupIndex" value="9" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="NutzerverwaltungLogwindow" class="de.weiss.werkstatt.server.util.LogPanelAppender">
		<param name="wname" value="Nutzerverwaltung-Log" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="HibernateDateFile" class="de.weiss.werkstatt.server.util.DateRollingFileAppender">
		<param name="threshold" value="DEBUG" />
		<param name="fname" value="HibernateLog" />
		<param name="maxFileSize" value="5MB" />
		<param name="maxBackupIndex" value="9" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="HibernateLogwindow" class="de.weiss.werkstatt.server.util.LogPanelAppender">
		<param name="wname" value="Hibernate-Log" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="KundenverwaltungDateFile" class="de.weiss.werkstatt.server.util.DateRollingFileAppender">
		<param name="threshold" value="DEBUG" />
		<param name="fname" value="KundenverwaltungLog" />
		<param name="maxFileSize" value="5MB" />
		<param name="maxBackupIndex" value="9" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<appender name="KundenverwaltungLogwindow" class="de.weiss.werkstatt.server.util.LogPanelAppender">
		<param name="wname" value="Kundenverwaltung-Log" />
		<layout class="org.apache.log4j.PatternLayout">
		    <param name="ConversionPattern" value="%d{ISO8601} [%t] %-5p %l - %m%n" />
		</layout>
	</appender>
	<logger name="de.hibernate">
		<level value="DEBUG" />
	    <appender-ref ref="HibernateDateFile" />
	    <appender-ref ref="HibernateLogwindow" />
	</logger>
	<logger name="de.weiss.werkstatt" >
	    <level value="DEBUG" />
	    <appender-ref ref="DefaultDateFile" />
	    <appender-ref ref="DefaultLogwindow" />
	</logger>
	<logger name="de.weiss.werkstatt.server.NutzerverwaltungImpl" additivity="false">
	    <level value="DEBUG" />
	    <appender-ref ref="NutzerverwaltungDateFile" />
	    <appender-ref ref="NutzerverwaltungLogwindow" />
	</logger>
	<logger name="de.weiss.werkstatt.server.KundenverwaltungImpl" additivity="false">
	    <level value="DEBUG" />
	    <appender-ref ref="KundenverwaltungDateFile" />
	    <appender-ref ref="NutzerverwaltungLogwindow" />
	</logger>
</log4j:configuration>
```
Und zum laden der file verwende ich:
DOMConfigurator.configureAndWatch( "META-INF/Logging.xml")

es kommt die standardlogausgabe auf out. Aber keiner meiner angemeldeten Logger wird verwendet obwohl gewisse klassen auf garnatie ein Logger.get(myclass.class); verwenden. Oder wende ich das noch immer falsch an?


----------



## SegFault (14. Dez 2009)

1.) langsam gehts voran. Der Pfad "META-INF/Logging.xml" wurde nicht erkannt. aus irgend einen grund findet er das nicht. Ich musste die Logging.xml direkt ins Projektverzeichnis kopieren (nicht im src ordner). Das löst zwar das problem aber nicht sehr gut. Wie kann ich das umgehen. 

2.) Kann ich das loglevel dynamisch einstellen? Jetzt steht ja im xml file welches level gelogged wird. Ich würde gerne in meiner GUI diesen level einstellbar machen. Für diese reinen klassen bei denen ich mit Logger.getLogger(myClass.class) arbeite geht das problemlos, aber nicht bei vererbten Loggern. Gibts da irgend einen workaround?


----------



## maki (14. Dez 2009)

1. Bei log4j muss die Datei log4j.properties oder log4j.xml heissen und im Classpath sein.

2. Ja, sollte auch in der Doku beschrieben sein


----------



## FArt (14. Dez 2009)

maki hat gesagt.:


> 1. Bei log4j muss die Datei log4j.properties oder log4j.xml heissen und im Classpath sein.
> 
> 2. Ja, sollte auch in der Doku beschrieben sein



... oder man setzt den Namen der Konfigurationsdatei über das Systemproperty log4j.configuration *G*


----------



## SegFault (15. Dez 2009)

Prinzipiell hab ich nun rausgefunden das man das ganze auch per Properties direkt konfigurieren kann und da das mit configreAndWatch auf änderungen überwacht wird kann ich das wohl nachträglich ändern. Das ist aber das einzige was ich in der Doku darüber gefunden haben. Oder gibts noch andere Ansätze?


----------



## SegFault (15. Dez 2009)

ich hab immer noch folgende 2 Probleme: 
1.) ich muss die xml datei immernoch direkt mit DOMConfigurator.configureAndWatch( "META-INF/Logging.xml") nachladen. Benenne ich die Datei um in log4j.xml und schiebe sie ins src verzeichnis wird sie nicht automatisch genommen. 
2.) Ich krieg immer noch keine hibernate logs damit abgefangen (Siehe http://www.java-forum.org/data-tier/93195-hibernate-logs-abfangen.html)


----------



## maki (15. Dez 2009)

> Benenne ich die Datei um in log4j.xml und schiebe sie ins src verzeichnis wird sie nicht automatisch genommen.


Landet sie denn im bin Ordner und damit im CP?


----------



## SegFault (15. Dez 2009)

oki problem 1 ist gelöst. Hab aber immer noch problem 2. Ich kriege keine Hibernate logs ran obwohl ich dafür einen logger definiert hab.


----------

