Java 如何从打印日志语句的位置在日志中记录jar文件

Java 如何从打印日志语句的位置在日志中记录jar文件,java,logging,log4j,Java,Logging,Log4j,如何在日志文件中记录jar文件的位置。 假设我正在打印一些来自myLog.jar中LogTest.java的消息,是否有任何方法可以在日志文件中打印,如下所示 INFO 2013-10-30 15:58:07227[log](LogTest.java:235:myLog.jar)-一些日志消息 遗留项目中的各种jar包含具有相同类名的类似类型的日志消息, 调查任何问题都需要时间。 有没有办法处理这个问题,请给出您的建议。没有选项将源文件包含在standarorg.apache.log4j.Pat

如何在日志文件中记录jar文件的位置。 假设我正在打印一些来自myLog.jar中LogTest.java的消息,是否有任何方法可以在日志文件中打印,如下所示

INFO 2013-10-30 15:58:07227[log](LogTest.java:235:myLog.jar)-一些日志消息

遗留项目中的各种jar包含具有相同类名的类似类型的日志消息, 调查任何问题都需要时间。
有没有办法处理这个问题,请给出您的建议。

没有选项将源文件包含在standar
org.apache.log4j.PatternLayout
中。但是,您可以创建自己的布局以将其包含在源中。以下内容可能有用

public class MyLayout extends org.apache.log4j.Layout {
    public void activateOptions() {
        // None action
    }
    public String format(LoggingEvent event) {
        StringBuilder sb = new StringBuilder();
        sb.append(event.getLevel());
        sb.append(" (");
        sb.append(event.getLoggerName());
        sb.append(":");
        sb.append(event.getLocationInformation().getLineNumber());
        sb.append(":");
        sb.append(getSource(event.getLoggerName()));
        sb.append(") - ");
        sb.append(event.getMessage());
        sb.append(LINE_SEP);
        return sb.toString();
    }
    public boolean ignoresThrowable() {
        return true;
    }
    public static String getSource(String className) {
        try {
            ClassLoader loader = MyLayout.class.getClassLoader();
            String name = className.replace('.', '/').concat(".class");
            URL url = loader.getResource(name);
            return url.getPath();   
        } catch (Exception e) {
            return null;
        }
    }
}

将包名添加到日志会澄清这一点吗?或者多个jar是否包含相同的包?包名和类名(%C.%F)我已经尝试过,但我想从打印日志的位置打印jar文件。我可以使用格式记录语句,但它从MyLayout.java打印日志位置,而不是从我记录语句的位置。假设我在Test.java的第6行打印日志,但我仍然将日志作为信息打印(smsg.common.util.Logger.MyLayout:227:/C:/Users/Myusr/workspace1/my eclipse prj/target/classes/smsg/common/util/Logger/MyLayout.class)-Hello更应该打印Test.java和行号。