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