[英]Tomcat WAR - Configure Logback to use app name in path
我在war文件lib文件夾中部署了logback,並且在classes文件夾中有以下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的東西?
我想避免手動重新配置記錄器。
謝謝!
編輯2013-06 :我已將此Listener
作為Maven Central上的OSS提供。 查看項目主頁 。
是的,這是可行的。 首先,你總是可以依賴catalina.base
因為沒有它,Tomcat將無法運行。 為了將上下文名稱注入屬性。 編寫一個上下文監聽器 ,它將上下文名稱放入JNDI上下文中,並在關閉時刪除。 完成后,您可以使用logback直接使用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上運行。
這建立在Michael-O的答案之上。 考慮到catalina.base
在Tomcat下運行時始終是一個已定義的系統屬性,我們只需要擔心定義appName
。 Logback支持從JNDI檢索變量 。 如果在JNDI中定義了appName,則配置文件將變為:
<configuration>
<!-- retrieve appName from JNDI to set the variable appName -->
<insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
<!-- let the context name be the applicaiton name -->
<contextName>${appName}</contextName>
<property name="destination"
value="${catalina.base:-./temp}/logs/${CONTEXT_NAME:-myapp}" />
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${destination}.log</file>
... remainder of config file omitted for brevity
</appender>
</configuration>
我想提一下,您也可以直接在logback.xml中而不是在JNDI中定義appName。 (畢竟,logback.xml文件隨您的web-app一起提供,其名稱已經建立。但是,您的問題明確排除了此假設。)因此,您可以將logback.xml文件簡化為:
<configuration>
<contextName>the_name_of_your_webapp</contextName>
<property name="destination"
value="${catalina.base:-./temp}/logs/${CONTEXT_NAME:-myapp}" />
... the rest omitted for brevity
</configuration?
順便說一句,一旦找到滿意的解決方案,請不要猶豫,通過在logback-user列表上發布來分享它。
是不是ContextSelector? 您可以查看ContextJNDISelector和http://logback.qos.ch/manual/contextSelector.html
maxHistory並不意味着日志文件的數量。 這意味着月數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.