已经被加载进内存来提供多个logger context时,获取这些类单例的机制。
=
LoggerFactory
.getLogger
(
“foo”
);
ContextJNDISelector,是基于JNDI实现的。这个方法利用了J2EE规范中的JNDI分离数据特点。因此,相同的环境变量在不同应用中可以设为不同的值。换句话说,不同应用调用LoggerFactory.getLogger()会返回不同的logger context,即使这里只有一个LoggerFactory类被加载进内存并被所有应用共享。通过以下设置使用JNDI selector
ch.qos.logback.classic.selector.ContextJNDISelector的简写形式。
<env-entry-name>logback/context-name
</env-entry-name>
<env-entry-type>java.lang.String
</env-entry-type>
<env-entry-value>kenobi
</env-entry-value>
</env-entry>
“logback/configuration-resource” 的值来
指定配置文件名。例如:
<env-entry-name>logback/configuration-resource
</env-entry-name>
<env-entry-type>java.lang.String
</env-entry-type>
<env-entry-value>aFolder/my_config.xml
</env-entry-value>
WEB-INF/classes/aFolder/目录下。
logback-classic-1.1.7.jar, logback-core-1.1.7.jar and slf4j-api-1.7.20.jar
)放置在tomcat的lib共享目录下。
, catalina.bat启动脚本
ContextDetachingSCL ,是被设计用来分离与旧web-application实例关联的ContextSelector实例。通过在web.xml中添加一下代码使用:
<listener-class>ch.qos.logback.classic.selector.servlet.ContextDetachingSCL
</listener-class>
LoggerContextFilter,通过在web.xml中添加如下代码使用:
<filter-name>LoggerContextFilter
</filter-name>
<filter-class>ch.qos.logback.classic.selector.servlet.LoggerContextFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggerContextFilter
</filter-name>
<url-pattern>/*
</url-pattern>
</filter-mapping>
ThreadLocal变量。ContextJNDISelector会首先查找ThreadLocal变量,如果在ThreadLocal中找到,则会跳过JNDI查找。需要注意,在LoggerContextFilter的doFilter()方法之后,ThreadLocal变量将会被移除变为null。
class
Foo
{
static
Logger logger
=
LoggerFactory
.getLogger
(
Foo
.
class
);
…
}
SiftingAppender 来达到既使用JNDI,又要分离日志的功能。
JNDIBasedContextDiscriminator ,会返回由ContextJNDISelector计算出的当前 logger context的名称。
<statusListener
class
=
“ch.qos.logback.core.status.OnConsoleStatusListener”
/>
<appender
name
=
“SIFT”
class
=
“ch.qos.logback.classic.sift.SiftingAppender”
>
<discriminator
class
=
“ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator”
>
<defaultValue>unknown
</defaultValue>
</discriminator>
<sift>
<appender
name
=
“FILE-${contextName}”
class
=
“ch.qos.logback.core.FileAppender”
>
<file>
${contextName}.log
</file>
<encoder>
<pattern>%-50(%level %logger{35}) cn=%contextName – %msg%n
</pattern>
</encoder>
</appender>
</sift>
</appender>
<root
level
=
“DEBUG”
>
<appender-ref
ref
=
“SIFT”
/>
</root>
</configuration>
logback-starwars 项目来尝试刚才说的技术。
http://localhost:port/yoda/servlet 会调用YodaServlet,这个servlet输出hello,并且在调用foo方法前,Mustafar会输出简单的日志。调用YodaServlet后,yoda.log会包含以下内容
cn=kenobi – in doGet()
cn=yoda – in foo()
<statusListener
class
=
“ch.qos.logback.core.status.OnConsoleStatusListener”
/>
<appender
name
=
“SIFT”
class
=
“ch.qos.logback.classic.sift.SiftingAppender”
>
<discriminator
class
=
“ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator”
>
<defaultValue>unknown
</defaultValue>
</discriminator>
<sift>
<appender
name
=
“FILE-${contextName}”
class
=
“ch.qos.logback.core.FileAppender”
>
<file>${contextName}.log
</file>
<prudent>true</prudent>
<encoder>
<pattern>%-50(%level %logger{35}) cn=%contextName – %msg%n
</pattern>
</encoder>
</appender>
</sift>
</appender>
<root
level
=
“DEBUG”
>
<appender-ref
ref
=
“SIFT”
/>
</root>
</configuration>