Log4j2-03-log4j2 入门介绍 log4j2 日志级别

拓展阅读

Log4j2 系统学习

Logback 系统学习

Slf4j

Slf4j-02-slf4j 与 logback 整合

SLF4j MDC-日志添加唯一标识

分布式链路追踪-05-mdc 等信息如何跨线程? Log4j2 与 logback 的实现方式

日志开源组件(一)java 注解结合 spring aop 实现自动输出日志

日志开源组件(二)注解结合 spring aop 实现日志traceId唯一标识

日志开源组件(三)java 注解结合 spring aop 自动输出日志新增拦截器与过滤器

日志开源组件(四)如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

日志开源组件(五)如何将 dubbo filter 拦截器原理运用到日志拦截器中?

日志开源组件(六)Adaptive Sampling 自适应采样

阅读更多

介绍

几乎每个大型应用程序都包含自己的日志记录或跟踪 API。

根据这一规则,E.U. SEMPER 项目决定编写自己的跟踪 API。

那是在 1996 年初。经过无数次的改进、多次改进和大量工作,API 已经发展成为 log4j,一个流行的 Java 日志记录包。

该软件包根据 Apache 软件许可证分发,这是一个由开源计划认证的成熟的开源许可证。

最新的 log4j 版本,包括完整的源代码、类文件和文档,可以在 https://logging.apache.org/log4j/2.x/index.html 找到。

将日志语句插入代码是一种低技术含量的调试方法。 这也可能是唯一的方法,因为调试器并不总是可用或适用。

这通常是多线程应用程序和大型分布式应用程序的情况。

经验表明,日志记录是开发周期的重要组成部分。 它具有几个优点。 它提供有关应用程序运行的精确上下文。

一旦插入到代码中,日志输出的生成就不需要人为干预。

此外,日志输出可以保存在持久性介质中以供日后研究。 除了在开发周期中使用之外,足够丰富的日志记录包也可以被视为审计工具。

正如 Brian W. Kernighan 和 Rob Pike 在他们真正优秀的著作《编程实践》中所说的那样:

作为个人选择,除了获取堆栈跟踪或一两个变量的值之外,我们倾向于不使用调试器。 一个原因是很容易迷失在复杂的数据结构和控制流的细节中; 我们发现单步执行一个程序比更努力地思考并在关键位置添加输出语句和自检代码效率要低。 单击语句比扫描精心放置的显示器的输出要花费更长的时间。 与单步执行到代码的关键部分相比,决定在哪里放置 print 语句花费的时间更少,即使假设我们知道关键部分在哪里。 更重要的是,调试语句留在程序中; 调试会话是短暂的。

日志记录确实有其缺点。 它可以减慢应用程序。

如果过于冗长,可能会导致滚动失明。

为了减轻这些担忧,log4j 被设计为可靠、快速和可扩展的。 由于日志记录很少是应用程序的主要焦点,因此 log4j API 力求易于理解和使用。

Log4j 2

Log4j 1.x 已在许多应用程序中得到广泛采用和使用。

然而,多年来它的发展已经放缓。

由于需要与非常旧的 Java 版本兼容,它变得更加难以维护,并于 2015 年 8 月终止使用。

它的替代品 SLF4J/Logback 对框架进行了许多必要的改进。

那么为什么要使用 Log4j 2 呢? 以下是一些原因。

  • Log4j 2 旨在用作审计日志记录框架。 Log4j 1.x 和 Logback 在重新配置时都会丢失事件。 Log4j 2 不会。 在 Logback 中,应用程序永远不会看到 Appender 中的异常。 在 Log4j 2 Appenders
    中,可以配置为允许异常渗透到应用程序。

  • Log4j 2 包含基于 LMAX Disruptor 库的下一代异步记录器。 在多线程场景中,Asynchronous Loggers 的吞吐量比 Log4j 1.x 和 Logback 高 10 倍,延迟低几个数量级。

  • Log4j 2 对于独立应用程序来说是无垃圾的,在稳态日志记录期间对于 Web 应用程序来说是低垃圾。 这减少了垃圾收集器的压力并且可以提供更好的响应时间性能。

  • Log4j 2 使用插件系统,通过添加新的 Appender、过滤器、布局、查找和模式转换器,无需对 Log4j 进行任何更改,就可以非常轻松地扩展框架。

  • 由于插件系统配置更简单。 配置中的条目不需要指定类名。

  • 支持自定义日志级别。 可以在代码或配置中定义自定义日志级别。

  • 支持 lambda 表达式。 仅当启用请求的日志级别时,在 Java 8 上运行的客户端代码才可以使用 lambda 表达式延迟构造日志消息。 不需要显式级别检查,从而产生更清晰的代码。

  • 支持消息对象。 消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。 用户可以自由创建自己的消息类型并编写自定义布局、过滤器和查找来操作它们。

  • Log4j 1.x 支持 Appender 上的过滤器。 Logback 添加了 TurboFilters 以允许在事件被 Logger 处理之前对其进行过滤。 Log4j 2 支持可以配置为在事件由 Logger 处理之前处理事件的过滤器,因
    为它们是由 Logger 或 Appender 处理的。

  • 许多 Logback Appender 不接受布局,只会以固定格式发送数据。 大多数 Log4j 2 Appenders 接受布局,允许以任何需要的格式传输数据。

  • Log4j 1.x 和 Logback 中的布局返回一个字符串。 这导致了在 Logback 编码器中讨论的问题。 Log4j 2 采用布局始终返回字节数组的更简单方法。 这样做的好处是,这意味着它们几乎可以在任何 -
    Appender 中使用,而不仅仅是写入 OutputStream 的 Appender。

  • Syslog Appender 支持 TCP 和 UDP,并支持 BSD syslog 和 RFC 5424 格式。

  • Log4j 2 利用 Java 5 并发支持并在可能的最低级别执行锁定。 Log4j 1.x 有已知的死锁问题。 其中许多已在 Logback 中修复,但许多 Logback 类仍然需要相当高级别的同步。

  • 它是一个 Apache 软件基金会项目,遵循所有 ASF 项目使用的社区和支持模型。 如果您想贡献或获得提交更改的权利,只需遵循贡献中概述的路径即可。

架构

Log4j 使用下图中显示的类。

主要组件

Log4j2-03-log4j2 入门介绍 log4j2 日志级别_第1张图片

使用 Log4j 2 API 的应用程序将从 LogManager 请求具有特定名称的 Logger。

LogManager 将找到合适的 LoggerContext,然后从中获取 Logger。 如果必须创建 Logger,它将与 LoggerConfig 相关联,该 LoggerConfig 包含 a) 与 Logger 相同的名称,b) 父包的名称,或 c) 根 LoggerConfig。 LoggerConfig 对象是根据配置中的 Logger 声明创建的。 LoggerConfig 与实际传递 LogEvents 的 Appenders 相关联。

日志级别

LoggerConfigs 将被分配一个日志级别。

内置级别集包括 ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL 和 OFF。

Log4j 2 还支持自定义日志级别。 获得更多粒度的另一种机制是改用标记。

OFF 和 ALL 级别不适用于调用日志记录 API。

在配置中指定 OFF 意味着没有日志记录事件应该匹配,而指定 ALL 意味着所有事件都匹配,包括自定义事件。

但是,OFF 可用于在特殊情况下记录 API 调用,在这种情况下,无论配置如何,都应始终记录事件。

但是,通常建议改用具有相应全局标记过滤器的标记。

Log4j 1.x 和 Logback 都有“Level Inheritance”的概念。

在 Log4j 2 中,Loggers 和 LoggerConfigs 是两个不同的对象,因此这个概念的实现方式不同。

每个 Logger 引用适当的 LoggerConfig,后者又可以引用其父级,从而达到相同的效果。

下面是五个表,其中包含各种分配的级别值以及将与每个 Logger 关联的结果级别。

请注意,在所有这些情况下,如果未配置根 LoggerConfig,则会为其分配默认级别。

Logger Name Assigned LoggerConfig LoggerConfig Level Logger Level
root root DEBUG DEBUG
X root DEBUG DEBUG
X.Y root DEBUG DEBUG
X.Y.Z root DEBUG DEBUG

Log4j2-03-log4j2 入门介绍 log4j2 日志级别_第2张图片

你可能感兴趣的:(log,log4j,日志,log4j2)