如何在java中使用日志级别

时间:2011-04-28 11:17:29

标签: java logging

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

  • 严重(最高)
  • 警告
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

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

有人能给我一个很好的例子来展示所有日志记录级别及其用法吗?

9 个答案:

答案 0 :(得分:48)

通常,您不需要所有这些级别,严重,警告,信息,精细可能就足够了。我们正在使用Log4J(不是直接java.util.logging)和以下级别(名称可能与其他日志框架不同):

  • 错误:任何或可能是关键的错误/异常。我们的记录器会自动在我们的服务器上发送每封此类消息的电子邮件(用法:logger.error("message");

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

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

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

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

答案 1 :(得分:19)

此摘录来自以下awesome post

  

错误 - 发生了一些非常错误的事情,必定是这样   立即调查。没有系统可以容忍记录在此上的项目   水平。示例:NPE,数据库不可用,关键任务用例   不能继续。

     

警告 - 此过程可能会继续,但要格外小心。   实际上我一直想在这里有两个级别:一个显而易见   存在解决方法的问题(例如:“当前数据   不可用,使用缓存值“)和第二个(命名为:ATTENTION)for   潜在的问题和建议。示例:“正在运行的应用程序   开发模式“或”管理控制台没有安全保护   密码”。应用程序可以容忍警告消息,但它们   应始终合理和审查。

     

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

     

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

     

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

PS:将跟踪读为 VERBOSE

答案 2 :(得分: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。如果将消息记录为FINE,则可以配置日志记录系统,以查看包含或不包含日志消息的流控制日志记录的日志输出。因此,仅当不需要流控制日志记录作为上下文来理解此日志跟踪消息时,才使用FINE

  

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

一般情况下,大多数FINER的使用应留给enteringexitingthrowing。在打开详细日志记录时,大部分都会为呼叫站点跟踪保留FINER

  

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

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

  

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

CONFIG适用于协助系统管理员处理上面列出的项目。

  

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

示例是跟踪程序启动和关闭。

  

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

示例用例可能是AutoCloseable.close实现引发的异常。

  

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

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

答案 3 :(得分:4)

以下是对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/

此致

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

日志记录具有不同的级别,例如:
跟踪 –细粒度的调试消息,通常捕获通过应用程序的流。 Debug (调试)-在此下应记录一个常规的调试事件。
ALL –可以记录所有事件。
INFO (信息)-仅供参考,以普通英语书写。
警告-可能导致错误的事件。
错误-应用程序中的错误,可能可以修复。

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

答案 8 :(得分:-4)

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

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