首页 > 解决方案 > 如何从我的班级获取参考类记录器消息作为字符串

问题描述

我创建了一个名为“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

标签: javalogging

解决方案


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

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

推荐阅读