2012-05-22 14 views
8

Tôi muốn tạo và bật một trình bổ sung cho một phương thức cụ thể gọi MyMethod(), có đầu ra nhật ký được cho là đi đến tệp hiện tại tại "logFilePath" .Log4j: Tạo/sửa đổi các trình bổ sung khi chạy, tệp nhật ký được tạo lại và không được nối thêm

Tôi không muốn bao gồm ứng dụng này trong tệp cấu hình xml, vì vậy tôi đã nghĩ tạo nó trong thời gian chạy.

Trước tiên, tôi đã cố gắng sửa đổi các thuộc tính trình ghi nhật ký trong thời gian chạy và sau đó gọi activateOptions, ví dụ: thiết lập mức độ để DEBUG trước và thiết lập nó để Tắt trong khối cuối cùng, do đó đầu ra được đăng nhập chỉ trong khi phương pháp được sử dụng. Điều đó không hiệu quả.

Vấn đề của tôi ở đây là appender tạo lại một tệp mọi lúc và không thêm vào cùng một tệp. Điều này là cảm hứng của setAppend là đúng sự thật.

Tôi không quen thuộc với log4j, vì vậy vui lòng đề xuất phương pháp thay thế. Sau đây là mã mẫu để giải thích những gì tôi đang cố gắng.

private static FileAppender createNewAppender(String logFilePath) { 
    FileAppender appender = new FileAppender(); 
    appender.setName("MyFileAppender"); 
    appender.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n")); 
    appender.setFile(logFilePath); 
    appender.setAppend(true); 
    appender.setThreshold(Level.INFO); 
    appender.activateOptions(); 
    Logger.getRootLogger().addAppender(appender); 
    return appender; 
} 

private static void removeAppender() { 
    Logger.getRootLogger().removeAppender(fileAppender) ; // ("MyFileAppender"); 
} 

tôi gọi các phương pháp trên theo cách sau:

private static FileAppender fileAppender = null; 

private static void myMethod(String logFilePath) {   
    try { 
     fileAppender = createNewAppender(); 
     someOperation(); 
    } 
    finally { 
     removeAppender(); 
     fileAppender=null; 
    } 
} 

Trả lời

7

rất dễ dàng chỉ cần tạo một phương pháp và thêm này

String targetLog="where ever you want your log" 

FileAppender apndr = new FileAppender(new PatternLayout("%d %-5p [%c{1}] %m%n"),targetLog,true);  
logger.addAppender(apndr); 
logger.setLevel((Level) Level.ALL); 

sau đó trong phương pháp nào bạn cần phải đăng nhập chỉ cần làm này: logger.error ("lỗi của bạn ở đây");

0

tôi làm như sau từ scala (về cơ bản giống nhau):

Thiết lập mức độ khai thác gỗ gốc của tôi để theo dõi nhưng thiết lập các ngưỡng trên appenders toàn cầu của tôi để thông tin.

# Root logger option 
log4j.rootLogger=TRACE, file, stdout 

# log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=./log.log 
log4j.appender.file.MaxFileSize=100MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss} %m%n 
log4j.appender.file.Threshold=INFO 

# log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %m%n 
log4j.appender.stdout.Threshold=INFO 

Sau đó, trong lớp tôi muốn đăng nhập:

private def set_debug_level(debug: String) { 
    import org.apache.log4j._ 
    def create_appender(level: Level) { 
    val console_appender = new ConsoleAppender() 
    val pattern = "%d %p [%c,%C{1}] %m%n" 
    console_appender.setLayout(new PatternLayout(pattern)) 
    console_appender.setThreshold(level) 
    console_appender.activateOptions() 
    Logger.getRootLogger().addAppender(console_appender) 
    } 
    debug match { 
    case "TRACE" => create_appender(Level.TRACE) 
    case "DEBUG" => create_appender(Level.DEBUG) 
    case _ => // just ignore other levels 
    } 
} 

Vì vậy, về cơ bản, kể từ khi tôi thiết lập các ngưỡng appender mới của tôi để theo dõi hoặc DEBUG nó sẽ thực sự gắn. Nếu tôi thay đổi thư mục gốc sang một cấp độ khác, nó sẽ không ghi lại mức thấp hơn.

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