2012-05-17 21 views
11

Tôi đang cố thiết lập các tệp nhật ký riêng cho các gói khác nhau. Tôi đang sử dụng một lớp Wrapper cho trình ghi nhật ký log4j. Mỗi lớp trong ứng dụng của tôi gọi cùng một lớp bao bọc. My wrapper class:Làm cách nào để tạo các tệp nhật ký khác nhau cho các gói khác nhau bằng cùng một loggerj logger?

public class MyLogger 
{ 
    private static Logger logger = Logger.getLogger(MyLogger.class.getName()); 
    .... 
    .... 
} 

Nó được gọi như thế này:

MyLogger.write(, ,); 

Có cách nào để cấu hình log4j để nó kết quả đầu ra khai thác gỗ của các gói khác nhau để các file khác nhau?

Cảm ơn!

Edit:

Đây là log4j.properties tập tin của tôi:

log4j.rootLogger=DEBUG, infoout, aar 
log4j.logger.com.businessservice.datapopulation=DEBUG, aar 
log4j.additivity.com.businessservice.datapopulation=false 

log4j.appender.infoout = org.apache.log4j.RollingFileAppender 
log4j.appender.infoout.file=/app/aar_frontend.log 
log4j.appender.infoout.append=true 
log4j.appender.infoout.Threshold=DEBUG 
log4j.appender.infoout.MaxFileSize=2MB 
log4j.appender.infoout.MaxBackupIndex=10 
log4j.appender.infoout.layout = org.apache.log4j.PatternLayout 
log4j.appender.infoout.layout.ConversionPattern = %m%n 

log4j.appender.aar = org.apache.log4j.RollingFileAppender 
log4j.appender.aar.file=/app/aar/aar_backend.log 
log4j.appender.aar.append=true 
log4j.appender.aar.Threshold=DEBUG 
log4j.appender.aar.MaxFileSize=2MB 
log4j.appender.aar.MaxBackupIndex=10 
log4j.appender.aar.layout = org.apache.log4j.PatternLayout 
log4j.appender.aar.layout.ConversionPattern = %m%n 

Trả lời

4

Nếu bạn tạo một Trình ghi nhật ký tĩnh trong lớp MyLogger, thì bạn có một cá thể Logger, với tên được đặt là MyLogger. Khi bạn gọi logger đó từ các gói khác, Log4j không thể xác định nguồn gốc của các cuộc gọi đó, vì tất cả chúng đều sử dụng cùng một Logger.

Cách tốt nhất để xử lý nó, là để xác định một Logger riêng biệt trong mỗi lớp, nhưng nếu bạn muốn sử dụng một lớp như một điểm tiếp xúc với Log4j, sau đó bạn có thể làm điều này:

package com.daniel.logger; 
import org.apache.log4j.Logger; 

import com.daniel.package1.ClassA; 
import com.daniel.package2.ClassB; 

public class MyLogger{ 

    public static void write(String message, Class<?> clazz){ 
     Logger.getLogger(clazz).info(message); 
    } 

    public static void main(String[] args){ 
     ClassA.log(); 
     ClassB.log(); 
    } 
} 

sau đó, một trong những lớp học sử dụng nó có thể trông giống như:

package com.daniel.package1; 

import com.daniel.logger.MyLogger; 

public class ClassA { 

    public static void log(){ 
     MyLogger.write("ClassA",ClassA.class); 
    } 
} 

Và file log4j.properties sẽ trông như thế:

log4j.appender.package1=org.apache.log4j.FileAppender 
log4j.appender.package1.File=package1.log 
log4j.appender.package1.layout=org.apache.log4j.PatternLayout 

log4j.appender.package2=org.apache.log4j.FileAppender 
log4j.appender.package2.File=package2.log 
log4j.appender.package2.layout=org.apache.log4j.PatternLayout 

log4j.logger.com.daniel.package1=DEBUG,package1 
log4j.logger.com.daniel.package2=DEBUG,package2 

Nếu bạn không muốn vượt qua Lớp học từ ClassA, bạn có thể sử dụng mẹo khó chịu khi phản ánh, nhận tên của lớp gọi điện, nhưng tôi không khuyến nghị rằng do hiệu suất đạt được:

public class MyLogger 
{ 

    public static void write(String message){ 
     StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
     Logger.getLogger(stackTraceElements[2].getClassName()).info(message); 
    } 

    public static void main(String[] args){ 
     ClassA.log(); 
     ClassB.log(); 
    } 
} 
+0

Cảm ơn !.1 câu hỏi xin vui lòng: Tôi có thể kiểm tra (trong java) cho dù appender cho các lớp học cụ thể được xác định hay không trong tập tin cấu hình của log4j? – HashimR

0

Bạn có thể làm điều này như thế (com.myco.a và com.myco.b là 2 gói khác nhau của bạn):

log4j.logger.com.myco.a=DEBUG, infoout 
log4j.logger.com.myco.b=DEBUG, aar 

Chúc mừng.

+0

Đã thử. Không may mắn! – HashimR

+0

Bạn đang sử dụng cùng một trình ghi nhật ký trong mã của mình? Bạn có nghĩa là để tạo ra một logger trong mỗi lớp học – Philippe

+0

Tôi đang sử dụng cùng một lớp trình bao bọc trong tất cả các ứng dụng của tôi. Cũng được đề cập trong câu hỏi. – HashimR

0

Tạo 2 ứng dụng và 2 trình ghi nhật ký sẽ thực hiện những gì bạn muốn.

+0

Không thể đạt được bằng cách sử dụng đơn 'Logger'? – HashimR

0

Đọc vị trí tệp tùy chỉnh bắt buộc từ tệp thuộc tính hoặc cho mỗi gói. Sau đó, bạn có thể sử dụng phương thức dưới đây để cập nhật vị trí tệp log4j được đặt trong tệp nhật ký log4j:

private void updateLog4jConfiguration(String logFile) { 
    java.util.Properties properties = new Properties(); 
    try { 
     InputStream configStream = getClass().getResourceAsStream("/log4j.properties"); 
     properties.load(configStream); 
     configStream.close(); 
     } 
    catch (IOException e) { 
     System.out.println("Error: Cannot laod configuration file "); 
     } 
    properties.setProperty("log4j.appender.FILE.file", logFile); 
    org.apache.log4j.LogManager.resetConfiguration(); 
    org.apache.log4j.PropertyConfigurator.configure(properties); 
} 
+1

Điều đó sẽ không hoạt động tốt. Log4j sẽ cần phải chuyển đổi giữa hai tập tin tất cả các thời gian, bằng cách đóng dòng để một và mở cửa cho khác. – daniel

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