【问题标题】:How to use log levels in java如何在java中使用日志级别
【发布时间】:2011-08-14 15:14:32
【问题描述】:

我正在开发一个需要使用记录器功能的应用程序。我已经阅读了不同级别的记录器,它们是:

  • 严重(最高)
  • 警告
  • 信息
  • 配置
  • 很好
  • 更精细
  • 最好的

我无法理解每个日志记录级别的用法。

谁能给我一个很好的例子来展示所有的日志记录级别和它们的用法?

【问题讨论】:

标签: java logging


【解决方案1】:

这些是级别。您需要考虑所记录消息的严重性,并使用适当的级别。

它基本上是一个水印;级别越高,您希望在日志条目中保留信息的可能性就越大。 FINEST 将用于不太重要的消息,因此您可以将其用于您通常不关心但在极少数情况下可能希望看到的内容。

【讨论】:

  • 你有他们。 Logger.severe("foo");等
【解决方案2】:

关卡的使用真的取决于你。您需要确定您的应用程序中什么是严重的,什么是警告,什么是信息。您需要拆分日志记录,以便您的用户可以轻松设置一个日志记录级别,该级别不会因过多的 IO 导致系统崩溃,但会报告严重错误,以便您修复它们。

【讨论】:

    【解决方案3】:

    不同的日志级别对工具很有帮助,它们可以分析您的日志文件。通常,日志文件包含大量信息。为避免信息过载(或此处为 stackoverflow^^),您可以使用日志级别对信息进行分组。

    【讨论】:

    • 实际上消息并没有按日志级别“分组”(“分组”意味着一些排序)。
    【解决方案4】:

    本技巧展示了如何在任何 Java 应用程序中使用 Logger。 Logger 需要配置 Formatter 和 Handler。存在许多类型的处理程序和格式化程序。在此示例中,FileHandler 用于将所有日志消息存储在日志文件中。并且 Simple formatter 用于将日志消息格式化为人类可读的形式。

    package MyProject;
    
    import java.io.IOException;
    import java.util.logging.FileHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.logging.SimpleFormatter;
    
    public class MyLogger {
    
      public static void main(String[] args) {
    
        Logger logger = Logger.getLogger("MyLog");
        FileHandler fh;
    
        try {
    
          // This block configure the logger with handler and formatter
          fh = new FileHandler("c:\\MyLogFile.log", true);
          logger.addHandler(fh);
          logger.setLevel(Level.ALL);
          SimpleFormatter formatter = new SimpleFormatter();
          fh.setFormatter(formatter);
    
          // the following statement is used to log any messages   
          logger.log(Level.WARNING,"My first log");
    
        } catch (SecurityException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
    
      }
    
    }
    

    您可以在此处找到更多示例 https://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html

    【讨论】:

    • 这甚至没有回答问题,链接已损坏。
    • 永远不要在 prod 中 printStackTrace。成功点的警告没有意义(改用信息)。添加登录异常捕获并将异常作为参数。
    【解决方案5】:

    通常,您不需要所有这些级别,SEVERE、WARNING、INFO、FINE 可能就足够了。我们正在使用 Log4J(不是直接 java.util.logging)和以下级别(可能在名称上与其他日志记录框架不同):

    • 错误:任何严重或可能严重的错误/异常。我们的 Logger 会为我们服务器上的每条此类消息自动发送一封电子邮件(用法:logger.error("message");

    • 警告:任何可能警告我们潜在问题的消息,例如当用户尝试使用错误的凭据登录时 - 如果这种情况经常发生或在短时间内发生,这可能表明存在攻击(用法:logger.warn("message");

    • INFO:查看日志文件时我们想知道的任何内容,例如计划作业何时开始/结束(用法:logger.info("message");

    • DEBUG:顾名思义,调试我们很少打开的消息。 (用法:logger.debug("message");

    这样做的好处在于,如果您将日志级别设置为 WARN,则信息和调试消息几乎不会影响性能。如果您需要从生产系统中获取更多信息,您可以在短时间内将级别降低到 INFO 或 DEBUG(因为您会获得更多日志条目,这会使您的日志文件更大且更难阅读)。调整日志级别等通常可以在运行时完成(我们的 JBoss 实例每分钟左右检查一次配置中的更改)。

    【讨论】:

    • 问题是关于 java 的内置日志记录 - 而不是 log4j。顺便说一句,为什么 Sun 没有采用 log4j 约定?
    • @kilaka 实际上,OP 并没有具体说明他是指 java.util.logging 还是更普遍的 logging in Java。除此之外,我根据我们的经验发言,因为在大多数情况下不同的级别会有相似的含义,我只是告诉他我们在生产中使用什么以及在现实世界中什么对我们来说足够了。因此,与其在 7 个日志级别之间做出决定,不如将复杂性降低到 4 个日志级别将有助于 OP,恕我直言。
    • 问题与 log4j 无关。
    • @JohnDonn 是的,它一般是关于日志级别的,我使用 log4j 只是为了提供一些经验。由于 log4j 对日志级别使用略有不同的名称,我想提供该信息以便读者可以适应。但是,一般信息保持不变,并且独立于所使用的实际日志记录框架。
    • 不要使用 java 日志。它有一些生产服务器的问题,有时它只是不写下来。如有疑问,请使用 sl4j slf4j.org。它是一个支持几乎所有日志框架的外观。如果您决定中期更改日志引擎,您的代码将不会更改。您甚至可以同时使用多个日志记录引擎。也适用于 java 默认日志记录
    【解决方案6】:

    这里有一个很好的 Java 日志介绍: http://www.javapractices.com/topic/TopicAction.do?Id=143

    Java 带有一个日志记录 API,因为它是 1.4.2 版本: http://download.oracle.com/javase/1.4.2/docs/guide/util/logging/overview.html

    您还可以使用其他日志框架,例如最流行的 Apache Log4j: http://logging.apache.org/log4j

    我建议您使用日志抽象框架,它允许您更改日志框架而无需重构代码。因此,您可以从使用 Jul(Java Util Logging)开始,然后切换到 Log4j,而无需更改代码。最流行的日志门面是 slf4j:http://www.slf4j.org/

    问候,

    【讨论】:

      【解决方案7】:

      这段摘自以下awesome post

      ERROR – 发生了严重错误,一定是 立即调查。没有系统可以容忍在此登录的项目 等级。示例:NPE、数据库不可用、关键任务用例 无法继续。

      警告 – 该过程可能会继续,但要格外小心。 其实我一直想在这里有两个层次:一个是明显的 存在变通办法的问题(例如:“当前数据 不可用,使用缓存值”)和第二个(命名:注意) 潜在的问题和建议。示例:“应用程序在 开发模式”或“管理控制台不受 密码”。应用程序可以容忍警告消息,但它们 应该总是被证明和审查。

      INFO – 重要的业务流程已完成。在理想世界中, 管理员或高级用户应该能够理解 INFO 消息并快速找出应用程序在做什么。为了 例如,如果一个应用程序都是关于预订机票的,那么 每张机票应该只有一个 INFO 声明,上面写着“[谁] 已预订 从 [Where] 到 [Where] 的车票”。 INFO 消息的其他定义: 显着改变应用程序状态的每个动作 (数据库更新,外部系统请求)。

      DEBUG – 开发人员的东西。我稍后会讨论什么样的 值得记录的信息。

      TRACE – 非常详细的信息,仅用于开发。你 部署后可能会在短时间内保留跟踪消息 在生产环境中,但将这些日志语句视为 暂时的,应该或可能最终关闭。这 区分 DEBUG 和 TRACE 是最困难的,但如果你 放置日志语句并在功能完成后将其删除 开发和测试,它可能应该在 TRACE 级别。

      PS:将TRACE读作VERBOSE

      【讨论】:

        【解决方案8】:

        java.util.logging.Level 文档很好地定义了何时使用日志级别以及该日志级别的目标受众。

        java.util.logging 的大部分混淆在于跟踪方法。它应该在类级别的文档中,但 Level.FINE 字段提供了一个很好的概述:

        FINE 是提供跟踪信息的消息级别。 所有 FINE、FINER 和 FINEST 都用于相对详细的跟踪。这三个级别的确切含义在子系统之间会有所不同,但一般来说,FINEST 应该用于最大量的详细输出,FINER 用于稍微不太详细的输出,FINE 用于最小量(也是最重要的)消息。 一般来说,FINE 级别应该用于那些对特定子系统没有特别兴趣的开发人员广泛感兴趣的信息。 FINE 消息可能包括诸如轻微(可恢复)故障之类的内容。表明潜在性能问题的问题也值得记录为 FINE。

        关卡文档中没有提到的要理解的重要一点是call-site tracing information is logged at FINER

        • Logger#entering 带有消息“ENTRY”的 LogRecord,日志级别 FINER,...
        • Logger#throwing 使用 FINER 级别完成日志记录...LogRecord 的消息设置为“THROW”
        • Logger#exiting 带有消息“RETURN”的 LogRecord,日志级别 FINER...

        如果您将消息记录为FINE,您将能够配置日志系统以查看日志输出,无论是否跟踪日志消息周围的日志记录。因此,只有在不需要跟踪日志记录作为上下文来理解日志消息时才使用FINE

        FINER 表示相当详细的跟踪消息。默认情况下,对进入、返回或抛出异常的日志调用在此级别进行跟踪。

        一般来说,FINER 的大部分使用应该留给enteringexitingthrowing 的调用。这将在很大程度上保留FINER 用于在打开详细日志记录时进行呼叫站点跟踪。 当吞下预期的异常时,在某些情况下使用FINER 作为调用跟踪throwing 方法的替代方法是有意义的,因为实际上并没有抛出异常。当它不是抛出或将在更高级别记录的实际错误时,这使它看起来像一个跟踪。

        FINEST 表示非常详细的跟踪消息。

        当您要编写的跟踪日志消息需要有关程序控制流的上下文信息时,请使用FINEST。您还应该使用 FINEST 来跟踪产生大量输出数据的消息。

        CONFIG 消息旨在提供各种静态配置信息,以帮助调试可能与特定配置相关的问题。例如,CONFIG 消息可能包括 CPU 类型、图形深度、GUI 外观等。

        CONFIG 非常适合协助系统管理员处理上面列出的项目。

        通常 INFO 消息将被写入控制台或其等效项。因此,INFO 级别应仅用于对最终用户和系统管理员有意义的相当重要的消息。

        这方面的示例是跟踪程序启动和关闭。

        一般而言,WARNING 消息应描述最终用户或系统管理员可能感兴趣的事件,或表明潜在问题的事件。

        一个示例用例可能是从AutoCloseable.close 实现抛出的异常。

        一般SEVERE 消息应该描述相当重要的事件并且会阻止正常程序执行。最终用户和系统管理员应该可以合理理解它们。

        例如,如果您的程序中有事务,如果其中任何一个步骤失败,那么所有步骤都无效,那么 SEVERE 将适合用作日志级别。

        【讨论】:

        • 感谢您实际回答原始问题。
        【解决方案9】:

        日志记录具有不同的级别,例如:
        Trace – 细粒度的调试消息,通常捕获通过应用程序的流。 调试- 应在此记录一般调试事件。
        ALL - 可以记录所有事件。
        INFO- 一个信息目的,用简单的英文书写的信息。
        警告- 可能导致错误的事件。
        错误- 应用程序中的错误,可能可恢复。

        以调试级别捕获的日志是对开发人员和其他人员有帮助的信息,因此它的捕获范围很广。如果您的代码没有异常或错误,那么您应该可以使用 DEBUG 级别的日志记录,否则您应该谨慎选择选项。

        【讨论】:

          猜你喜欢
          • 2014-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-29
          • 1970-01-01
          • 2011-01-02
          相关资源
          最近更新 更多