在java的"crud"中,常常是线上出现了问题,火急火燎的去排查日志:?*这个地方为啥没有打印?那个**写的,啊,是我自己。*
日志这东西,正常运行就看不出来什么,真要出了问题,那就是救命的稻草了。
了解日志
在Java语言中,日志是用于记录应用程序运行时产生的信息的记录系统。日志可以包含各种信息,例如程序执行流程、异常情况、性能指标等。
日志就为每日的记录(通常是跟作者有关的)。 日志文件(log file)。 服务器日志(server log),记录服务器等电脑设备或软件的运作。
日志作用
日志的作用主要有以下几点:
- 故障排查和调试: 当程序发生错误或异常时,日志可以帮助开发人员定位问题的根本原因。通过查看日志,可以了解程序的执行流程、关键变量的值,以及错误发生的上下文。
- 性能监控: 日志可以记录程序的性能指标,例如方法执行时间、资源消耗等。通过分析这些信息,开发人员可以找到性能瓶颈并进行优化。
- 系统运行状态: 日志可以记录应用程序的运行状态,包括启动、停止、重启等操作。这对于系统管理员来说是非常重要的,可以帮助其了解系统的健康状况。
- 历史记录: 日志记录了应用程序的历史事件,可以用于审计、追踪和分析系统行为。
- 安全监控: 在安全领域,日志可以记录用户的操作、安全事件等信息,帮助检测潜在的安全问题。
发展
- 最初阶段:
- 最早的Java版本中,程序员主要使用
System.out.println()
进行日志输出。 - 这种方式简单直接,但缺乏灵活性和扩展性。
- 最早的Java版本中,程序员主要使用
- java.util.logging (JUL):
- 随着Java 1.4的推出,引入了内置的日志框架
java.util.logging
。 java.util.logging
提供了基本的日志记录功能,包括日志级别、日志处理器和格式化器等。- 尽管它是内置的,但很多开发者认为它的配置和使用相对复杂,而且扩展性不佳。
- 随着Java 1.4的推出,引入了内置的日志框架
- Log4j:
- Apache Log4j 是第一个流行的开源日志框架。
- Log4j 提供了丰富的功能,包括多种日志级别、日志过滤、日志输出目的地等。
- 它采用了灵活的配置文件来配置日志记录器,使得配置变得更加简单和可扩展。
- Logback:
- Logback 是 Log4j 的继任者,由 Log4j 的原作者开发。
- Logback 在性能和功能上进行了优化,提供了更好的性能和可靠性。
- 它保持了 Log4j 的配置风格,因此对于那些熟悉 Log4j 的开发者来说,迁移到 Logback 是比较容易的。
- SLF4J(Simple Logging Facade for Java):
- SLF4J 是一个日志门面框架,旨在为各种日志实现(如Log4j、Logback、JUL等)提供统一的API。
- 使用SLF4J,开发者可以在应用程序中使用统一的日志API,而无需关心底层日志实现的细节。
- 这种抽象使得应用程序更加灵活,可以轻松地切换底层日志框架。
- Java Logging (JUL) 的改进:
- 随着Java的版本更新,
java.util.logging
也在不断改进,提供了更多的功能和性能优化。 - 然而,由于SLF4J和其他第三方日志框架的流行,JUL在实际开发中的使用相对较少。
- 随着Java的版本更新,
总的来说,Java日志框架在不断演进,从最初的简单输出到今天的高度可配置和可扩展的日志系统。开发者可以根据项目需求和个人偏好选择合适的日志框架。
打印日志的时机(设想)
- 系统初始化: 记录系统启动过程中的关键配置参数和启动状态是非常有帮助的,特别是当系统出现启动问题时,能够通过初始化日志快速定位问题所在。(INFO级别)
- 异常情况: 对异常情况进行日志记录是很重要的,可以帮助及时发现问题、定位异常原因,并采取相应的处理措施。根据异常的严重程度选择适当的日志级别也是一个明智的做法。( ERROR 级别)
- 业务流程的关键点: 记录业务流程中的关键点可以提供对系统运行状态的实时监控,也有助于在发生问题时快速定位问题。这对于理解系统行为和进行性能监控是有帮助的。(INFO级别)
- 第三方服务远程调用: 记录第三方服务的请求和响应参数是很有必要的,这有助于排查与第三方服务交互的问题。在微服务架构中,服务之间的通信是一个潜在的故障点,因此记录这些信息对于排查分布式系统中的问题非常重要。(INFO级别)
正常来说,现在硬盘的价格已经打下来了,所以选择好日志框架,设置日志大小,定期打包、删除,异步打印。
实现日志
在Java中,你可以使用各种日志框架来记录日志。
1.System.out.println();
:将信息打印到标准输出流(控制台),但生产不推荐。
2.java.util.logging
:JUL是java自带的日志框架,提供一套api来记录日志。
3.Log4J
:Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控
制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以
更灵活的控制日志的输出过程。方便项目的调试。
4.SLF4J
:简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范
的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。
5.Logback
:Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
6.Log4j 2
:这是Apache开源社区为了维护在Java日志江湖的地位,防止JCL、Log4j被Slf4j、Logback组合取代,推出的一个新的日志框架,与log4j不兼容,经过大量深度优化,其性能显著提升。
查看日志
1.选择直接查看日志文件的方式:
cat -[] xxx
tail
less
2.使用日志聚合工具来管理和可视化。
Elasticsearch, Logstash, Kiban
SLS
:Fluentd
合格的日志
- 易读性高:
- 例如,一个易读的日志示例可能是:“[2024-03-01 10:15:23] 用户登录成功:用户名为’example_user’的用户成功登录系统。”
- 结构化信息:
- 举例来说,结构化的日志可能包含字段如时间戳、日志级别、事件描述、用户ID等,这使得日志更易于通过分析工具进行搜索和过滤。
- 唯一标识:
- 日志中的唯一标识可以是事件的ID或者其他唯一的标识符,例如:“[2024-03-01 12:30:45] 错误发生,错误代码:E1023”。
- 适度详细:
- 详细程度应当适中,既能提供足够的信息以理解事件,又不至于过于冗长。例如:“[2024-03-01 15:45:12] 订单创建成功:订单号为’123456’。”
- 级别划分:
- 日志级别应该根据事件的重要性和紧急程度进行划分。例如,DEBUG级别用于记录调试信息,而ERROR级别用于记录严重错误。
- 性能友好:
- 对于高性能要求的系统,日志应采用异步写入和轮转策略,以减少对系统性能的影响。例如,采用异步写入方式可提高系统响应速度。
- 安全性考虑:
- 对于包含敏感信息的日志,应采取加密或者脱敏等安全措施,确保日志不被未授权的人访问。例如,对于用户密码等敏感信息进行脱敏处理。
- 时序性:
- 日志应按照时间顺序记录,以确保事件发生的时序性。例如,按照事件发生的时间顺序记录日志,便于追踪和分析事件的发生过程。
- 可扩展性:
- 日志系统应具备一定的可扩展性,能够适应系统的发展和变化。例如,支持动态调整日志级别和日志输出方式,以满足不同的需求。
- 集中管理:
- 使用日志管理平台对日志进行集中管理,以便于存储、搜索和分析。例如,使用ELK Stack可以实现日志的集中存储和分析,提高日志的利用价值。
总结
这篇文章主要介绍了Java日志的重要性以及其在应用程序开发中的作用。通过对日志的定义、作用、发展历程以及打印日志的时机进行详细说明,帮助读者了解了日志记录在应用开发中的重要性。此外,文章还介绍了合格的日志应具备的特点,并给出了实际案例来说明每个特点的重要性。