2015-07-28 13 views
15

Loại câu đố ở đây.Cách xác định các biến trong xmls của mùa xuân để sử dụng trong log4j.properties

Tôi có một ứng dụng trong WAR. Có tệp web.xml và application.xml trong đó, và cũng có log4j.properties. WAR này chạy trong tomcat.

Có khả năng sử dụng một số biến trong log4j.properties, ví dụ: log4j.appender.file.File=${catalina.base}/logs/app.log

Tôi muốn xác định một biến trong web.xml hoặc context.xml và sử dụng nó trong log4j.properties. Ví dụ: bằng cách nào đó đặt version=1.1 và sử dụng log4j.appender.file.File=${catalina.base}/logs/app-${version}.log. Nó không phải là một biến môi trường.

Tôi có thể làm điều đó mà không cần biên dịch lại ứng dụng không?

ADD không ảnh hưởng đến bất cứ điều gì, nhưng chỉ trong trường hợp ...

web.xml của nó trông như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee"> 

<!-- Spring --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:context.xml</param-value> 
</context-param> 

<!-- log4j --> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>classpath:log4j.properties</param-value> 
</context-param> 
<context-param> 
    <param-name>log4jRefreshInterval</param-name> 
    <param-value>10000</param-value> 
</context-param> 
<context-param> 
    <param-name>log4jExposeWebAppRoot</param-name> 
    <param-value>false</param-value> 
</context-param> 
... 
</web-app> 

Trả lời

0

Tôi nghĩ bạn có thể làm điều này bằng cách tuyên bố một bối cảnh -param trong web.xml và sử dụng tên param đó trong tệp thuộc tính mà bạn muốn đặt phiên bản hoặc bất kỳ thứ gì.

trong web.xml

<context-param> 
    <param-name>version</param-name> 
    <param-value>1.1</param-value> 
</context-param> 

trong tập tin tài sản

log4j.appender.file.File=${version}/logs/app.log 

này nên làm việc với một khởi động lại máy chủ, không có biên soạn cần thiết.

Bạn cũng có thể thử đặt thuộc tính từ xml và truy cập ti từ tệp thuộc tính.

trong web.xml

<Properties> 
    <Property name="version">1.1</Property> 
</properties> 

trong tập tin tài sản

log4j.appender.file.File=${version}/logs/app.log 
+0

Không, không. Ít nhất trong tomcat-7.0.52 nó không đưa ra thông báo lỗi/cảnh báo, nhưng tạo ra 'logs/app-.log' thay vì dự kiến' logs/app-1.1.log' khi 'nhật ký/ứng dụng - $ {phiên bản} .log' được chỉ định. –

+0

bạn đã thử đặt thuộc tính từ xml và truy cập thuộc tính từ tệp thuộc tính chưa? – javabot

+0

ở trên làm việc cho tôi khi tôi kiểm tra. – javabot

9

Tạo một lớp con của org.springframework.web.util.Log4jConfigListener mà phơi bày version giá trị như biến hệ thống (và tất nhiên bạn có thể vượt qua các giá trị thông qua hệ thống tiêu chuẩn/Biến môi trường Java).

public class TestListener extends Log4jConfigListener{ 

    @Override 
    public void contextInitialized(ServletContextEvent pEvent) { 
     String value = pEvent.getServletContext().getInitParameter("version"); 
     String version = System.getProperty("version"); 
     if (version == null || version.trim().length()==0) System.setProperty("version", value); 

     super.contextInitialized(pEvent); 
    } 
} 

Và sửa câu trả lời của bạn web.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5" 
     xmlns="http://java.sun.com/xml/ns/javaee"> 

    <!-- Spring --> 
    ... 
    <!-- log4j --> 
    <listener> 
     <listener-class>com.TestListener</listener-class> 
    </listener> 
    <context-param> 
     <param-name>version</param-name> 
     <param-value>1.1</param-value> 
    </context-param> 
    ... 
+0

Vì vậy, bạn nói tôi không thể làm điều đó mà không biên dịch lại ứng dụng. Tôi đã làm đúng chứ? –

+0

Giả sử bạn có một vài phiên bản ứng dụng trong một vùng chứa. Nó sẽ không can thiệp thông qua biến môi trường/jvm (đơn cho mỗi container)? –

+0

@AndreyRegentov. Bạn có thể làm điều đó bằng cách biên dịch lại ứng dụng bằng cách chuyển giá trị thông qua biến môi trường Hệ thống/Java chuẩn. – FoxyBOA

0

javabot về tuyên bố một ngữ cảnh param để đặt biến là đúng, nhưng để lấy nó trong tài sản của bạn tập tin, bạn sẽ cần một cái gì đó giống như https://code.google.com/p/eproperties/ ("EProperties mở rộng đối tượng java.util.Properties tiêu chuẩn và cú pháp để bao gồm những thứ như: thay thế biến, lồng, bao gồm và danh sách.").

Bạn có thể muốn nhìn vào câu hỏi trước đây: Reference other variables in Java properties file

Best of may mắn cho bạn trong việc tìm kiếm các giải pháp!

Các vấn đề liên quan