2013-05-15 41 views
11

Tôi có hai gói sau:Sử dụng Log4J 1. *, làm thế nào tôi có thể viết hai gói cho hai tệp riêng biệt?

com.mycorp.project.first
com.mycorp.project.second

Tôi muốn cấu hình Log4J (SLF4J) để viết các bản ghi từ một gói vào một tệp và từ gói khác sang tệp thứ hai. Tôi không muốn chúng được trộn lẫn với nhau.

Để rõ ràng, đây là một dự án/một quy trình đang chạy.

Tôi đã thử lọc và có nhật ký nhưng dường như chúng bị bỏ qua bởi log4j. Cả hai tệp đều giống hệt nhau.

Chỉnh sửa: Cảm ơn bạn đã trả lời cho đến nay, đây là những gì tôi đã có và nó không hoạt động. Cả hai tệp đầu ra đều giống hệt nhau.

<configuration debug="true"> 
<contextName>dev</contextName> 

<appender name="FIRST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>A:/dev/LogTesting/logs/first.log</file> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>INFO</level> 
    </filter> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>A:/dev/LogTesting/logs/first.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%d{MMM dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 

<appender name="SECOND_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>A:/dev/LogTesting/logs/second.log</file> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>INFO</level> 
    </filter> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>A:/dev/LogTesting/logs/second.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern> 
    </rollingPolicy> 
    <encoder> 
     <Pattern>%d{MMM dd HH:mm:ss.SSS} %property{HOSTNAME} [%thread] %level %logger{36} %msg%n</Pattern> 
    </encoder> 
</appender> 

<!-- =============================================================== --> 
<logger name="com.test.apples" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="FIRST_FILE" /> 
</logger> 

<logger name="com.test.oranges" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SECOND_FILE" /> 
</logger> 
<!-- =============================================================== --> 

<category name="com.test.apples" additivity="false"> 
    <priority value="DEBUG"/> 
    <appender-ref ref="FIRST_FILE"/> 
</category> 

<category name="com.test.oranges" additivity="false"> 
    <priority value="DEBUG"/> 
    <appender-ref ref="SECOND_FILE"/> 
</category> 

<!-- =============================================================== --> 

<!-- default --> 
<root level="WARN"> 
    <appender-ref ref="FIRST_FILE" /> 
    <appender-ref ref="SECOND_FILE" /> 
</root> 

Trả lời

21

Hãy thử điều này là ví dụ về thuộc tính file:

log4j.rootLogger=DEBUG, CONSOLE 
# Each package has different appender name  
log4j.logger.com.mycorp.project.first=DEBUG, FIRST 
log4j.logger.com.mycorp.project.second=DEBUG, SECOND 

log4j.appender.FIRST=org.apache.log4j.RollingFileAppender 
log4j.appender.FIRST.File=./first.log 
log4j.appender.FIRST.layout=org.apache.log4j.PatternLayout 

log4j.appender.SECOND=org.apache.log4j.RollingFileAppender 
log4j.appender.SECOND.File=./second.log 
log4j.appender.SECOND.layout=org.apache.log4j.PatternLayout 

hay này cho XML (chỉ làm nổi bật vai trò quan trọng):

<!-- FIRST appender definition --> 
<appender name="FIRST" class="org.apache.log4j.FileAppender"> 
    ... 
</appender> 

<!-- SECOND appender definition --> 
<appender name="SECOND" class="org.apache.log4j.FileAppender"> 
    ... 
</appender> 

<!-- logger package com.mycorp.project.first --> 
<logger name="com.mycorp.project.first"> 
    <level value="DEBUG" /> 
    <appender-ref ref="FIRST"/> 
</logger> 

<!-- logger for package com.mycorp.project.second --> 
<logger name="com.mycorp.project.second"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SECOND"/> 
</logger> 
+0

Xin lỗi, tôi quên đề cập đến tôi có tệp cấu hình xml. Tương đương với điều này trong xml là gì? log4j.logger.com.mycorp.project.first = DEBUG, FIRST – Csaba

+0

Xem câu trả lời cập nhật của tôi. Có thể nó hữu ích cho bạn của bạn! –

+0

Tôi có hai câu hỏi về vấn đề này: 1. Nếu sự khác biệt giữa các ứng dụng chỉ là tên tệp, có cách nào để xác định các thuộc tính chung một lần (XML) để tránh dự phòng không? 2. Có thể lập bản đồ một trình ghi nhật ký cho nhiều gói không? – clicky

1

đặt dynamiclly nộp con đường .in log4j.properties

log4j.appender.FILE.File=${file.name} 

Và trong java đường bộ tập tin System.setProperty("file.name", FILEPATH);

+0

+1 để cập nhật động đường dẫn .. Cảm ơn – LMSingh

2

Tạo hai appenders LOG1LOG2, một cho mỗi tập tin đăng nhập . Sau đó xác định hai loại (một cho mỗi gói) với tham chiếu đến các appender này trong tệp cấu hình log4j.

<category name="com.mycorp.project.first" additivity="true"> 
    <priority value="TRACE"/> 
    <appender-ref ref="LOG1"/> 
</category> 

Appender2

<category name="com.mycorp.project.second" additivity="true"> 
    <priority value="TRACE"/> 
    <appender-ref ref="LOG2"/> 
</category> 


0

bạn chỉ cần chỉ định 2 ứng dụng, nhưng cung cấp tên tệp nhật ký đầu ra giống nhau cho cả hai.

#same appender for both packages 
log4j.logger.package1=INFO,MyCommonLogger  
log4j.logger.package2=INFO,MyCommonLogger 

log4j.appender.MyCommonLogger=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.MyCommonLogger.layout=org.apache.log4j.PatternLayout 
log4j.appender.MyCommonLogger.layout.ConversionPattern=%t %d{MM/dd/yy HH:mm:ss} %x %-5p %c %M - %m%n 

#single log file for logs from both packages 
log4j.appender.MyCommonLogger.File=/somewhereonserver/log/mysinglelogfile.log