避免在log4j中打印方法的完整包名

避免在log4j中打印方法的完整包名,log4j,Log4j,我有一个使用log4j进行日志记录的API。当我在我的项目中使用API时,虽然与项目相关的日志语句以ontl方法名打印,但来自API的日志语句以完整的包名格式打印。 在log4j.properties文件中,我使用的是“%c”(小写) 如何强制所有项目日志语句只打印方法名 让我们说 我有两个类Main.java和AlarmCategoryImpl.java AlarmCategroryImpl.java位于API类上,Main.java在我的项目类中定义 static Logger

我有一个使用log4j进行日志记录的API。当我在我的项目中使用API时,虽然与项目相关的日志语句以ontl方法名打印,但来自API的日志语句以完整的包名格式打印。 在log4j.properties文件中,我使用的是“%c”(小写)

如何强制所有项目日志语句只打印方法名

让我们说

我有两个类Main.java和AlarmCategoryImpl.java AlarmCategroryImpl.java位于API类上,Main.java在我的项目类中定义

 static Logger                       logger = Logger.getLogger(AlarmCategoryImpl.class);
 static Logger               logger   = Logger.getLogger(Main.class);
以及它的log4j输出

 2012-12-01/18:13:22.220/EET [INFO][Main->main] starting...  
2012-12-01/18:13:22.447/EET [INFO][com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImpl->copyStructureRecursive] Copying AlarmCategoryImpl
%c
表示“类别名称”,与“记录器名称”同义。这意味着
%c
将扩展为记录器的名称

记录器名称不一定是完全限定的类名。记录器名称是传递到
logger.getLogger()
的字符串。因此,如果您有一个名为
x.y.z.MyClass
的类,并且它有以下内容:

private static final Logger Logger=Logger.getLogger(“hello”)

然后将生成日志语句,并扩展
hello
,而不是
%c

这意味着API中的类正在使用
getLogger()
,将类名作为参数传递。这会导致日志打印时,
%c
扩展为完全限定的类名

我猜您的非API类(换句话说,您自己的项目类)没有将任何值传递给
Logger.getLogger()
,或者它们使用根记录器。当然,请将用于检索
Logger
实例的代码行粘贴到此处

根据评论编辑

那么,您的
Main
类是否可能在默认包中?(即,它不与任何包关联)?如果是,那么我看不出有任何问题

[INFO][Main->Main]
INFO
是级别,
Main
是类,
Main
是方法


[INFO][com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImpl->copyStructureRecursive]
INFO
是级别,
com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImpl
是类,
copyStructureRecursive
是方法。

您的
Main
类可能位于默认包中,因此它实际上与任何包都没有关联。这就是为什么打印输出中的包组件是空的;它根本不存在。我更新了我的答案。你是对的,Main类日志只打印其名称的原因是因为Main与任何包都没有关联。因此,按照您的建议,我已使用logger.getLogger(“AlarmcategoryImpl”);更新了定义;。问题解决了。谢谢。或者,您可以保持原样,用
%c{1}
替换
%c
。这将只显示完全限定名称的最右边部分,这意味着-将只显示类的名称。但是请注意,如果您正在进行大量日志记录,这种方法可能会带来一些性能问题。你可以在这里读到:。。。或者将其保留为
%c
,而不是发送
XYZ.class.getName()
,而是发送
ClassUtils.getShortClassName(XYZ.class)
ClassUtils
包含在Commons Lang中,它是非常流行的第三方实用程序集。