Làm cách nào để tắt trình xử lý bảng điều khiển mặc định trong khi sử dụng API ghi nhật ký java?


92

Xin chào Tôi đang cố gắng triển khai đăng nhập java trong ứng dụng của mình. Tôi muốn sử dụng hai trình xử lý. Một trình xử lý tệp và trình xử lý bảng điều khiển của riêng tôi. Cả hai trình xử lý của tôi đều hoạt động tốt. Việc ghi nhật ký của tôi được gửi đến một tệp và đến bảng điều khiển. Nhật ký của tôi cũng được gửi đến trình xử lý giao diện điều khiển mặc định, mà tôi không muốn. Nếu bạn chạy mã của tôi, bạn sẽ thấy thêm hai dòng được gửi đến bảng điều khiển. Tôi không muốn sử dụng trình xử lý bảng điều khiển mặc định. Có ai biết cách vô hiệu hóa trình xử lý giao diện điều khiển mặc định không. Tôi chỉ muốn sử dụng hai trình xử lý mà tôi đã tạo.

Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingExample {
    private static Logger logger = Logger.getLogger("test");

    static {
        try {
            logger.setLevel(Level.INFO);

            Formatter formatter = new Formatter() {

                @Override
                public String format(LogRecord arg0) {
                    StringBuilder b = new StringBuilder();
                    b.append(new Date());
                    b.append(" ");
                    b.append(arg0.getSourceClassName());
                    b.append(" ");
                    b.append(arg0.getSourceMethodName());
                    b.append(" ");
                    b.append(arg0.getLevel());
                    b.append(" ");
                    b.append(arg0.getMessage());
                    b.append(System.getProperty("line.separator"));
                    return b.toString();
                }

            };

            Handler fh = new FileHandler("test.txt");
            fh.setFormatter(formatter);
            logger.addHandler(fh);

            Handler ch = new ConsoleHandler();
            ch.setFormatter(formatter);
            logger.addHandler(ch);

            LogManager lm = LogManager.getLogManager();
            lm.addLogger(logger);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
    }
}

1
Tôi có thể nhẹ nhàng đề nghị sử dụng b.append(formatMessage(arg0))thay vì b.append(arg0.getMessage()). Với formatMessagephương pháp bạn đang làm cho bộ định dạng của bạn tương thích với việc sử dụng public void log(Level level, String msg, Object param1)và các phương pháp tương tự.
Victor

Câu trả lời:


102

Trình xử lý giao diện điều khiển mặc định được đính kèm với trình ghi gốc, là trình gốc của tất cả các trình ghi nhật ký khác bao gồm cả trình ghi của bạn. Vì vậy, tôi thấy hai cách để giải quyết vấn đề của bạn:

Nếu điều này chỉ ảnh hưởng đến lớp cụ thể này của bạn, giải pháp đơn giản nhất sẽ là vô hiệu hóa việc chuyển các bản ghi lên trình ghi nhật ký mẹ:

logger.setUseParentHandlers(false);

Nếu bạn muốn thay đổi hành vi này cho toàn bộ ứng dụng của mình, bạn có thể xóa hoàn toàn trình xử lý bảng điều khiển mặc định khỏi trình ghi gốc trước khi thêm trình xử lý của riêng bạn:

Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

Lưu ý: nếu bạn cũng muốn sử dụng cùng một trình xử lý nhật ký trong các lớp khác, cách tốt nhất là di chuyển cấu hình nhật ký thành một tệp cấu hình về lâu dài.


2
Phương thức setUseParentHandlers hoạt động, cảm ơn. Làm cách nào để xóa trình xử lý giao diện điều khiển mặc định khỏi trình ghi gốc?
loudiyimo

10
Bạn cũng có thể sử dụng Logger.getLogger ( "") - tác phẩm này cho tôi biết nơi "toàn cầu" không (có thể là kết quả của SLF4J trong hỗn hợp?)
sehugg

2
Nếu bạn muốn slf4j tôi đề nghị bạn sử dụng này LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Somatik

8
"" là định danh của trình ghi gốc. "toàn cầu" là một logger tên (con của root) mà được tạo ra theo mặc định và được sử dụng trong các kịch bản đăng nhập đơn giản
Paolo Fulgoni

1
Câu trả lời này không làm việc cho tôi nhưng từng người Dominique không
BullyWiiPlaza

108

Cứ làm đi

LogManager.getLogManager().reset();

1
Cảm ơn bạn, đây là câu trả lời đúng. Câu trả lời được đánh dấu là đúng, không hoạt động.
Andreas L.

1
Điều này sẽ chỉ ra rằng điều này sẽ ảnh hưởng đến mọi trình xử lý cho mọi được đặt tên Loggervì vậy đây có thể là một vấn đề đối với một hệ thống Nhật ký phức tạp hơn. Điều này nên được gọi một lần khi bắt đầu quá trình để đảm bảo rằng trình ghi nhật ký tương lai sẽ không bị ảnh hưởng. Và tất nhiên, một trong những cần bảng điều khiển sẽ cần phải nhận được ConsoleHandlernhư mong đợi.
AxelH

20

Điều này thật lạ nhưng Logger.getLogger("global") không hoạt động trong thiết lập của tôi (cũng như Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Tuy nhiên Logger.getLogger("")làm tốt công việc.

Hy vọng thông tin này cũng giúp ai đó ...


3
ai đó có thể cho chúng tôi biết tại sao getLogger (Logger.GLOBAL_LOGGER_NAME) không hoạt động nhưng getLogger ("") thì không?
deinocheirus

2
@deinocheirus xem nhận xét của tôi cho câu trả lời
Paolo Fulgoni

9

Thực hiện đặt lại cấu hình và đặt mức gốc thành TẮT

LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);

5

Bạn phải hướng dẫn trình ghi nhật ký của mình không gửi tin nhắn của nó lên đến trình ghi nhật ký mẹ của nó:

...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...

Tuy nhiên, điều này nên được thực hiện trước khi thêm bất kỳ trình xử lý nào nữa vào trình ghi nhật ký.


Điều này đã hoạt động trong trường hợp của tôi, mặc dù tôi phải thêm trình xử lý theo cách thủ công cho trình ghi nhật ký này.
Sachin Gorade
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.