Ответ 1
EDIT 2013-06. Я сделал этот Listener
доступным как OSS на Maven Central. Ознакомьтесь с главной страницей проекта.
Да, это возможно. Прежде всего, вы всегда можете положиться на catalina.base
, потому что без него Tomcat не будет работать. Чтобы ввести имя контекста в качестве свойства. Напишите контекст listener, который поместит имя контекста в контекст JNDI и удалит его при завершении работы. После того, как вы это сделали, вы можете получить значение с помощью JNDI напрямую с помощью журнала. Для этого есть прямая поддержка. Напишите это в элементе contextName, и все готово.
Я уже реализовал это самостоятельно, и он работает для всех моих проектов. Я могу поделиться всем кодом в понедельник, если вам или кому-то еще интересно.
Изменить, вот код:
import org.apache.catalina.Context;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.deploy.ContextEnvironment;
import org.apache.commons.lang.StringUtils;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
public class LogbackContextNameListener implements LifecycleListener {
private static final Log logger = LogFactory
.getLog(LogbackContextNameListener.class);
private Context context;
private String name = "logback/contextName";
@Override
public void lifecycleEvent(LifecycleEvent le) {
if (le.getLifecycle() instanceof Context)
context = (Context) le.getLifecycle();
else
return;
if (le.getType().equals(Lifecycle.START_EVENT)) {
ContextEnvironment ce = new ContextEnvironment();
ce.setName(getName());
ce.setOverride(false);
ce.setType("java.lang.String");
String value = StringUtils.remove(context.getServletContext()
.getContextPath(), '/');
ce.setValue(value);
logger.debug(String.format("Adding env entry '%s' with value '%s'",
getName(), value));
context.getNamingResources().addEnvironment(ce);
}
if (le.getType().equals(Lifecycle.STOP_EVENT)) {
logger.debug(String.format("Removing env entry '%s'", getName()));
context.getNamingResources().removeEnvironment(name);
}
}
public String getName() {
return name;
}
public void setName(String name) {
if (StringUtils.isEmpty(name))
throw new IllegalArgumentException(
"Parameter 'name' cannot be empty");
this.name = name;
}
}
Соответствующая конфигурация выглядит следующим образом:
<configuration scan="true" scanPeriod="30 minutes">
<insertFromJNDI env-entry-name="java:comp/env/logback/contextName" as="contextName" />
<contextName>${contextName}</contextName>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.base}/logs/${CONTEXT_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${catalina.base}/logs/${CONTEXT_NAME}.log.%d.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-27(%d{HH:mm:ss.SSS} [%.-12thread]) %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO"><!-- WARN -->
<appender-ref ref="FILE" />
</root>
</configuration>
Это работает безупречно в Tomcat 6. Я думаю, он будет работать на Tomcat 7 без изменений.