# Log4J - logt nicht



## Permafr0st (16. Feb 2011)

moin,
habe ein Problem mit Log4j und steh damit zielmich im Wald. Wir nutzen Log4J üblicherweise für Java Apps, die auf Apache Cocoon aufsetzen, das ganze natürlich auf dem Tomcat.

Nun habe ich da eine JSP App. Unter WEB-INF/lib habe ich eine Java Klasse, die u.a. auch das Logging besorgen soll. Die Klasse selbst soll loggen können, die Loggingmethode soll man auch von aussen per Instanz nutzen können. 

Unter _WEB-INF/lib_ liegt _log4j-1.2.14.jar_. Unter _WEB-INF/_ iegt die _log4j.xml_, _applicationContext.xml und web.xml_. Meine Javaklasse läuft, bis auf das Logging, wunderprächtig.

Die Logfiles, die in der _log4j.xml_ angegeben sind, werden beim Start von tomcat selbsttätig angelegt in allen 3 gewünschten Loglevels. Insofern vermute ich, daß meine log4j.xml so nicht ganz falsch ist.

Wir hatten sogar den Fall, daß meine App zwar gelogt hat, aber in ganz andere Dateien als vorgesehen. Ich hatte unter WEB-INF/lib eine Klasse liegen, die dort überhaupt nichts verloren hatte, aber ihr eigenes Logging mitgebracht hatte. Ich habe diese Lib entfernt, naja jetzt logt er gar nicht mehr.

Das Logging in meiner Klasse geschieht wie folgt (Namen von Klassen, Methoden musste ich wegen Geheimhaltung ändern):



```
import org.apache.commons.logging.Log;  // dazu zählt wohl auch log4j ..?
...
String logprefix =  "";  // logprefix wird vor dem Logging u.a. mit Usernamen versehen...

public class myApplication extends AbstractAction { 		
...
	// Logging
	Log logger = this.getLogger();

	public String myApplicationLog(String level, String logmsg)		{
		if (level.toLowerCase().equals("info"))	{
			if (logger.isInfoEnabled()) 
				logger.info(logprefix + logmsg);
			else
				return "logger: 'info' is not enabled";
		}
		if (level.toLowerCase().equals("warn"))	{
			if (logger.isWarnEnabled())
				logger.warn(logprefix + logmsg);
			else
				return "logger: 'warn' is not enabled";
		}
		if (level.toLowerCase().equals("error"))	{
			if (logger.isErrorEnabled())
				logger.error(logprefix + logmsg);
			else
				return "logger: 'error' is not enabled";
		}		
		return "logger: loglevel is enabled";
	}
}
```

Wobei _myApplicationLog()_ vorher void war, ich habe sie eigens zum Debuggen String returnen lassen. Die angegebenen Klassen von_ apache.commons.*_ liegen freilich in der  WEB-INF/lib

Ich habe die einzelnen Levels _isInfoEnabled(), isWarnEnabled(), isErrorEnebled()_ mal  überprüft - es ist alles enabled. Meine definierten Logfiles werden wie gesagt beschrieben. Allerdings nur mit Start- und sonstigen allgemeinen Meldungen des Tomcat, nicht mit denen wofür sie gedacht waren. Es wäre auch schön, wenn ich den ganzen 'Müll' von Tomcat aus meinen Logfiles heraushalten könnte, die schreibt er ja ohnehin in _catalina.out_ usw.

Woran kann es liegen, wo soll ich ansetzen, nachschauen?  

Eine andere Strategie wäre, die Struktur der "fremden" Klasse, die ja durchaus gelogt hatte, zu analysieren und meine Klasse daraufhin nachzubauen, wie wäre das?

Danke, Gruß


----------



## maki (16. Feb 2011)

> Unter WEB-INF/ iegt die log4j.xml


Die log4j.xml sollte doch in den Classpath, also zB. WEB-INF/classes/log4j.xml


----------



## Permafr0st (16. Feb 2011)

meine web.xml:

[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Licensed to the Apache blah blah... -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>   
</web-app>[/XML]

log4j.xml (Namen geändert)
[XML]
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Licensed to the Apache blah blah... -->
<!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{DATE} %-5p %t - %m%n" />
		</layout>
	</appender>

	<appender name="infoApp" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Threshold" value="info"/>
		<param name="File" value="${de.myapp.log4j.infofile}" />
		<!-- param name="File" value="/var/log/myapp/myapp_info.log" / -->
		<param name="DatePattern" value="'.'yyyy-MM-dd" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{DATE} %-5p %t - %m%n" />
		</layout>
	</appender>

	<appender name="warnApp" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Threshold" value="warn"/>
		<param name="File" value="${de.myapp.log4j.warnfile}" />
		<param name="DatePattern" value="'.'yyyy-MM-dd" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{DATE} %-5p %t %c - %m%n" />
		</layout>
	</appender>

	<appender name="errorApp" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="Threshold" value="error"/>
		<!-- param name="File" value="${de.myapp.log4j.errorfile}" / -->
		<param name="File" value="/var/log/myapp/myapp_error.log" />

		<param name="DatePattern" value="'.'yyyy-MM-dd" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{DATE} %-5p %t %c - %m%n" />
		</layout>
	</appender>

	<logger name="de.myapp.ChannelParameterMapper ">
		<level value="WARN" />
	</logger>
	<root>
		<priority value="${de.myapp.ariadne.log4j.loglevel}"/>  
		<!--appender-ref ref="stdout"/-->
		<appender-ref ref="infoApp"/>
		<appender-ref ref="warnApp"/>
		<appender-ref ref="errorApp"/>
	</root>
</log4j:configuration>
[/XML]


----------



## Permafr0st (16. Feb 2011)

maki hat gesagt.:


> Die log4j.xml sollte doch in den Classpath, also zB. WEB-INF/classes/log4j.xml


Dankesehr
web.xml, applicationContext.xml  auch?


----------



## maki (16. Feb 2011)

Der Pfad für die web.xml ist fest (WEB-INF), der für die applicationContext.xml ist konfigurierbar, steht aber auch in der Spring Doku


----------



## Permafr0st (16. Feb 2011)

hmm. ich habe mir die _applicationContext.xml_ mal angesehen - dort konfiguriert man offenbar die Log4j ? wie man sieht ist _"/WEB-INF/log4j.xml"_ eingetragen - und so ists auch bei allen anderen Webapps die hier laufen.  Mit dem Unterschied daß die alle anstandslos loggen, nur meine nicht :bahnhof:

 applicationContext.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache blablah..-->
<!-- @version $Id: applicationContext.xml 561608 2007-08-01 00:33:12Z vgritsenko $ -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:configurator="http://cocoon.apache.org/schema/configurator"
       xmlns:avalon="http://cocoon.apache.org/schema/avalon"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
Index of /schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
Index of /schema/configurator http://cocoon.apache.org/schema/configurator/cocoon-configurator-1.0.1.xsd
Index of /schema/avalon http://cocoon.apache.org/schema/avalon/cocoon-avalon-1.0.xsd">
  <!-- Activate Cocoon Spring Configurator -->
  <configurator:settings runningMode="prod" extractBlockResources="true" readFromClasspath="true" readFromGlobalLocation="true"/>

 <!-- Configure Log4j -->
  <bean name="org.apache.cocoon.spring.configurator.log4j"
        class="org.apache.cocoon.spring.configurator.log4j.Log4JConfigurator"
        scope="singleton">
    <property name="settings" ref="org.apache.cocoon.configuration.Settings"/>
    <property name="resource" value="/WEB-INF/log4j.xml"/>
  </bean>

  <!-- Activate Avalon Bridge -->
  <avalon:bridge/>
</beans>[/XML]


----------

