如何从我的类中获取引用类记录器消息作为字符串



我创建了一个名为" a "它有自己的参考类。我想把所有记录器消息作为字符串包括引用类"B"使用控制台附加程序。注:B类为第三方类,不能更新。

例如:

Class A {
public static void main(String[] args) {
final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(A.getClassName());
logger.setLevel(level);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
handler.setFormatter(new SimpleFormatter() {
@Override public String format(LogRecord record) {
return "Test---" + record.getMessage();
}
});
logger.addHandler(handler);
launch();
}
public static void launch() {
B s = new B();
s.getData();
logger.info("A log");
}
}
Class B {
final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(A.getClassName());
getData() {
logger.info("B log");
}
}

当前输出:

B log
Test---A log

预期输出:

Test---B log
Test---A log

使用反射可以修改它的行为:

import java.lang.reflect.Field;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class A {
final static java.util.logging.Logger logger = Logger.getLogger(A.class.getName());
public static void logFormater() {
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
handler.setFormatter(new SimpleFormatter() {
@Override
public String format(LogRecord record) {
return "Test---" + record.getMessage();
}
});
logger.addHandler(handler);
}
public static void main(String[] args) {
logFormater();
launch();
}
public static void launch() {
try {
B bClass= new B();
//using reflection get logger field of B class
Field aField= bClass.getClass().getDeclaredField("logger");
aField.setAccessible(true);
//inject new behavior here
aField.set(bClass, logger);

bClass.getData();
logger.info("A log");
} catch (Exception ex) {
//error msg
}
}
}
class B {
final java.util.logging.Logger logger = Logger.getLogger(B.class.getName());
void getData() {
logger.info("B log");
}
}

控制台输出:

Test---B logFeb 21, 2021 9:40:54 PM com.kawser.stackoverflow.problem.solution.B getData
INFO: B log
Test---A logFeb 21, 2021 9:40:54 PM com.kawser.stackoverflow.problem.solution.A launch
INFO: A log

从根记录器中删除所有处理程序,并将您的控制台处理程序附加到根记录器。默认情况下,所有日志消息都向上传递到根日志记录器处理程序。

Class A {
private static final java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(A.class.getName());
public static void main(String[] args) {
LogManager.getManager().reset();
logger.setLevel(level);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
handler.setFormatter(new SimpleFormatter() {
@Override public String format(LogRecord record) {
return "Test---" + formatMessage(record);
}
});
root.addHandler(handler);
launch();
}
public static void launch() {
B s = new B();
s.getData();
logger.info("A log");
}
}
Class B {
final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(B.class.getName());
getData() {
logger.info("B log");
}
}

最新更新