首页 > Java > java教程 > 正文

您的 Java 日志实用程序类是否将其自身报告为日志来源?了解如何修复它!

Barbara Streisand
发布: 2024-10-13 06:13:30
原创
370 人浏览过

Is your Java log utility class reporting itself as the source of your logs? Learn how to fix it!

在现代软件开发的快节奏环境中,有效的日志记录对于高效的调试和系统监控至关重要。但是,日志输出中不一致或不准确的行号可能会使故障排除变得非常耗时。最近,我发现我们的内部日志记录实用程序将自身报告为日志来源。需要解决这个问题以提高日志精度。

问题

当使用自定义实用程序类来处理日志时,它将开始将自身报告为日志源,因为实用程序类是最终调用实际日志框架的类(在我的例子中,它是SLF4J ,以 Log4J2 作为后端)。

因此,如果实用程序类名为InternalLogger,则日志将类似于:

2024-10-11T18:10:57,345 [finagle/netty4-6] (InternalLogger.java:34) INFO ...  
登录后复制

这里,报告的源文件和行号指向日志记录实用程序本身内的位置,而不是在应用程序代码中实际进行日志调用的位置。此行为降低了日志在快速调试和查明问题方面的有效性。

解决方案

首先,我想到在报告行号之前手动遍历堆栈跟踪并过滤掉一些元素。这种方法的成本非常高,而且我不想减慢我们的日志记录过程。

幸运的是,我在StackOverflow的回答中发现SLF4J提供了一个名为LocationAwareLogger的接口,Log4J2也支持该接口,因此,我们只需传递日志实用程序类的FQCN(完全限定类名)即可过滤实用程序类。

我原来的实用程序类看起来像这样:

public class InternalLogger {

  private static final Logger LOG = LoggerFactory.getLogger(InternalLogger.class);

  public void log(EventLog eventLog) {
    //... get message and logLevel from eventLog
    switch (logLevel) {
      case DEBUG:
        LOG.debug(message);
        break;
      case WARN:
        LOG.warn(message);
登录后复制

对于此解决方案,我声明了 Logger 类 FQCN 并添加了一个私有辅助函数来使用 LocationAwareLogger 进行日志记录:

private static final String LOGGER_UTIL_FQCN = InternalLogger.class.getName();

  private void locationAwareLog(int level, String message) {
    ((LocationAwareLogger) LOG).log(null, LOGGER_UTIL_FQCN, level, message, null, null);
  }
登录后复制

并更改了我的旧代码以在支持的情况下调用它:

switch (logLevel) {
  case DEBUG:
    if (LOG instanceof LocationAwareLogger) {
      locationAwareLog(LocationAwareLogger.DEBUG_INT, message);
    } else {
      LOG.debug(message);
    }
    break;
  case WARN:
    if (LOG instanceof LocationAwareLogger) {
      locationAwareLog(LocationAwareLogger.WARN_INT, message);
    } else {
      LOG.warn(message);
    }
//...
登录后复制

不幸的是,SLF4J 没有提供一种方法来提供级别作为参数(即 LOG.log(level, message))。如果是的话,代码就会稍微简洁一些。

实施此更改后,日志现在可以准确报告呼叫者的线路号码,显着提高可追溯性:

2024-10-11T18:45:26,692 [finagle/netty4-6] (ActualLogic.java:1059) INFO ...
登录后复制

请注意差异:InternalLogger.java:34 与 ActualLogic.java:1059,后者指示应用程序代码中日志源的更精确位置。

结论

通过合并 SLF4J 的 LocationAwareLogger,我将我们的日志系统从混乱的根源转变为精确的诊断工具。此更改可以准确报告呼叫者的线路号码,而不是记录实用程序的线路号码,从而大大增强了我们快速准确地诊断问题的能力。

这一改进不仅简化了调试,还减少了解决软件问题时的响应时间。

面临类似挑战的开发人员应该考虑这种方法来提高日志系统的有效性。借助更清晰、更准确的日志,他们可以将曾经模糊的数据转化为可操作的见解,从而提高运营效率和软件可靠性。优化的日志记录对于应对当今快节奏的开发环境的挑战并确保高质量的软件成果至关重要。

以上是您的 Java 日志实用程序类是否将其自身报告为日志来源?了解如何修复它!的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!