2013-04-08 39 views
8

Tôi hiện đang làm việc trên một chương trình trong đó, tôi phải ghi tất cả đầu ra vào tệp nhật ký.Ghi nhật ký với nhiều tham số

Tôi cần viết phương thức nhật ký, cung cấp đầu ra với mức, thông báo, giá trị đối tượng, thông báo khác, giá trị số nguyên, thông báo khác và giá trị số nguyên khác theo thứ tự như tôi đã chỉ định . Tôi không thể tìm thấy một phương pháp đăng nhập mà thực hiện điều này. Tôi đang sử dụng Java.util.logging. Điều này có thể không?

+0

Cân nhắc Log4J http://logging.apache.org/log4j/2.x/ – Mirco

+1

@ verbose-mode Tại sao? java util logging thực hiện tất cả những gì cần thiết và đơn giản hơn để sử dụng. Theo như tôi thấy nó gợi ý của bạn phá vỡ nguyên tắc KISS (Keep it Simple S…). – Martin

Trả lời

13

Tôi giả sử bạn cần định dạng đăng nhập dưới đây định dạng FINE, Message1, object.GetValue(), Message2,1, Message3,2

Bạn cần phải tạo một định dạng thông điệp đầu ra

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2}); 

Bây giờ bạn cần để tạo ra một định dạng tùy chỉnh mà bằng cách mở rộng lớp Formatter

public class DataFormatter extends Formatter { 

@Override 
public synchronized String format(LogRecord record) { 
    String formattedMessage = formatMessage(record); 
    String throwable = ""; 
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions 
    if (record.getThrown() != null) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     pw.println(); 
     record.getThrown().printStackTrace(pw); 
     pw.close(); 
     throwable = sw.toString(); 
    } 
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable); 
} 
} 

Bây giờ thiết lập các định dạng mới được tạo ra

for(int i=0;i<logger.getHandlers().length;i++) 
     logger.getHandlers()[i].setFormatter(new DataFormatter()); 
9

Đó là một chủ đề khá cũ, dù sao đi nữa, hai xu của tôi, bởi vì tôi cũng thích sử dụng java.util.logging.Logger` trong các dự án của tôi khi đủ.

Lambdas làm cho bản mẫu này mở rộng cho nhiều thông số tùy chỉnh nhiều hoặc ít lỗi thời, trừ khi bạn hưởng lợi từ việc sử dụng lại toàn bộ ứng dụng của nó. Trong các kịch bản đơn giản của tôi, thông điệp tường trình được điều chỉnh theo phần mã được chèn vào, vì vậy, String.format() thường dễ dàng hơn và linh hoạt hơn nhiều.

Trước Java 8 và lambdas, Formatter là khả năng duy nhất trì hoãn việc xây dựng thư. Chỉ có thay thế là, để xây dựng thông báo đăng nhập trước trước khi kiểm tra loggable dựa trên Cấp độ đã diễn ra.
Với Java 8 lambdas, định dạng Chuỗi có thể được hoãn lại sau khi kiểm tra loggable, nhưng vẫn có quyền truy cập vào ngữ cảnh phương thức gốc. Nhược điểm nhỏ duy nhất là, tất cả các trường truy cập cần phải là cuối cùng, do các hạn chế lambda.

Dưới đây là một đoạn khá đơn giản:

final String val1 = "lambda expression log message"; 
final Level level = Level.INFO; 
Logger.getGlobal().log(level,() -> 
     String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level) 
); 
Logger.getGlobal().log(level, new RuntimeException(),() -> 
     String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level) 
); 

Hope this helps một số bạn cũng muốn sử dụng được xây dựng trong khai thác gỗ :-)

Chúc mừng Ben

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