Is it possible to use a wildcard for the logger name which matches different packages so we don't have to specify them all individually? So instead of writing
<logger name="com.package1.web" level="debug">...</logger>
<logger name="com.package2.web" level="debug">...</logger>
<logger name="com.package3.web" level="debug">...</logger>
I would like to only specify one entry somewhat like this:
<logger name="com.*.web" level="debug">...</logger>
If anyone knows about a way or also just that it's not a possibility i'd highly appreciate it
You can do that with Filters in the appender. Basically you have to set up a logger for com.* with DEBUG level, and apply a filter which DENIES all DEBUG (or lower) events which are NOT com.*.web.
I admit that it is quite convoluted.
Performance-wise it is also poor: DEBUG events are created for all com.* events, and only at the appender they are thrown away or kept.
Anyway, example logback.xml file:
<configuration scan="true" debug="true">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>
!(e.loggerName ==~ "com\\..*\\.web") &&
DEBUG.toInt() >= e.level.toInt()
</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<encoder>
<pattern>%p [%d{HH:mm:ss,SSS}] %c - %m\n</pattern>
</encoder>
</appender>
<logger name="com" level="DEBUG" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
Test code:
public void test() throws Exception{
getLogger("com.package1.web").debug("some debug onto com.package1.web");
getLogger("com.package2.web").debug("some debug onto com.package2.web");
getLogger("com.package3.web").debug("some debug onto com.package3.web");
getLogger("com.package1.web").info("some info onto com.package1.web");
getLogger("com.package2.web").info("some info onto com.package2.web");
getLogger("com.package3.web").info("some info onto com.package3.web");
getLogger("com.package3.notweb").debug("some debug onto com.package3.notweb");
getLogger("com.package3.notweb").info("some info onto com.package3.notweb");
}
public Logger getLogger(String loggerName) {
return LoggerFactory.getLogger(loggerName);
}
Result:
DEBUG [12:30:46] com.package1.web - some debug onto com.package1.web
DEBUG [12:30:46] com.package2.web - some debug onto com.package2.web
DEBUG [12:30:46] com.package3.web - some debug onto com.package3.web
INFO [12:30:46] com.package1.web - some info onto com.package1.web
INFO [12:30:46] com.package2.web - some info onto com.package2.web
INFO [12:30:46] com.package3.web - some info onto com.package3.web
INFO [12:30:46] com.package3.notweb - some info onto com.package3.notweb
as you can see, DEBUG logs are written only for com.*.web.