2

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

1 回答 1

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

于 2012-12-01T04:50:15.007 回答