java - 如何从我的班级获取参考类记录器消息作为字符串
问题描述
我创建了一个名为“A”的类,它有它的引用类“B”。我想使用控制台附加程序将所有记录器消息作为字符串获取,包括引用类“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
推荐阅读
- javascript - 如何更改 html 快捷方式“!”的默认值 在 vsc 中?(这样我就可以添加更多的html代码)
- mysql - 如何运行 Django 和 Spark 应用程序
- node.js - 如何在nodejs的另一个js文件中包含一个js文件
- asp.net - ASP.net 数据绑定字段更新值
- java - 带有变音符号的 JAVA MessageFormat.Format (ä / ö / ü)
- haskell - 如何进行 Beam 查询?
- php - 跨api调用laravel的环境文件问题
- ansible - 在所有元素中创建具有相同值的字典
- cordova - 带有 Cast Chrome Sender Framework API 的 Cordova 插件
- jwt - 如何从 Azure Active Directory 获取公共证书