1.1 日志介绍
日志是已发生事件的列表。几乎就像一本航海杂志或日记。那么,相应地,记录器是一个可以用来记录的对象。在编程中,习惯上记录几乎所有内容。在 Java 中,一切都是这样,甚至更多。

事实上,Java 程序通常是没有 UI、控制台等的大型服务器应用程序。他们同时处理来自数千个用户的请求,经常会出现各种错误。特别是当不同的线程开始相互干扰时。
而且,事实上,在这种情况下找到很少重现的错误和故障的唯一方法是将每个线程中发生的所有事情写入日志/文件。
大多数情况下,有关调用方法的参数、所有截获的错误以及大量中间信息的信息会写入日志。日志越完整,就越容易恢复事件的顺序并跟踪故障或错误的原因。
但是日志越大,使用它就越困难。有时日志每天达到几千兆字节。这可以。
1.2 失败日志
作为第一个日志,开发人员使用简单的输出到控制台。在应用程序调试期间这样做很方便——当所有重要信息和变量值都写入控制台时。但是这样的日志在应用程序正常运行期间是完全不适用的。
首先,应用程序可能希望自己向控制台输出一些内容,而用户根本不想看到为程序员准备的服务信息。
其次,控制台缓冲区的大小是有限的,你不能在那里写太多。
最后,第三,应该将长期收集的有关程序错误的信息发送给程序开发人员。一次将所有这些信息写入一个文件是最方便的。
开发人员很快解决了第一个问题——他们想出了另一个输出流—— System.err
。您可以向它写入消息,它们将被发送到一个单独的线程,而不是标准控制台。
甚至写入文件的问题也解决了:
// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
throw new Exception("Error message");
} catch (Exception e) {
e.printStackTrace();
}
但即使是这种形式,也没有解决全部问题,因此决定创建一个特殊的库,将日志消息写入文件。她以一种聪明的方式做到了这一点,并允许灵活地为记录的事件和数据配置过滤器。
整个日志记录过程,其实包括三个部分:
- 第一部分是信息收集。
- 第二部分是对收集到的信息进行过滤。
- 第三部分是选择信息的记录。
1.3 log4j记录器简介
Java 社区中第一个流行的记录器是log4j
. 将它包含在项目中非常简单,为此您只需要在 pom.xml 中添加几行
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.2.17</version>
</dependency>
您的程序与此类记录器的交互看起来像这样:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
这里发生了三件事:
对象的创建以绿色突出显示 Logger
。它的对象存储在一个静态变量中,以便于进一步使用它。并且还将getLogger()
有关收集信息的类的信息传递给该方法。
以蓝色突出显示的行是我们仅在调试期间记录有价值信息的地方。为此,使用了一种特殊的方法 -debug()
最后,我们将出现的异常保存到日志中的行以红色突出显示。异常是潜在的错误,所以error()
.
GO TO FULL VERSION