2009-04-18 24 views
9

Tôi có một EAR với cấu trúc như sau:Làm thế nào để cấu hình nhiều log4j cho các cuộc chiến tranh khác nhau trong một EAR?

APP.ear 
- APP1.war 
    - WEB-INF/classes/log4j.properties 
- APP2.war 
    - WEB-INF/classes/log4j.properties 
- app1-ejb.jar 
- app2-ejb.jar 
- log4j.jar 
- spring.jar 
- commons-lang.jar (...and other jar) 

Tôi muốn mỗi WAR có log ứng dụng riêng của họ. Nhưng có vẻ như cấu hình trên không hoạt động. Đăng nhập APP1 và APP2 vào nhật ký của APP1. Có cách nào để tạo nhật ký ứng dụng riêng biệt không?

Trả lời

7

Nó chỉ ra rằng nó không thể do trình nạp lớp. Các hệ thống phân cấp classloader giống như:

Application classloader -> EJB classloader -> chiến tranh classloader

Để có một bản ghi sepearte cho chiến tranh cá nhân, người ta có thể đưa log4j.jar bên trong chiến tranh và để cho các log4j sử dụng classloader chiến tranh. Nhưng vì cả app1-ejb.jar và app2-ebj.jar cũng cần sử dụng log4j, log4j.jar chỉ có thể được đặt ở cấp cao nhất. Vì vậy, log4j ở cấp ứng dụng trình nạp lớp.

Tôi có thể chỉ định một cấu hình log4j duy nhất để ghi nhật ký gói khác nhau vào các tệp khác nhau. Nhưng đối với các thư viện chung như mùa xuân, nhật ký không thể được sepearted.

+0

"Nhưng vì cả app1-ejb.jar và app2-ebj.jar cũng cần phải sử dụng log4j, log4j.jar chỉ có thể được đặt ở cấp cao nhất." Bạn không thể chỉ bao gồm một log4j.jar trong mỗi tệp WAR? – CodeClimber

0

Bạn cũng có thể làm điều đó bằng cách tự động thay đổi thuộc tính FILE trong tệp thuộc tính bằng cách sử dụng PropertyConfigurator trong mã.

1

Lý do nó không hoạt động vì log4j có mặt tại vị trí gốc, thay vào đó hãy để mỗi cuộc chiến có một Log4j.jar trong thư mục WEB-INF/lib và xóa log4j.jar khỏi thư mục gốc.

Để biết thêm về tham khảo blog của tôi bài viết này trên này http://techcrawler.wordpress.com/

0

Logback là một giải pháp khả thi để giải quyết vấn đề này. Sau khi nhìn xung quanh các hack khác nhau để thực hiện công việc này với log4j, chúng tôi đã quyết định chuyển sang Logback. Tôi đã sử dụng cấu hình sau với jar Logback bên trong webapp.

tập tin

Một Logback bên trong webapp trong đó bao gồm một tập tin bên ngoài:

<?xml version="1.0" encoding="UTF-8" ?> 
    <configuration scan="true" scanPeriod="10 seconds"> 
     <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
      <resetJUL>true</resetJUL> 
     </contextListener> 

     <contextName>${project.artifactId}</contextName> 

     <jmxConfigurator /> 

     <include file="${logback.configuration.filepath}" /> 
    </configuration> 

${logback.configuration.filepath} được thay thế trong Maven lọc bởi các con đường chính xác, bên ngoài để webapp của tập tin cấu hình (giống như /opt/máy chủ /conf/loback.included.conf).

Và sau đó, nội dung của logback.included.conf (tập tin này là một phần của projetct, giao với build-helper:attach-artifact, vì vậy ${project.artifactId} cũng được thay thế trong Maven lọc):

<?xml version="1.0" encoding="UTF-8" ?> 
    <included> 
     <appender name="file" class="ch.qos.logback.core.FileAppender"> 
      <file>/var/log/server/${project.artifactId}.log</file> 
      <encoder> 
       <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern> 
      </encoder> 
     </appender> 

     <root level="INFO"> 
      <appender-ref ref="file" /> 
     </root> 
    </included> 

Chỉ giới hạn, nội dung của các bao gồm tệp phải tuân thủ một trong các tệp includer. Chỉ cần viết quy tắc trên thực tế.

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