gpt4 book ai didi

java - Tomcat WAR - 配置 Logback 以在路径中使用应用程序名称

转载 作者:太空狗 更新时间:2023-10-29 22:55:48 26 4
gpt4 key购买 nike

我在我的 war 文件 lib 文件夹中部署了 logback,并且在类文件夹中有以下 logback.xml。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="destination" value="${catalina.base:-./temp}/logs/${appName:-myapp}" />

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${destination}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${destination}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- Keep logs for 7 days -->
<maxHistory>7</maxHistory>

<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="error">
<appender-ref ref="ROLLING" />
</root>
</configuration>

在第 3 行,我有一些变量替换为我的日志文件创建了路径。

  <property name="destination" value="${catalina.base:-./temp}/logs/${appName:-myapp}" />

我想让 ${appName} 评估为部署的 war 文件的当前名称。

如果我的网络应用程序文件夹看起来像这样

webapps
- myapp.war
- myapp-dev.war

myapp.war 的 ${destination} 属性将评估为 .../logs/myapp 而 myapp-dev.war 将评估为 。 ../logs/myapp-dev。是否有 JNDI 属性或我可以访问的东西来访问 appName ?

我想避免手动重新配置记录器。

谢谢!

最佳答案

EDIT 2013-06:我已将此 Listener 作为 Maven Central 上的 OSS 提供。查看project homepage .

是的,这是可行的。首先,您始终可以依赖 catalina.base,因为没有它 Tomcat 将无法运行。为了将上下文名称作为属性注入(inject)。写上下文listener这会将上下文名称放入 JNDI 上下文并在关闭时删除。完成后,您可以使用 JNDI 直接使用 logback 检索值。对此有直接的支持。将其写入 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 上运行而无需更改。

关于java - Tomcat WAR - 配置 Logback 以在路径中使用应用程序名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com