【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

不可忽视的日志

  • 2013-11-28
  • 本文字数:2381 字

    阅读完需:约 8 分钟

在软件开发中,日志是一项必不可少又不是那么重要的“功能”,毕竟,产品的业务逻辑模块对客户来说才是最有价值的。但是,随着软件开发和部署模式的变化发展,日志的重要性正在不断提高。软件架构师 Vlad Mihalcea解释了其中的缘由。

Vlad 认为日志应当得到比我们现在给予它的更多的关心:

我认为当设计一个应用的时候,很大一部分精力都投入到了构建客户业务逻辑模型上。这个业务模型将映射到一个持久化存储上(作为一个 RDBMS 或 NoSQL 解决方案)。日志模块有以下框架可供选择:web、中间件、批处理任务、或者可能是通过 log4j logback 实现的 SLF4J (Simple Logging Facade for Java)。这几乎是我参与的所有的应用出现的现象,并且日志一直都是个二等公民,且依赖于良好的旧的字符串日志框架。

但是最近我开始意识到现在的字符串日志系统还有更多的东西需要记录,特别是如果我的系统被部署到云端并且利用了自动伸缩的优势时,然后收集文本文件并且将它们聚集到一个公共的地方——这种做法看起来就像是骇客的行为。

他谈到了自己最近在日志开发方面的变化,在其最新的应用程序中,Vlad 实现了一个拥有更复杂信息的通知机制,因为只有基于字符串的日志是不够的。

我得感谢和我一起工作的一个同事,当他说“通知机制是我们应用程序的核心”时,他开启了我的视野。我之前还从未想过将日志作为任何一个应用程序的核心。业务逻辑才是应用程序的核心,而不是日志。但他的话中也有很多事实,因为如果你没有一个好的机制了解你的系统是否真的在做那些期望的事,你没法部署任何东西。

Vlad 设计的通知都是些比较复杂的对象(调试通知比错误通知的数据更少),并且 NoSQL 文档数据库是一个存储我们日志的绝佳数据库。一个通知包含了以下各种类型的数据:

  • 当前正在执行的任务
  • 数据的来源
  • 日志起源的组件
  • 抛出的异常
  • 输入的参数
  • 承载着我们请求的 Spring 集成消息的历史记录

他提到,既然能够在一种少模式的方式下存储复杂的对象,那么也能够查询日志,并且日志查询结果到达的顺序并不要紧。因为可以依据来源和创建时间来给它们排序。这样就可以拥有一个安排好的任务,便于在检测到太多错误条目时生成警报和报告。这是一个客户定制的日志的实现,因为还没有为通知使用专有的框架,但 Vlad 从中得到了更多的价值,比从经典的基于字符串的日志文件中得到的多得多。

Vlad 依然认为 log4j 和 logback 是很棒的实现方案,并且还没有替换它们。

我们只是加了一些额外的日志特性来克服它们的局限性。但即使是用着最新的 logback 存放器,我依然认为当前的基于字符串的日志对于生产系统需求来说还是太过简单了。如果你使用它们更多目的是为了调试,并且在生产环境中有额外的监控方法的话,那么也许是时候用一个能同时为开发和生产环境工作的智能日志解决方案了。

如果说十年前,当关系型数据库(RDBMS)统治着存储世界时,这是很难实现的,并且基于文件的日志系统是个很好的折中方案。但 Vlad 认为现在已经有方法实现更好的日志框架了。

现在的基于字符串的文件日志模型也许已经很有效率了,尤其是当我们的服务器在单个机器中垂直缩放时。但在一个有着很多水平分布的服务器的世界中,这种状况需要额外的处理方案。

大公司们已经采用了这种新一代日志系统了,比如 Facebook Scribe LinkedIn Kafka 日志处理系统。我真的很喜欢 LinkedIn 的解决方案,并且它激励了我去探寻一个工作在 CQRS 模式下的新的日志系统。在这个日志系统中,日志整体像一个事件一样存储在日志数据库中,并且每个事件通过一系列的处理程序来更新当前系统状态。这种方法结合了日志和监视器,并且监视器命令直接进入缓存中的最新系统状态,这些系统状态包括:警报、状态报告、当前系统状态的监控视图。

软件工程师成富在" Java 日志管理最佳实践”中也谈到了日志的重要性:

对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环境中。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。在生产环境中,日志是查找问题来源的重要依据。应用程序运行时的产生的各种信息,都应该通过日志 API 来进行记录。很多开发人员习惯于使用 System.out.println、System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息。这些使用方式虽然简便,但是所产生的信息在出现问题时并不能提供有效的帮助。这些使用方式都应该改为使用日志 API。使用日志 API 并没有增加很多复杂度,但是所提供的好处是显著的。

对于 Java 在日志方面的 API,成富指出,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现。相关的 API(java.util.logging 包,JUL)和实现,直到 JDK 1.4 才被加入。因此在日志记录这一个领域,社区贡献了很多开源的实现。其中比较流行的包括 log4j 及其后继者 logback。除了真正的日志记录实现之外,还有一类与日志记录相关的封装 API,如 Apache Commons Logging 和 SLF4J。这类库的作用是在日志记录实现的基础上提供一个封装的 API 层次,对日志记录 API 的使用者提供一个统一的接口,使得可以自由切换不同的日志记录实现。比如从 JDK 的默认日志记录实现 JUL 切换到 log4j。这类封装 API 库在框架的实现中比较常用,因为需要考虑到框架使用者的不同需求。在实际的项目开发中则使用得比较少,因为很少有项目会在开发中切换不同的日志记录实现。

成富认为记录日志只是有效地利用日志的第一步:

更重要的是如何对程序运行时产生的日志进行处理和分析。典型的情景包括当日志中包含满足特定条件的记录时,触发相应的通知机制,比如邮件或短信通知;还可以在程序运行出现错误时,快速地定位潜在的问题源。这样的处理和分析的能力对于实际系统的维护尤其重要。当运行系统中包含的组件过多时,日志对于错误的诊断就显得格外重要。

2013-11-28 06:193390
用户头像

发布了 501 篇内容, 共 248.3 次阅读, 收获喜欢 57 次。

关注

评论

发布
暂无评论
发现更多内容

解密Elasticsearch:深入探究这款搜索和分析引擎 | 京东云技术团队

京东科技开发者

elasticsearch redis 底层原理 企业号 5 月 PK 榜 画像系统

人工智能大模型这场游戏才刚刚开始吗?还是在走下坡路? | 社区征文

迷彩

AI大模型 大模型时代 三周年征文 三周年连更

开心档之C++ 指针

雪奈椰子

程序员必知必会!阿里内部热捧“Spring全线笔记”太完整了

程序知音

Java spring java架构 Java进阶 后端技术

三顾茅庐,七面阿里,终拿25k*16offer,我的面试历程

程序知音

Java 后端 java面试 Java进阶 Java面试八股文

单点登录实现思路和方案

做梦都在改BUG

Java 单点登录

ShareSDK Facebook平台注册指南

MobTech袤博科技

如何维护好TiDB的三颗仙丹——索引、SQL和IO

TiDB 社区干货传送门

数据库架构设计

Prompt 技巧指南-让 ChatGPT 回答准确十倍!

Zilliz

openai ChatGPT

瓴羊Quick BI工具重建企业数字体系,数据处理不再难

巷子

火山引擎DataTester上线全新MAB智能调优实验

字节跳动数据平台

AB testing实战 A/B测试 企业号 5 月 PK 榜

java 中为什么有了 spring 还再来个 springboot?

海拥(haiyong.site)

三周年连更

牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)

做梦都在改BUG

Java 系统设计 高并发

限量!腾讯高工用4部分讲清楚了Spring全家桶+微服务

做梦都在改BUG

Java spring 微服务 Spring Cloud Spring Boot

腾讯云大佬亲码“redis深度笔记”无废话全精华!

程序知音

Java 数据库 redis Java进阶 后端技术

开心档之C++ 重载运算符

雪奈椰子

RocketMQ消费者是如何负载均衡的

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

深入理解 slab cache 内存分配全链路实现

bin的技术小屋

内存管理 Linux Kenel 内存池 slab

如何在Github参与开源项目的建设

骑牛上青山

GitHub 开源 PR

群星闪耀,众志成城 | 2023年4月《中国数据库行业分析报告》精彩抢先看

墨天轮

数据库 云原生 opengauss 国产数据库 AI4DB

深扒!阿里人用6部分讲完Java性能调优:多线程+设计模式+数据库

做梦都在改BUG

Java 性能优化 性能调优

面向万物智联的应用框架的思考和探索(中)

HarmonyOS开发者

扒去Spring事件监听机制的外衣,竟然是观察者模式

做梦都在改BUG

Java spring 设计模式 观察者模式 事件监听

细节!3部分讲明白HotSpot:运行时+编译器+垃圾回收器

做梦都在改BUG

Java JVM 虚拟机 hotspot

新手必看|StarRocks 入门教程来啦!

StarRocks

数据库 大数据 数据湖 OLAP 数仓

传感器接线方式详解

鸿蒙之旅

OpenHarmony 三周年连更

手把手教会你 | 多用户-服务器聊天室应用软件开发

TiAmo

多线程并发 数据库编程 服务器聊天室

TiDB 在 IPv6 的 K8S 和物理机环境的部署

TiDB 社区干货传送门

安装 & 部署 数据库架构选型 数据库前沿趋势

开心档之C++ 命名空间

雪奈椰子

探究Spring中Bean的线程安全性问题

做梦都在改BUG

Java spring 线程安全 bean

一起单测引起的项目加载失败惨案 | 京东云技术团队

京东科技开发者

spring 单元测试 bean 企业号 5 月 PK 榜 Javaassist

不可忽视的日志_语言 & 开发_崔康_InfoQ精选文章