Logback - 获取方法名称

时间:2014-06-20 13:38:07

标签: java logging log4j logback

我们目前正在从log4j迁移到Logback,但是我们在获取"原始"触发日志的方法名称。

我称之为"原创"因为我们有一个集中的记录器类(用于隐藏和操作某些日志),并且日志中显示的是该集中式类的方法名称。

在log4j中我们能够获得"原作"方法名称正确。

Logback能否获得它?

记录器参数

的log4j

<param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss,SSS} %5p [%F] - %M() - %m%n"/>

的logback

<pattern>%d{"dd-MM-yyyy HH:mm:ss,SSS"} %-5level [%logger - %M] - %msg%n</pattern>

结果:(方法名称 - 类名称)

的log4j

doLogTester1 - a.Tester1            
doLogTester2 - b.Tester2            
doLogTester1 - a.Tester1            
doLogTester2 - b.Tester2            

的logback

processLog - a.Tester1              
processLog - b.Tester2              
processLog - a.Tester1              
processLog - b.Tester2              

修改   - 完整示例

Main.java

public class Main
{
private static final LoggerCommon logger = new LoggerCommon(Main.class);

    public static void main(String[] args)
    {
        logger.doLog("I'm on the Main class in the main method");
    }
}

LoggerCommon

的log4j

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LoggerCommon
{
    private static Logger logger;

    public LoggerCommon(Class<?> c)
    {
        logger = Logger.getLogger(c);
    }

    public void doLog(String message)
    {
        logger.log(LoggerCommon.class.getName(), Level.INFO, message, null);
    }
}

的logback

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerCommon
{
    private Logger logger;

    public LoggerCommon(Class<?> c)
    {
        logger = LoggerFactory.getLogger(c);
    }

    public void doLog(String message)
    {
        logger.info(message);
    }
}

配置&#39; S

的log4j

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="CA" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%M - %F - %m%n"/>
        </layout>
    </appender>
    <root>
        <level value="debug"/>
        <appender-ref ref="CA"/>
    </root>
</log4j:configuration>

的logback

<configuration>
    <appender name="CA" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%M - %logger - %msg %n</pattern>
        </encoder>
    </appender>
    <root level="TRACE">
        <appender-ref ref="CA"/>
    </root>
</configuration>

2 个答案:

答案 0 :(得分:2)

您需要确保来电数据&#39;在日志事件上是正确的。

可能其中一个选项可行:

在记录器包装器中调用ILoggingEvent :: getCallerData(),以确保尽早收集调用者数据。

也许您可以在集中式记录器中修饰事件以欺骗调用者数据ILoggingEvent :: getCallerData()调用?

或者派生调用者数据,然后将ILoggingEvent转换为LoggingEvent,并随身携带setCallerData()。

答案 1 :(得分:0)

使用它来解决它:

methodName = stackTrace[xxxx].getMethodName();

不完美,因为xxxx因服务器而异,但是我们找到的最好