Các ví dụ hay sử dụng java.util.logging [đã đóng]


273

Tôi muốn sử dụng nhật ký trong chương trình của tôi. Tôi đã nghe nói về java.util.logging , nhưng tôi không biết bắt đầu như thế nào.

Có bất kỳ ví dụ về những gì tôi có thể làm với đăng nhập? Làm thế nào tôi có thể sử dụng đăng nhập trong chương trình của riêng tôi?


7
Bạn có thể bắt đầu tại đây: slf4j.org/manual.html
Jeremy

1
Tôi đồng ý với Steven Vascellaro. Tôi mệt mỏi khi thấy các mặt hàng hữu ích bị phá hủy vì chính sách chủ đề không có kết thúc thực tế. Ngoài ra, tôn trọng không đồng ý với Jeremy, như OP đã hỏi về java.util.logging. Tôi cũng quan tâm đến việc đăng nhập tự nhiên (cảm ơn vì câu trả lời, grwww!)
NOP

Để đăng nhập dữ liệu trong một dòng: log.log (Level.INFO, "Thông điệp của tôi {0}", đối tượng mới [] {myDataId});
Mitja Gustin

Câu trả lời:


335

java.util.logging giúp bạn không phải tăng thêm một tệp jar xung quanh với ứng dụng của mình và nó hoạt động tốt với Trình định dạng tốt.

Nói chung, ở đầu mỗi lớp , bạn nên có:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Sau đó, bạn chỉ có thể sử dụng các tiện ích khác nhau của lớp Logger .


Sử dụng Level.FINEcho mọi thứ đang gỡ lỗi ở cấp cao nhất của luồng thực thi:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Sử dụng Level.FINER/ Level.FINESTbên trong các vòng lặp và ở những nơi mà bạn có thể không cần phải luôn thấy chi tiết đó khi gỡ lỗi các vấn đề về luồng cơ bản:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Sử dụng các phiên bản được tham số hóa của các phương tiện ghi nhật ký để tránh tạo ra hàng tấn rác nối chuỗi mà GC sẽ phải theo kịp. Object[]như trên là giá rẻ, trên phân bổ ngăn xếp thường.


Với xử lý ngoại lệ, luôn ghi nhật ký chi tiết ngoại lệ đầy đủ:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Tôi luôn chuyển ex.toString()như là tin nhắn ở đây, vì sau đó khi tôi " grep -n" cho " Exception" trong các tệp nhật ký, tôi cũng có thể thấy tin nhắn. Mặt khác, nó sẽ nằm trên dòng đầu ra tiếp theo được tạo bởi kết xuất ngăn xếp và bạn phải có RegEx cao cấp hơn để khớp với dòng đó, điều này thường giúp bạn có đầu ra nhiều hơn bạn cần xem qua.


3
Điều này có ghi vào một tập tin của một số loại. Tôi không thể làm cho nó hoạt động được trong chương trình của tôi. Tôi có dòng ban đầu mà bạn có nhưng không có gì đã được làm việc cho đến nay.
Doug Hauf

5
Làm thế nào để bạn xem các bản ghi? Một thư viện tôi đang sử dụng khởi tạo các đối tượng Logger và sử dụng .fine()phương thức để ghi nhật ký, nhưng dường như tôi không thể làm cho các thông báo hiển thị ...
Anubian Noob 4/2/2015

7
Tôi đã lập trình bằng Java từ năm 1998. Tôi luôn thấy việc đăng nhập vào Java trở nên đau đầu hơn nhiều so với mức cần thiết. Đây là lời giải thích đơn giản nhất về cách đăng nhập Java mà tôi đã đọc. Súc tích quá.
Steve McLeod

30
Điều thú vị là không ai đã đề cập, nơi người ta có thể tìm thấy các tệp nhật ký.
Ahmedov

4
Nếu bạn đang tự hỏi nhật ký sẽ đi đâu, hãy đảm bảo bạn đã thiết lập Trình xử lý cho Trình ghi nhật ký. Để chỉ cần xuất nhật ký ra bàn điều khiển, hãy sử dụng ConsoleHandler mới và thêm phần này vào logger của bạn bằng phương thức addHandler. Hãy chắc chắn rằng bạn gọi setLevel trên cả bộ ghi và trình xử lý.
Craig Brown

67

Nên khai báo logger như thế này:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

Vì vậy, nếu bạn cấu trúc lại tên lớp của bạn, nó theo sau.

Tôi đã viết một bài viết về java logger với các ví dụ ở đây .


53

Có nhiều ví dụ và các loại khác nhau để đăng nhập. Hãy xem gói java.util.logging .

Mã ví dụ:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Không có mã hóa cứng tên lớp :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
Tại sao không đặt tên nhật ký là Main.class.getSimpleName()? Bằng cách này, công cụ tái cấu trúc sẽ thay đổi nó một cách hợp lý nếu cần thiết, tuy nhiên, nó không quá rắc rối như giải pháp thứ hai của bạn.
Pijusn

3
Làm một stacktrace cho một tên logger là hack, chậm và không chính thống. Nó cũng sẽ phá vỡ và cung cấp cho bạn các tên lạ cho các proxy AOP hoặc ngoại lệ mã hóa byte khác.
Adam Gent

9
-1 cho doanh nghiệp stacktrace. Nó chậm và có khả năng ngăn chặn tối ưu hóa trình biên dịch.
phooji

4
Tại sao "sự chậm chạp" lại quan trọng khi khởi tạo logger? Các đề cập về sự chậm chạp là điều mà hầu hết mọi người sẽ gọi là tối ưu hóa sớm (Có, mã có vẻ hơi hack).
mikkom

3
@AndrewMcKinlay Trong tình huống nào nó phá vỡ bất cứ điều gì? Nếu thẻ logger được cho là giống với tên lớp, thì có vẻ như hoàn toàn ổn khi làm như vậy. Các công cụ tái cấu trúc sẽ tự động đổi tên nó trong khi, nếu đó là một chuỗi được mã hóa cứng, công cụ tái cấu trúc có thể bỏ qua nó hoặc nói "Bạn có muốn đổi tên này không?".
Pijusn

23

SLF4J là một mặt tiền ghi nhật ký tốt hơn so với Ghi nhật ký chung (ACL) của Apache. Nó có các cầu nối tới các khung ghi nhật ký khác, thực hiện các cuộc gọi trực tiếp tới ACL, Log4J hoặc Java Util Logging thông qua SLF4J, để bạn có thể chuyển tất cả đầu ra sang một tệp nhật ký nếu bạn muốn, chỉ với một tệp cấu hình nhật ký. Tại sao ứng dụng của bạn sẽ sử dụng nhiều khung đăng nhập? Bởi vì các thư viện của bên thứ 3 mà bạn sử dụng, đặc biệt là các thư viện cũ hơn, có thể làm được.

SLF4J hỗ trợ thực hiện đăng nhập khác nhau. Nó có thể xuất mọi thứ thành tiêu chuẩn, sử dụng Log4J hoặc Logback (được khuyến nghị trên Log4J).

http://www.slf4j.org/

http://logback.qos.ch/


9

Cá nhân tôi sẽ sử dụng minlog . Nó cực kỳ đơn giản, vì lớp ghi nhật ký là vài trăm dòng mã.


3
Đối với dấu chân tối thiểu, đây là thư viện để lựa chọn.
h3xStream

0

Tôi sẽ đề nghị bạn sử dụng tiện ích ghi nhật ký chung của Apache. Nó có khả năng mở rộng cao và hỗ trợ các tệp nhật ký riêng biệt cho các logger khác nhau. Xem tại đây .


11
Gợi ý tốt! tuy nhiên hãy cố gắng trả lời những gì họ yêu cầu, nếu không hãy để lại nhận xét;)
Ordiel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.