【问题标题】:Is it ok to log the source class name and method name in a java product?在 java 产品中记录源类名和方法名可以吗?
【发布时间】:2011-11-09 04:34:42
【问题描述】:

我目前正在为一些网络监控工具开发一个 java 应用程序。在我的代码中,我应该经常使用日志记录。由于它是一个网络管理软件,日志中的信息对用户非常有用,因此必须使用它们。但是现在我对我应该更喜欢哪种记录器方法有点困惑。现在我正在使用Logger.lop(...//...),因为在它的帮助下,我们还记录了类名和方法,因此我(开发人员)调试代码和查找错误变得非常容易。但最后我很困惑我是否应该使用相同的日志记录机制将它交付给最终用户???让您的用户知道当前正在执行哪种类,发生了哪种方法错误是否有任何危害。我在许多产品中多次看到异常处理堆栈跟踪被使用,所以通常我们也会得到类名。那么让最终用户知道你的类名和方法是什么没有问题吗??

【问题讨论】:

  • @all 它可能会看到一个理论问题,但仍然不是不合逻辑的

标签: java logging error-logging end-user


【解决方案1】:

在考虑它的安全影响之前,请先考虑性能。在大多数日志记录系统中,通过日志记录工具动态获取实际的类名和方法名需要反射并显着减慢日志记录——通常是同步操作。我的猜测是,在网络监控应用程序中,你真的不希望这样。

如果您将方法名称硬编码到日志消息中(通过使其成为消息的一部分或按类别),那就另当别论了。作为一名安全人员,我认为这没什么大不了的——如果你的代码是用 Java 编写的,无论如何它都可以反转,所以你的代码应该以这样一种方式运行,即使代码是安全的被送出去了。

话虽如此,您可以为开发和生产使用不同的日志记录配置,或者这些细粒度消息可以进入调试、跟踪等。如果您使用的是 log4j,通常建议使用 @987654321 @ 包装任何日志语句,其中包括动态计算的任何内容,因为这些语句在日志语句确定是否启用之前计算。

【讨论】:

  • 看来 Log4j 确实使用反射......但是 Logback (默认的 SLF4J 实现)?我相信在 JDK 1.5+ 中,您可以调用 Thread.getStackTrace() 来获取堆栈跟踪元素,并从顶部元素中获取您的方法名称——无需反射。似乎一个不错的日志系统会使用该工具。
【解决方案2】:

log4j/logback/slf4j 允许你为不同的 appender 设置不同的格式。对于开发,您可以启用控制台附加程序,在其中包含格式中的类名,而对于最终用户,您可以省略它(对于文件附加程序)

【讨论】:

  • 我只能在我想在日志文件中记录消息的地方使用我正在使用记录器的任何其他包。所以主要问题是在日志文件中显示类名是否可以?
  • 询问您的用户。对我来说没问题。
【解决方案3】:

值得一提的是,这种日志记录在 Java 中的性能代价很高,这与通常使用预处理器实现的 C++ 不同。幸运的是,使用 log4j/logback 你可以打开和关闭它——听从 Bozho 的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2023-04-10
    • 2023-03-20
    相关资源
    最近更新 更多