Java日志初探:从概念到实践

在java的"crud"中,常常是线上出现了问题,火急火燎的去排查日志:?*这个地方为啥没有打印?那个**写的,啊,是我自己。*
日志这东西,正常运行就看不出来什么,真要出了问题,那就是救命的稻草了。

了解日志

在Java语言中,日志是用于记录应用程序运行时产生的信息的记录系统。日志可以包含各种信息,例如程序执行流程、异常情况、性能指标等。

日志
日志就为每日的记录(通常是跟作者有关的)。 日志文件(log file)。 服务器日志(server log),记录服务器等电脑设备或软件的运作。
百度百科

日志作用

日志的作用主要有以下几点:

  1. 故障排查和调试: 当程序发生错误或异常时,日志可以帮助开发人员定位问题的根本原因。通过查看日志,可以了解程序的执行流程、关键变量的值,以及错误发生的上下文。
  2. 性能监控: 日志可以记录程序的性能指标,例如方法执行时间、资源消耗等。通过分析这些信息,开发人员可以找到性能瓶颈并进行优化。
  3. 系统运行状态: 日志可以记录应用程序的运行状态,包括启动、停止、重启等操作。这对于系统管理员来说是非常重要的,可以帮助其了解系统的健康状况。
  4. 历史记录: 日志记录了应用程序的历史事件,可以用于审计、追踪和分析系统行为。
  5. 安全监控: 在安全领域,日志可以记录用户的操作、安全事件等信息,帮助检测潜在的安全问题。

发展

  1. 最初阶段
    • 最早的Java版本中,程序员主要使用System.out.println()进行日志输出。
    • 这种方式简单直接,但缺乏灵活性和扩展性。
  2. java.util.logging (JUL)
    • 随着Java 1.4的推出,引入了内置的日志框架java.util.logging
    • java.util.logging提供了基本的日志记录功能,包括日志级别、日志处理器和格式化器等。
    • 尽管它是内置的,但很多开发者认为它的配置和使用相对复杂,而且扩展性不佳。
  3. Log4j
    • Apache Log4j 是第一个流行的开源日志框架。
    • Log4j 提供了丰富的功能,包括多种日志级别、日志过滤、日志输出目的地等。
    • 它采用了灵活的配置文件来配置日志记录器,使得配置变得更加简单和可扩展。
  4. Logback
    • Logback 是 Log4j 的继任者,由 Log4j 的原作者开发。
    • Logback 在性能和功能上进行了优化,提供了更好的性能和可靠性。
    • 它保持了 Log4j 的配置风格,因此对于那些熟悉 Log4j 的开发者来说,迁移到 Logback 是比较容易的。
  5. SLF4J(Simple Logging Facade for Java)
    • SLF4J 是一个日志门面框架,旨在为各种日志实现(如Log4j、Logback、JUL等)提供统一的API。
    • 使用SLF4J,开发者可以在应用程序中使用统一的日志API,而无需关心底层日志实现的细节。
    • 这种抽象使得应用程序更加灵活,可以轻松地切换底层日志框架。
  6. Java Logging (JUL) 的改进
    • 随着Java的版本更新,java.util.logging也在不断改进,提供了更多的功能和性能优化。
    • 然而,由于SLF4J和其他第三方日志框架的流行,JUL在实际开发中的使用相对较少。

总的来说,Java日志框架在不断演进,从最初的简单输出到今天的高度可配置和可扩展的日志系统。开发者可以根据项目需求和个人偏好选择合适的日志框架。

打印日志的时机(设想)

  1. 系统初始化: 记录系统启动过程中的关键配置参数和启动状态是非常有帮助的,特别是当系统出现启动问题时,能够通过初始化日志快速定位问题所在。(INFO级别)
  2. 异常情况: 对异常情况进行日志记录是很重要的,可以帮助及时发现问题、定位异常原因,并采取相应的处理措施。根据异常的严重程度选择适当的日志级别也是一个明智的做法。( ERROR 级别)
  3. 业务流程的关键点: 记录业务流程中的关键点可以提供对系统运行状态的实时监控,也有助于在发生问题时快速定位问题。这对于理解系统行为和进行性能监控是有帮助的。(INFO级别)
  4. 第三方服务远程调用: 记录第三方服务的请求和响应参数是很有必要的,这有助于排查与第三方服务交互的问题。在微服务架构中,服务之间的通信是一个潜在的故障点,因此记录这些信息对于排查分布式系统中的问题非常重要。(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

合格的日志

  1. 易读性高:
    • 例如,一个易读的日志示例可能是:“[2024-03-01 10:15:23] 用户登录成功:用户名为’example_user’的用户成功登录系统。”
  2. 结构化信息:
    • 举例来说,结构化的日志可能包含字段如时间戳、日志级别、事件描述、用户ID等,这使得日志更易于通过分析工具进行搜索和过滤。
  3. 唯一标识:
    • 日志中的唯一标识可以是事件的ID或者其他唯一的标识符,例如:“[2024-03-01 12:30:45] 错误发生,错误代码:E1023”。
  4. 适度详细:
    • 详细程度应当适中,既能提供足够的信息以理解事件,又不至于过于冗长。例如:“[2024-03-01 15:45:12] 订单创建成功:订单号为’123456’。”
  5. 级别划分:
    • 日志级别应该根据事件的重要性和紧急程度进行划分。例如,DEBUG级别用于记录调试信息,而ERROR级别用于记录严重错误。
  6. 性能友好:
    • 对于高性能要求的系统,日志应采用异步写入和轮转策略,以减少对系统性能的影响。例如,采用异步写入方式可提高系统响应速度。
  7. 安全性考虑:
    • 对于包含敏感信息的日志,应采取加密或者脱敏等安全措施,确保日志不被未授权的人访问。例如,对于用户密码等敏感信息进行脱敏处理。
  8. 时序性:
    • 日志应按照时间顺序记录,以确保事件发生的时序性。例如,按照事件发生的时间顺序记录日志,便于追踪和分析事件的发生过程。
  9. 可扩展性:
    • 日志系统应具备一定的可扩展性,能够适应系统的发展和变化。例如,支持动态调整日志级别和日志输出方式,以满足不同的需求。
  10. 集中管理:
    • 使用日志管理平台对日志进行集中管理,以便于存储、搜索和分析。例如,使用ELK Stack可以实现日志的集中存储和分析,提高日志的利用价值。

总结

这篇文章主要介绍了Java日志的重要性以及其在应用程序开发中的作用。通过对日志的定义、作用、发展历程以及打印日志的时机进行详细说明,帮助读者了解了日志记录在应用开发中的重要性。此外,文章还介绍了合格的日志应具备的特点,并给出了实际案例来说明每个特点的重要性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泓影 - 玄冥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值