我有一个使用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
答案 0 :(得分:1)
%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
是方法。