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

时间:2012-11-30 15:28:19

标签: log4j

我有一个使用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

1 个答案:

答案 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是方法。