log4j - 在 Log4J 中,避免打印完整的软件包名

  显示原文与译文双语对照的内容
0 0

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

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

假设

在API类上有两个类 Main.java 和 AlarmCategoryImpl.java AlarmCategroryImpl.java,在我的项目类中定义了 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 0

%c 表示"类别名称",它是"记录器名称"的同义词。 这意味着 %c 将被扩展为logger的名称。

记录器名称无效,不一定是完全限定类名。 记录器名称是传递给 Logger.getLogger()的字符串。 因此,如果你有一个名为 x.y.z.MyClass的类,并且它具有以下属性:

private static final Logger logger = Logger.getLogger("hello");

然后,使用 hello 而不是 %c 生成日志语句。

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

我猜,项目的非api类( 换句话说你自己的类) 不会传递给 Logger.getLogger(),或者它们使用 root 记录器。 要确定,请在这里粘贴检索 Logger 实例的代码行。

按注释编辑:

那么,你的Main 类是否在默认包内? ( 即,它不与任何软件包关联)? 如果是的话我就不会发现任何问题。

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

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

原作者:
...