【问题标题】:Logger name in each java class每个 java 类中的记录器名称
【发布时间】:2016-10-14 11:06:48
【问题描述】:

我正在用 log4j2 替换我的 java 应用程序中的旧日志系统。 我对记录器名称有点困惑。记录器名称是否与我们在 xml 文件中定义的名称相同,是否应该与 logmanager.getlogger (arg) 的参数相同?

我也不知道是否应该在每个类的顶部定义记录器,它们应该有不同的名称吗? 例如有一个包loginlogin.ui .

Login 里面有 5 个文件(类)和 ui。我想记录整个登录包。但是我在如何定义 loggers 以及 java 文件的位置以及记录器名称应该有哪些模式方面遇到问题。

Logger logger = logmanager.getlogger( ? )

Logger 对象可以在每个文件中具有相同的名称吗? 谢谢你。

【问题讨论】:

  • 也许看看APImanual 已经回答了你的问题。
  • 每个文件中的Logger对象可以同名吗? - 是应该 Logger 对象在每个文件中具有相同的名称吗? - 没有
  • “Logger 对象是否应该在每个文件中具有相同的名称? - 不” - 因为您无法在日志文件中看到输出来自记录器的名称。不过,有时这可能是有道理的。例如,我将它用于通过 API 跟踪 MessageObjects,因此我可以独立于“正常”应用程序日志记录打开/关闭/详细的登录部分。
  • 问题是我使用不同的文件来记录每个包。我现在遇到问题了,我问我是否可以在我的每个类上使用 Logger logger* LogManager.getLogger(MyClass.class) ?

标签: java logging log4j


【解决方案1】:

你可以使用

private static Logger logger = LogManager.getLogger( YourClassName.class )

如果您只设置了一个根记录器,这已经会显示来自那里的消息。 如果您想让来自特定包的记录器的配置与 rootlogger 不同(例如不同的日志级别),那么您必须在 log4j2 的配置中创建一个与该包类似的记录器。您可以参考 log4j2 配置手册了解如何执行此操作。

该包和后续包中的所有类都将映射到该记录器。

例子:

Config 有根记录器和记录器“my.package”

然后使用 LogManager.getLogger( YourClass.class ) 创建的记录器将使用记录器“my.package”,其中 YourClass 位于包 my.package 或某些包 my.package.xyz 中。 使用 LogManager.getLogger( "SPECIALLOGGER" )LogManager.getLogger( OtherPackageClass.class ) 创建的记录器,其中 OtherPackageClass 在包“my.otherpackage”中,将回退到根记录器。

我还建议查看log4j manual

【讨论】:

  • 感谢您的回答。因此,如果我有嵌套包,我仍然在每个 java 文件之上使用 LogManager.getLogger(YourClass.class) ?
  • 我曾经将记录器从包中的一个文件导入到其他文件并使用相同的东西。
  • 这是推荐的方法(每个类的静态记录器)。这样您以后仍然可以为子包添加记录器配置,而无需接触源代码。
  • 但是一个包中的所有文件可以使用同一个记录器吗?我的意思是我将它导入到其他文件中。我想知道我的问题是否来自于此。因此,在每个类之上,所有 Logger 可以是 logger 或不同的名称,例如 logger1 logger2, .. ?
  • 不,只是将它们命名为记录器。没关系。这只是一个标签。你可以称他们为“加里”哈哈......
【解决方案2】:

查看项目Lombok 以使用简单的注释而不是声明记录器变量。

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2017-09-05
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多