java - 某些日志不会在 Javaagent 中打印

标签 java logging log4j javassist javaagents

您好,我正在尝试向我的 javaagent 添加调试点。我有两个单独的类用于 premain 方法和转换方法。为代理类添加的日志按预期打印。但在 ClassFileTransformer 类中,它会打印一些日志行并忽略其他一些日志行。 (例如:在同一个类的方法内登录 catch block )

InstClassTransformer.java

public class InstClassTransformer implements ClassFileTransformer {
    private static final Log log = LogFactory.getLog(InstClassTransformer.class);

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        if(log.isDebugEnabled()){
            log.debug("Loading class : "+className.replace('/','.')); //log 1
        }
        ByteArrayInputStream currentClass = null;
        CtClass ctClass = null;
        byte[] transformedBytes = classfileBuffer;
        try {
            ClassPool classPool = ClassPool.getDefault();
            currentClass = new ByteArrayInputStream(classfileBuffer);
            ctClass = classPool.makeClass(currentClass);
        instrumentClass(ctClass, baseClass.getName());
            }
            transformedBytes = ctClass.toBytecode();
        } catch (NotFoundException e) {
            if(log.isDebugEnabled()){
                log.debug("Unable to find "+ className.replace('/','.') + "for instrumentation : "+ e.getMessage()); //log2
            }
        } catch (CannotCompileException | IOException e) {
            if(log.isDebugEnabled()){
                log.debug("Intrumentation of " + className.replace('/', '.') + "failed : " + e.getMessage()); //log3
            }
        } finally {
            if (currentClass != null) {
                try {
                    currentClass.close();
                } catch (IOException e) {
                    if(log.isDebugEnabled()){
                        log.debug("Failed to close the connection : " + e.getMessage());
                    }
                }
            }
            if(ctClass != null){
                ctClass.detach();
            }
        }
        return transformedBytes;
    }

    public void instrumentClass(CtClass ctClass, String name) throws NotFoundException, CannotCompileException {
        if(log.isDebugEnabled()){
            log.debug("Instrumenting " + ctClass.getName()); //log4
        }
    CtMethod[] method = ctClass.getDeclaredMethods();
        ...
    }

当我启动代理时,它会为它加载的每个类打印 log1,并为它无法找到的某些类打印 log 2。但它不打印 log3。我可以保证到达 catch block ,因为有两种情况会击中它。当我添加 e.printStackTrace 时,它​​会打印跟踪,但同时它不会打印日志。它也不打印 log4 。但是,如果我为该 instrumentClass() 方法添加打印语句,它将打印在控制台上,而不是日志上。

另一件事是,尽管它从 ClassFileTransformer 打印日志,但它表示无法找到同一类的附加程序。

log4j:WARN No appenders could be found for logger (org.wso2.das.javaagent.instrumentation.InstrumentationClassTransformer).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我使用 log4j 进行日志记录。我的 log4j.properties 文件,

log4j.rootLogger=DEBUG, file
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.append=true
log4j.appender.file.file=/path/to/testLog/log4j-application-1.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss},%r] %-5p {%c} - %m%n

log4j.logger.org.javaagent.instrumentation=DEBUG

这是 javaagent 的某种行为还是我遗漏了一些东西。

最佳答案

找不到记录器的附加程序这里不是问题。

这里可能抛出了 javassist 的异常。使用 try catch block 包装该方法并捕获 Throwable 而不是 Exception。我想这会帮助您解决问题。

关于java - 某些日志不会在 Javaagent 中打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34352379/

相关文章:

java - 代码不打印整个堆栈跟踪

java - Java 静态方法没有 RMI

java - 导入 GreenDroid 时出现问题

java - 动态更改特定程序包中每个类的日志级别

java - 使用 log4j 创建带有日期的日志文件

java - Log4J 不记录任何内容

java - 为什么下面的java代码中Arrayindex超出范围?我已经检查了边界,但不明白为什么/

Java函数变量冲突

logging - 记录上游请求 Nginx 反向代理

java - 使用 log4j 归档以前的日志文件