2012-11-21 39 views
1

我不确定这是否可能,但我希望能够使用log4j注销数据。但是,而不是log.info()语句的实际位置,我宁愿将调用函数的方法名称,行等由log4j显示在普通字段中,而不是日志数据。如何覆盖Log4J行号

是否有可能覆盖日志事件的数据字段?

public class Foo 
{ 
    public static void info(String msg) 
    { 
     Logger aLogger = Logger.getRootLogger(); 

     // -- Set the calling function location info here 

     aLogger.info(msg); 
    } 
} 


public class Bar 
{ 
    public void test() 
    { 
     Foo.info("x"); // -- Want this line, file, class, method logged 
    } 
} 
+0

你有没有考虑过使用[diagnostic context](http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html)?不完全是你要求的,但可以解决你的目的。 – durron597

+0

我没有,但我会研究它。 – zappullae

+0

如果你想'info()'方法来做到这一点。你可以覆盖它。因为这通常不是'info()'的作用 –

回答

0

我不完全相信我遵循你正在做的事情,但它听起来像AspectJ可以帮助你的问题。

如果您要创建一个将调用包装到记录器方法的方面,您将能够提取调用者的方法/类并覆盖发送到实际记录器的任何参数(使用ProceedingJoinPoint)。

我不完全确定Log4j在哪里可以指定自己的行号,类信息等,但我认为某些地方必须存在。否则,您必须编写自己的记录器实现,以便指定该信息。