Java.util.logging.Logger日志保存在哪里?

43

我对Java的Logger有些困惑

private static Logger logger = Logger.getLogger("order.web.OrderManager");
logger.info("Removed order " + id + ".");
我该在哪里查看日志?还有来自java.util.logging.Logger库的以下引用:
每次记录日志调用时,Logger最初会对请求级别(例如SEVERE或FINE)与记录器的有效日志级别进行便宜的检查。如果请求级别低于日志级别,则日志记录调用会立即返回。 在通过此初始(廉价)测试后,Logger将分配一个LogRecord来描述日志消息。然后,它将调用Filter(如果存在)对是否应发布记录进行更详细的检查。如果这一步通过,它将把LogRecord发布到其输出处理程序。
这是否意味着如果我有3个“请求级别”日志:
logger.log(Level.FINE, "Something");
logger.log(Level.WARNING, "Something");
logger.log(Level.SEVERE, "Something");

我的日志级别是SEVERE,我能看到所有三个日志;如果我的日志级别是WARNING,那么我就看不到SEVERE日志,这正确吗?如何设置日志级别


2
内置的日志记录器并不是很好。请使用log4j (http://logging.apache.org/log4j/1.2/) 替换它。在log4j网站上有一些很好的文档,解释如何使用它... - bwawok
@bwawok:写代码时,反对使用Apache Commons Logging也不是个坏主意。如果log4j可用,它会使用log4j,否则会回退到内置的日志记录功能。 - Powerlord
2
我不会使用commons logging。它存在许多问题,并且在使用tomcat时效果很差。如果是为自己编写代码,建议使用log4j。如果是为库编写代码,则建议使用slf4j(http://www.slf4j.org)。 - bwawok
不要只是说“内置日志记录很糟糕”,最好解释一下为什么,而不是盲目地重复流行的观点。 - User
3个回答

28

我应该在哪里看到日志?

根据您实际的日志处理程序配置,可以在日志文件或标准输出中查看。这可以通过属性文件或直接通过日志记录API设置。

这是否意味着如果我有3个请求级别的日志...

SEVERE 是最重要(优先级最高)的消息类型,FINE 是您示例中显示的3种消息类型中最不重要的一种。因此,如果您的日志级别为 SEVERE,则只记录 SEVERE 消息。如果级别为 FINE,则记录所有3个消息。

这在实际生产环境中非常有用,您可能只想记录错误和可能的警告(希望它们相当罕见,但您需要知道它们),因此可以将日志级别设置为 WARNING。但是,在开发环境中,例如调试问题时,您希望在日志中看到所有信息,即使它会创建大量日志数据并减慢应用程序速度。因此,您将日志级别设置为 FINEFINEST

这是一个关于 Java日志记录的简介

更新:以下是上述页面中一个简单的示例,用于将记录器配置为在级别 FINEST 记录到文件中:

Handler fh = new FileHandler("%t/wombat.log");
Logger.getLogger("").addHandler(fh);
Logger.getLogger("com.wombat").setLevel(Level.FINEST);

要将日志输出到控制台,请将上面的FileHandler替换为ConsoleHandler

Handler ch = new ConsoleHandler();
Logger.getLogger("").addHandler(ch);

这只是一个例子 - 在实际应用中,最好通过配置属性文件来配置日志记录。


哦,原来是这样。非常感谢。Peter,你能向我展示如何配置日志以打印到文件或控制台吗? - Thang Pham
你提到在真正的应用程序中,最好通过属性文件配置日志记录。您能否友好地向我展示如何做到这一点? - Thang Pham
@Harry,我不确定格式是否标准,但至少对于Log4J,你可以在这里找到好的例子和解释:http://logging.apache.org/log4j/1.2/manual.html,在“配置”部分。 - Péter Török
谢谢您提供这个信息。但是“Java日志介绍”的链接无法打开。如果您能更新一下就太好了。 - Ravindra S
你在某些地方使用了 getLogger(""),而在其他地方使用了 getLogger("com.wombat")。当我尝试让一个使用 Logger.getLogger("com.wombat.MyClass") 构造的第三方库记录到控制台时,我应该使用什么? - Noumenon
查看日志的答案是:“在日志文件中”。太好了。 - Ian Boyd

5

Java TM Logging Overview非常有趣,可以回答你在Java Logger方面的所有问题:

logging overview

你会看到与你的Logger相关的Handler将在ConsoleStream中生成相应的日志。默认配置为根记录器建立一个单一处理程序,用于将输出发送到控制台。 日志级别: 每个日志消息都有一个关联的日志级别。该级别提供了日志消息重要性和紧急程度的大致指南。日志级别对象封装了一个整数值,较高的值表示较高的优先级。 Level类定义了七个标准日志级别,从FINEST(最低优先级,具有最低值)到SEVERE(最高优先级,具有最高值)。

1

它的位置取决于您的配置。有关此信息,请参阅API文档。日志级别与您所说的完全相反。如果您的配置为FINE,则会显示所有FINE、WARNING、SEVERE,但如果您将其设置为SEVERE,则只会显示那些。

通常情况下,在调试时应使用FINE,并在生产环境中切换到SEVERE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接