# log4j package filter



## Gast2 (6. Aug 2010)

Hi,

irgendwie bin ich anscheinend zu blöde die log4j config richtig anzupassen.

Ich habe hier ein Projekt mit ca 25 packages auf der gleichen "Ebene".

Momentan habe ich einfach einen nur den root logger configuriert der sich alles schnappt und auf den appender wirft. Ich möchte jetzt aber zum Beipiel ganz einfach ein package von den 25 anderen vom logging ausschließen ohne jetzt 25 einzlene logger für jedes package zu definieren. Ich denke mal das irgendwas wie "Filter" der gesuchte Ausdruck ist, aber ich komme nicht wirklich weiter.

Also - wie kann ich wenn ich nur den root loogger habe geziehlt ein package ignorieren? Oder ist das so nicht vorgesehn?

Vielen Dank,
fassy


----------



## mvitz (6. Aug 2010)

Einfach das Level für das Package hochstellen? Auf z.B. FATAL

log4j.rootLogger=INFO, Appender
log4j.logger.de.mypackage=FATAL


----------



## Gast2 (6. Aug 2010)

So in der Art hab ich es auch versucht - allerdings verwenden wir die XML config. Also:
[XML]
       <category name="com.xyz.abc4">
                <priority value="fatal" />
                <appender-ref ref="logFile" />
        </category>

        <root>
                <priority value="debug" />
                <appender-ref ref="logFile" />
        </root>
[/XML]

Dann wir aber nur noch package com.xyz.abc4 auf info level mitgeloggt, die anderen 24 gar nicht mehr...


----------



## mvitz (6. Aug 2010)

Hm, also ich habs gerade mal getestet:

[XML]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>

</log4j:configuration>[/XML]

```
package de.log4j;

import org.apache.log4j.Logger;

import de.log4j.a.A;
import de.log4j.b.B;
import de.log4j.c.C;

public class Main {

    private static final Logger LOG = Logger.getLogger(Main.class);
    
    public static void main(String[] args) {
        LOG.info("Start");
        new A();
        new B();
        new C();
        LOG.info("End");
    }
}
```


```
package de.log4j.a;

import org.apache.log4j.Logger;

public class A {

    private static final Logger LOG = Logger.getLogger(A.class);

    public A() {
        LOG.info("A");
    }
}
```


```
package de.log4j.b;

import org.apache.log4j.Logger;

public class B {

    private static final Logger LOG = Logger.getLogger(B.class);

    public A() {
        LOG.info("B");
    }
}
```


```
package de.log4j.c;

import org.apache.log4j.Logger;

public class C {

    private static final Logger LOG = Logger.getLogger(C.class);

    public A() {
        LOG.info("C");
    }
}
```

Output:

```
INFO  Main - Start
INFO  A - A
INFO  B - B
INFO  Main - End
```

Das funktioniert bei mir, die Log Message aus C wird nicht mehr ausgegeben.
Liegt es evtl. daran, dass ihr alle Logger mit Logger.getLogger() anders holt, als ich im Beispiel?


----------



## Der Müde Joe (6. Aug 2010)

[XML]    <appender name="CONSOLE" class="ScConsoleAppender">
        <param name="threshold" value="DEBUG" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-16.16t] %-5p %l:%n                       > %m%n" />
        </layout>
    </appender>
    <logger name="org.apache">
        <level value="WARN" />
    </logger>
    <logger name="org.apache.catalina">
        <level value="INFO" />
    </logger>
    <root>
        <appender-ref ref="CONSOLE" />
    </root>[/XML]

CONSOLE logt alles ab debug.
ausser apache --> nur warn
catalina --> aber schon ab info


----------



## fastjack (6. Aug 2010)

Im Kurzen und Ganzen mußt Du das für alle Packages getrennt machen. Du kannst aber z.b. ganz com auf Info setzen und damit alle Subpackages auf einmal hochsetzen.


----------



## Gast2 (6. Aug 2010)

Das ist ja doof... kann doch nicht sein das noch niemand diese Problem hatte? Ist der Wunsch so außergewöhnlich? Es sollte doch eigentlich ein leichtes sein ein Filter zu schreiben so nach dem Motto:

<filter name="com.abc.xyz" ignore=true>


@mvitz - dein Beispiel verstehe ich nicht. Ohne es jetzt ausprobiert zu haben - du hast doch nur den root logger aktiv und keinerlei Regeln definiert? Zumal die Klassen auch ein wenig komisch aussehn, z.B.:

```
public class C {
 
    private static final Logger LOG = Logger.getLogger(C.class);
 
    public A() { // copy und paste fehler?
        LOG.info("C");
    }
}
```

@Joe

Ja, das wäre die Möglichkeit wenn man alle packages auf verschiedenen package ebenen oder mit verschiedenen package namen hat:
com.abcd.qwert
org.abcd.qwert
usw.

Aber löst leider nicht mein Problem 

Ich hab z.B.
com.abcd.xyz1
com.abcd.xyz1.asdf
com.abcd.asdf
com.abcd.qwer

usw. und NUR com.abcd.asdf soll nicht mitgelogt werden. Und das mit der minimalsten Config die Möglich ist.


----------



## mvitz (6. Aug 2010)

Sry, war ein Copy&Paste Fehler die Klassen haben natürlich alle einen eigenen Konstruktor. Und genau das passiert bei mir doch. Ich stelle den Logger für das package de.c auf WARN und anschließend wird dort das Info nicht mehr geloggt...


----------



## Gast2 (6. Aug 2010)

Und wo ist das 





mvitz hat gesagt.:


> Ich stelle den Logger für das package de.c auf WARN


? Irgendwie kann ich deinem Beispiel nicht folgen.


----------



## mvitz (6. Aug 2010)

Verdammt... noch ein Copy&Paste Fehler, ... irgendwie spinnt hier mein Strg+C...
[XML]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
        </layout>
    </appender>

    <category name="de.log4j.c">
        <priority value="warn" />
    </category>

    <root>
        <priority value="debug" />
        <appender-ref ref="console" />
    </root>


</log4j:configuration>[/XML]


----------



## Der Müde Joe (6. Aug 2010)

ich versteh dein PRoblem nicht?

[XML]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="threshold" value="TRACE" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
		</layout>
	</appender>

	<logger name="com.abcd">
	</logger>

	<logger name="com.abcd.xyz1.asdf">
		<level value="OFF" />
	</logger>

	<root>
		<appender-ref ref="console" />
	</root>
</log4j:configuration>[/XML]

Log alles ab TRACE von com.abcd und darunter in console und nichts von com.abcd.xyz1.asdf und darunter


----------

