Làm cách nào để thiết lập ghi nhật ký java bằng tệp thuộc tính? (java.util.logging)


82

Tôi gặp sự cố ghi nhật ký java ngu ngốc: Tôi đang tải cấu hình ghi nhật ký từ tệp cấu hình ứng dụng của mình - nhưng nó không đăng nhập bất kỳ thứ gì sau khi đọc tệp (trông khá giống với các ví dụ bạn sẽ tìm thấy trên mạng ngoại trừ cấu hình ứng dụng bổ sung - loại bỏ điều này cũng không giúp ích). Dòng nhật ký "khởi tạo ..." xuất hiện tốt, nhưng "ứng dụng khởi động" và bất kỳ thông báo nào khác đều không được ghi vào bảng điều khiển, cũng như tệp nhật ký đã từng được tạo. Tôi còn thiếu gì ở đây?

Mã Logger trông giống như sau:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

Và đây là tệp cấu hình:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL

Câu trả lời:


28

Được rồi, trực giác đầu tiên là ở đây:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

Trình phân tích cú pháp tệp hỗ trợ Java không phải là tất cả thông minh, tôi không chắc nó sẽ xử lý điều này. Nhưng tôi sẽ xem lại tài liệu lần nữa ....

Trong thời gian này, hãy thử:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

Cập nhật

Không, duh, cần thêm cà phê. Đừng bận tâm.

Trong khi tôi nghĩ nhiều hơn, hãy lưu ý rằng bạn có thể sử dụng các phương thức trong Thuộc tính để tải và in tệp prop: có thể đáng để viết một chương trình tối thiểu để xem java nghĩ nó đọc gì trong tệp đó.


Cập nhật khác

Đường thẳng này:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

có thêm một dấu ngoặc cuối. Nó sẽ không biên dịch. Đảm bảo rằng bạn đang làm việc với tệp lớp mà bạn nghĩ rằng bạn đang có.


Chà, nó có liên quan gì đó đến dòng readConfiguration - Tôi đã thực hiện điều này bằng trình gỡ lỗi và tất cả các thuộc tính của LogManager sẽ bị xóa sau cuộc gọi này.
VolkA

5
Ồ vâng, hiểu rồi - tôi đang sử dụng cùng một luồng đầu vào hai lần, vì vậy tôi cần phải định vị lại nó bằng cách sử dụng configFile.reset () - nếu không thì lời gọi loadConfiguration () sẽ không có gì để đọc. Btw. the) chỉ là một lỗi sao chép từ mã làm việc của tôi.
VolkA

1
Tôi không chắc câu trả lời ở đây là gì?
Ondra Žižka

@ OndraŽižka câu trả lời là "mã của bạn không hoạt động do lỗi cú pháp."
Charlie Martin

101

bạn có thể đặt tệp cấu hình ghi nhật ký của mình thông qua dòng lệnh:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

cách này có vẻ sạch hơn và dễ bảo trì hơn.


1
Có, tôi có thể sẽ thêm một kiểm tra nếu thuộc tính này được đặt và để nó ghi đè lên cấu hình của tôi - mặc dù vậy, có tất cả trong một tệp cấu hình hoạt động ngoài hộp sẽ rất tốt. Cảm ơn!
VolkA

12

Tôi đã thử mã của bạn trong đoạn mã trên, không sử dụng câu lệnh [ferences.load (configFile);] và nó sẽ hoạt động. Có mã mẫu đang chạy

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}

1
đâu nên là p.properties liên quan đến lớp chính?
Luís Soares

9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

điều này đang hoạt động .. :) bạn phải truyền InputStream trong readConfiguration ().


3

Bạn đang tìm kiếm tệp nhật ký theo đúng đường dẫn:% h / one% u.log

Ở đây% h giải quyết cho nhà của bạn: Trong windows, cài đặt này được mặc định là: C: \ Documents and Settings (user_name).

Tôi đã thử mã mẫu mà bạn đã đăng và nó hoạt động tốt sau khi bạn chỉ định đường dẫn tệp cấu hình (logging.properties hoặc thông qua mã hoặc java args).


Thưa ông, tôi có thể biết tài liệu trực tuyến nói rằng% h giải quyết cho nhà tôi ở đâu,% u giải quyết cho một cái gì đó khác, v.v.
Luk Aron
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.