# Tomcat logging mit Log4j



## robb (23. Okt 2008)

Hiho,

Ich habe gerade ein etwas grösseres Projekt unter dem Nagel, in dem mehrere Module von einem Leitrechner verwaltet werden und die Loggingausgaben bisher immer nur lokal auf dem Rechner, auf dem das Modul läuft, geschrieben werden.

Im Netzwerk befinden sich drei Rechner auf denen unterschiedliche Module laufen und ich versuche nun diese Logausgaben auf dem Tomcat der im Hintergrund auf einem Rechner läuft zu bündeln. 

Testweise habe ich bisher auf dem Rechner auf dem der Tomcat läuft ein Log-Verzeichnis angelegt und die Logdateien ausgelagert. Solange der Tomcat auf dem selben Rechner läuft bekomme ich keine Probleme und die Logdateien werden korrekt in die angegebenen Textdatei geschrieben.
Nun möchte ich über einen anderen Rechner mit Log4j auf dieses Verzeichnis von Tomcat schreiben nur leider habe ich Probleme bei der Anmeldung auf dem Tomcat. 
Ich habe mir ein einfaches Testprogramm geschrieben und eine log4j.xml:

log4j.xml


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
	<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"/>
		<appender-ref ref="File">
		</appender-ref>
	</root>
	<appender name="File" class="org.apache.log4j.FileAppender">
		<param name="Append" value="false"></param>
		<param name="File" value="//172.16.6.13/Leitrechner/log/ki.log"></param>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"></param>
		</layout>
	</appender>
</log4j:configuration>
```

Java Test Datei


```
import org.apache.log4j.Logger;

public class LogClass {
	private static org.apache.log4j.Logger log = Logger
			.getLogger(LogClass.class);

	public static void main(String[] args) {

		log.trace("Trace");
		log.debug("Debug");
		log.info("Info");
		log.warn("Warn");
		log.error("Error");
		log.fatal("Fatal");

	}
}
```

Fehlermeldung:

```
log4j:WARN Continuable parsing error 17 and column 127
log4j:WARN The content of element type "log4j:configuration" must match "(renderer*,appender*,(category|logger)*,root?,categoryFactory?)".
log4j:ERROR setFile(null,false) call failed.
java.io.FileNotFoundException: \\172.16.6.13\Leitrechner\log\ki.log (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at org.apache.log4j.FileAppender.setFile(FileAppender.java:289)
	at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:163)
	at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:256)
	at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:220)
	at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:150)
	at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:163)
	at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:425)
	at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:394)
	at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:829)
	at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:712)
	at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:618)
	at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:468)
	at org.apache.log4j.LogManager.<clinit>(LogManager.java:122)
	at org.apache.log4j.Logger.getLogger(Logger.java:117)
	at LogClass.<clinit>(LogClass.java:5)
```

Muss ich um diese Logdaten abzusetzen noch Änderungen am Tomcat machen?

Gruss

Robb


----------



## FArt (23. Okt 2008)

Du willst mit mehreren Tomcats in ein Logfile schreiben?

Mach das nicht, das ist Quatsch.

Dafür gibt es z.B. den SocketAppender.


----------



## maki (23. Okt 2008)

Wie kommst du darauf dass der Filepapender auf Netzlaufwerke schreiben kann?

Mounte/mappe doch das Netzlaufwerk auf ein lokales Verzeichniss/Laufwerk, je nachdem was als OS im einsatz (Linux/Windows) ist.


----------



## robb (23. Okt 2008)

> Du willst mit mehreren Tomcats in ein Logfile schreiben?



Nein ich habe nur einen Tomcat und auf dem möchte ich in einem Verzeichnis Log Dateien speichern. Nur sollen diese Logs nicht nur von dem Rechner beschrieben werden können wo der Server auch läuft sondern von allen Rechnern im Netzwerk.

Das mit dem Mapping ist natürlich ne gute Möglichkeit, werde ich mir mal genauer ansehen in wieweit ich das hier realisieren kann.


----------



## maki (23. Okt 2008)

>> Das mit dem Mapping ist natürlich ne gute Möglichkeit, werde ich mir mal genauer ansehen in wieweit ich das hier realisieren kann.

Farts Vorschlag mit den speziellen Appendern scheint mir einfacher & besser umzusetzen zu sein.


----------



## robb (23. Okt 2008)

Hmm, unter den Umständen müsste es doch definitiv reichen, wenn ich die Module die lokal laufen mit den log4j Einstellungen beibehalten und auf anderen Rechnern einen SocketAppender definiere wenn ich mich nicht irre. 

Aber ich bin da noch nicht wirklich mit vertraut mit dem Appender muss ich mal weiter recherchieren. Vielen Dank schonmal für die Denkanstösse.


----------

