phương thức logger.setLevel() không có sẵn trong API log4j2. Vì vậy, làm thế nào để thiết lập mức độ đăng nhập tại thời gian chạy.cách đặt loglevel từ INFO thành ERROR bằng cách sử dụng api log4j2 khi chạy?
Trả lời
Tôi không chắc đây có phải là cách tốt nhất hay không, nhưng bạn đặt cấp độ trên org.apache.logging.log4j.core.config.LoggerConfig mà bạn có thể lấy từ LoggerContext qua LogManager.
Sau khi thiết lập, bạn có thể cập nhật nhật ký bằng cấu hình mới.
Như một ví dụ:
public static void main(String[] args) {
Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
log.error("An error");
log.debug("A debug");
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);
log.error("Another error");
log.debug("Another debug");
}
Sản lượng:
14:03:41.346 [main] ERROR - An error
14:03:41.348 [main] ERROR - Another error
14:03:41.348 [main] DEBUG - Another debug
Hoạt động tốt cho trình ghi nhật ký gốc, nhưng không hoạt động đối với bất kỳ trình ghi nhật ký nào khác - mỗi gói, ví dụ . Trong trường hợp này, mức nhật ký có vẻ không thay đổi, ngay cả khi gọi 'reconfigure' trong ngữ cảnh. – amoe
@amoe cùng một vấn đề ở đây. tôi đoán điều này liên quan đến bối cảnh đúng trên chương trình webapp. bạn đã quản lý để thay đổi tất cả các cấp độ logger? – oak
tín dụng để amcintosh, tôi quấn họ answer trong một chức năng:
/** Override the logging level of a given logger, return the previous level */
public static Level setLevel(Logger log, Level level) {
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
LoggerConfig lconf = conf.getLoggerConfig(log.getName());
Level oldLevel = lconf.getLevel();
lconf.setLevel(level);
ctx.updateLoggers(conf);
return oldLevel;
}
Mặc dù bình luận amoe, điều này dường như được làm việc một cách chính xác cho tôi bằng cách sử dụng Log4J 2.5.
Nó có thể được cấu hình cho chủ đề cụ thể không?Hành vi giống như ThreadContext. – theGamblerRises
@ theGamblerRises Tôi khuyên bạn nên đăng câu hỏi riêng, thay vì cố gắng khám phá điều này trong các nhận xét. Tôi có thể đoán rằng bạn không thể kiểm soát mức log cho mỗi luồng với cơ chế này, nhưng cũng có thể có những cách khác để làm những gì bạn muốn. Nếu bạn đăng câu hỏi riêng, hãy chia sẻ liên kết tới câu hỏi đó tại đây. – dimo414
Về phía tôi, tôi đã phải sử dụng mã này để có tiền phạt hoạt động này (dựa trên câu trả lời trước đó).
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
...
public static void changeLoggerLevel(final String module, final Level level) {
String moduleRenamed = module.replaceAll("/", ".");
LoggerContext ctx = (LoggerContext)LogManager.getContext(false);
AbstractConfiguration configuration = (AbstractConfiguration) ctx
.getConfiguration();
if (configuration.getLogger(moduleRenamed) != null) {
LoggerConfig loggerConfig = configuration.getLoggerConfig(moduleRenamed);
loggerConfig.setLevel(level);
} else {
LoggerConfig loggerConfig = new LoggerConfig(moduleRenamed, level, true);
configuration.addLogger(moduleRenamed, loggerConfig);
}
ctx.updateLoggers(configuration);
}
Sự cố xảy ra với cuộc gọi getLoggerConfig()
; nếu mô-đun bạn đang cố gắng cung cấp mức mới chưa được đăng ký, phương thức này trả về trình ghi gốc (hoặc bất kỳ đường dẫn con trung gian nào đã đăng ký), và do đó thay vì thay đổi mức cho com.mycompany
, bạn sẽ thay đổi mức root
hoặc com
. Đó là lý do tại sao bạn phải thêm LoggerConfig
mới trong trường hợp mô-đun để thay đổi chưa được đăng ký.
Bắt tốt, hành vi đó được ghi lại, nhưng không phải những gì mọi người thường mong đợi. Nếu tôi hiểu những gì bạn đang nói tuy nhiên, điều này tương đương có thể được giải quyết bằng cách đơn giản đảm bảo 'Logger' tồn tại trước khi gọi' getLoggerConfig() ', phải không? – dimo414
Tôi chưa thử, nhưng tôi có thể nói rằng logger kế thừa từ cấp trên (có thể là root), và vì vậy luôn luôn được định nghĩa ... dường như chỉ là thừa kế cấu hình không được cung cấp đầy đủ (và đó là cấu hình phải được thay đổi để thay đổi cấp độ nhật ký, không phải bản ghi nhật ký). – SRG
đã làm các trick, cảm ơn! – leeor
Các API sau trong lớp org.apache.logging.log4j.core.config.Configurator phép bạn thay đổi cấp độ:
Gary Gregory là đúng.
Ngoài ra câu trả lời cho câu hỏi này là ngay trên trang FAQ ở trang web log4j2 của
https://logging.apache.org/log4j/2.x/faq.html#reconfig_level_from_code
Mẫu Mã dưới đây:
Configurator.setLevel(logger.getName(), Level.INFO);
Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (// meta.stackoverflow.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – Draken
Đã cập nhật câu trả lời với mẫu mã. –
có thể trùng lặp của [Lập trình thay đổi mức độ đăng nhập Log4j2] (http://stackoverflow.com/questions/23434252/programmatically-change-log-level-in-log4j2) –