日志对我们应用的重要性不言而喻,如 Brian W. Kernighan 和 Rob Pike 在其“编程实践”中所说的那样
作为个人选择,我们倾向于不使用调试器,不必获取堆栈跟踪或一个或两个变量的值。原因之一是,很容易在复杂的数据结构和控制流的细节上迷失方向。我们发现,单步执行程序的效率不如认真思考,并在关键位置添加输出语句和自检代码。单击结束语句所花费的时间,比扫描放置在显示器的输出所花费的时间更长。即使单步进入代码的关键部分,也可以花更少的时间来决定将打印语句放置在哪里,即使假设我们知道在哪里也可以。更重要的是,调试语句保留在程序中。调试会话是暂时的。
日志记录确实有其缺点。它可能会使应用程序变慢。如果太冗长,则可能导致屏幕闪动。为了减轻这些担忧,log4j被设计为可靠,快速和可扩展的。
关于Log4j2
Log4j 1.x已被广泛采用并在许多应用程序中使用。但是,经过多年的发展,它已经放慢了脚步。由于它需要与非常老版本的Java兼容,因此变得更加难以维护,并 于2015年8月退出生命周期。
log4j2 的改进
- Log4j 2 包含基于LMAX Disruptor库的下一代异步记录器。在多线程方案中,与Log4j 1.x和Logback相比,异步Logger的吞吐量高10倍,延迟降低了几个数量级。
- Log4j的2是 garbage free,可以减少垃圾收集器上的压力,并可以提供更好的响应时间性能。
- 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。
- 支持lambda表达式。
- 支持Message对象。消息允许对有趣和复杂的结构的支持通过日志系统传递并得到有效的操纵。用户可以自由创建自己的 消息 类型并编写自定义Layouts,Filters和 Lookups来进行操作。
log4j 架构
Log4j2的性能
Log4j2最牛逼的地方在于异步输出日志时的性能表现,Log4j2在多线程的环境下吞吐量与Log4j和Logback的比较如下图。下图比较中Log4j2有三种模式:1)全局使用异步模式;2)部分Logger采用异步模式;3)异步Appender。可以看出在前两种模式下,Log4j2的性能较之Log4j和Logback有很大的优势。
Log4j2使用的几个点
- 在Web项目中需要添加 log4j-web jar包。
- Log4j允许使用log4jConfiguration参数在web.xml中指定配置文件位
- Log4j将通过以下方式搜索配置文件:
如果配置了路径(log4jConfiguration参数配置),Log4j将去搜索这个位置。
如果未配置路径,Log4j将搜索WEB-INF目录中“log4j2”开头的文件。如果找到多个文件,并且存在以“log4j2-name”开头的文件,其中name是Web应用程序的名称,则会使用它。
否则,将使用第一个文件。
在resources目录下搜索配置文件,规则同b。 - Log4j2不支持Servlet 2.4及更老的的Web应用程序。
依赖
<!-- log4j 2.14 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- slf4j核心包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
```
## Log4j 配置详解