一般前端开发同学,对日志其实不太敏感,毕竟前端大多数情况下,不太关心日志。即使有,也可能调用一些第三方的统计,比如百度统计或者别的等。在 Node.js推进过程中,也发现我们平常打日志太随意,该打的日志没有打,打的一些关键日志缺少必要上下文信息,导致在线上定位问题的时候很困难。

本文主要梳理了在nodejs开发中日志方面存在的问题,以及通过统一日志规范,希望达到什么样的效果。

存在的问题

现在大部分小团队使用node去做服务端开发,都或多或少存在以下问题:

  • node日志不规范,打日志太随意
  • 没有良好的日志格式、约定的字段,在 ELK 里不能很好的解析&检索
  • 由于node对接的后端服务化,调用链不清晰,定位问题困难
  • 数据部门对node日志的使用,没有明确的记录。node修改了日志,导致统计数据异常

希望达成的目标

为了方便查看和统计,我们制定了以下目标:

  • 规范日志打印字段&格式,便于 ELK 检索
  • 增强node上下游(nginx/后端)日志格式,加入惟一 requestId,方便微服务下定位问题
  • 统计应用运行情况,性能数据
  • 维护数据部门对node日志的使用情况

实现方案

日志类型

参考一些日志的最佳实践,目前将node日志分为如下几种类型(scope):

  • desc: 系统启动、运行过程中,打的日志,表明系统的一些启动日志、启动参数等,也包含在 不能 捕获到http上下文的时候,打的日志
  • stat: 系统性能统计日志,应用会定时收集一些性能信息,便于查询应用当前状态
  • visit: 每个http请求相关的日志,会包含惟一的 requestId,定位该请求相关的所有日志
  • biz: 业务数据相关日志,主要提供给数据统计使用

日志级别

只使用 FATAL、ERROR、WARN、INFO 和 DEBUG 等级。

  • FATAL - 导致程序退出的严重系统级错误,不可恢复,当错误发生时,系统管理员需要立即介入,一般应用代码 使用。
  • ERROR - 运行时异常以及预期之外的错误,也需要立即处理,但紧急程度低于FATAL,当错误发生时,影响了程序的正确执行。需要注意的是这两种级别属于服务自己的错误,需要管理员介入,用户输入出错不属于此分类,请求后端、读文件、数据库等超时、返回错误结构,属于ERROR
  • WARN - 预期之外的运行时状况,表示系统可能出现问题。对于那些目前还不是错误,然而不及时处理也会变成错误的情况,也可以记为WARN,如磁盘过低。
  • INFO - 有意义的事件信息,记录程序正常的运行状态,比如收到请求,成功执行。通过查看INFO,可以快速定位WARN,ERROR, FATAL。INFO不宜过多,通常情况下不超过 DEBUG 的10%。
  • DEBUG - 与程序运行时的流程相关的详细信息以及当前变量状态。

日志格式/字段

日志格式统一采用JSON ,便于 ELK 解析处理。

日志中的各个字段的值,都应该尽量使用英文 ,不使用中文。

日志具体字段,分为 基础数据 + 扩展数据。基础数据,是底层日志框架自带的,所有日志都会包含。扩展数据,不同类型的日志,包含不同的字段。

日志基础数据

目前使用的 node-bunyan 日志库,官方文档,基础字段包含如下:

  • v: integer 。bunyan的日志版本号
  • level: integer。日志级别对应的数字
  • name: string。服务名
  • hostname: string。主机名
  • pid: integer。进程号
  • time: string。UTC格式的日期
  • msg: string。日志主体信息

日志扩展数据

下面定义的各个数据类型的扩展数据,不是 全部的字段,仅包含该日志类型下,必需的字段。这些必需的扩展字段,需要在 ELK 中建立索引,方便定位各种问题。

  1. desc类型日志,扩展字段:TODO
  2. stat类型日志,扩展字段:{ perf: {rss: xxxx, cpu: xxx} }
  3. visit类型日志,扩展字段:
  4. biz
{ / 基础数据  v: 1, level: 20, / 扩展字段  // 标志日志类型 scope: "visit

需要规范日志格式_Node开发的日志规范相关推荐

  1. mysql row 日志格式_MySQL 中二进制日志 (binlog) 3 种不同的格式(Mixed,Statement,Row)...

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点. MySQL ...

  2. 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)

    Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志access_log #日志格式设 ...

  3. Java日志格式规范

    Java日志格式规范 文章目录 Java日志格式规范 **| 日志的作用** **| 撰写日志的要求** **日志的可读性:**日志时给人读的,不仅仅是让自己明白,也要让没有接触过我们源代码的其他程序 ...

  4. mysql二进制日志格式对复制的影响

    根据参与复制的主数据库所使用的二进制日志格式的不同,复制可以分为基于SQL语句的复制,和基于行的复制,那么基于SQL语句的复制呢,就是指的是主数据库服务器的二进制日志的格式,使用statement这种 ...

  5. Nginx配置中的log_format用法梳理(设置详细的日志格式)

    Nginx配置中的log_format用法梳理(设置详细的日志格式) nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式:另外一条是access_log,用来指定日志 ...

  6. linux messages日志为空,自定义linux系统日志格式(messages,cron,ssh等日志格式)

    在Linux系统中,messages.cron.secure等日志的默认的格式为:Dec 12 14:04:47 我们更喜欢的格式为这样的:2019-12-12 14:12:19 修改方法为,修改后重 ...

  7. mysql+web日志分析工具_WEB日志格式及分析工具

    WEB日志是网站分析和网站数据数据整理最基础的数据,了解其格式和组成将有利于更好地进行数据的收集.处理和分析. 一.日志格式类型 目前常见的WEB日志格式主要由两类,一类是Apache的NCSA日志格 ...

  8. apache日志格式定义及示例说明

    来源:https://blog.csdn.net/newhappy2008/article/details/7604956 有时候我们需要定制Apache默认日志的格式和内容,比如增加或减少日志所记录 ...

  9. mysql 二进制日志详解_Mysql二进制日志详解

    引言 注:图片取自网络 提一下比较重要的几个: 重做日志(Redo Log):重做日志是实现mysql事务的持久性的原理之一,当新增数据时,Redo Log会备份新数据,在事务提交前,只要持久化Red ...

最新文章

  1. Python解析命令行读取参数 -- argparse模块
  2. bde oracle 商友的流程_bde oracle 商友的流程_BDE动态连接Oracle数据库
  3. Winform界面中主从表编辑界面的快速处理
  4. Python-图像的手绘效果
  5. Pair Project: API设计 by Xiao Li and Yishi Xing
  6. python时间戳转换并pandas批量转换时间戳
  7. [NOI2016]循环之美(杜教筛)
  8. Linux传递位置参数,Linux-scripts-位置参数等特殊变量
  9. docker-compose 学习:通过 Dockerfile 和 build 指令搭建 LNMP
  10. Atitit 提升开发效率 声明式编程范式 目录 1. 声明式编程体系树 1 1.1. 声明式(对比:指令式,,主要包括 函数式,逻辑式编程) 2 1.2. 声明式编程:表达与运行分离 3 1.3
  11. git分支详细讲解,模拟分支开发,为什么使用分支开发
  12. 【自学笔记】基于R语言的copula函数重现期等值线绘制
  13. 中国石油大学计算机专业调剂信息,中国石油大学(北京)地球科学学院2020级硕士研究生招生缺额信息发布公告...
  14. 高数符号用计算机表示,请问高等数学的符号怎么在电脑上打出来
  15. Midas GTS NX To 3DEC网格转换程序
  16. 读书笔记 ·《简约至上》第二章 明确认识
  17. Java咖啡馆(2)——第一杯咖啡
  18. Java基础知识(一),打好基础才能写出高质量代码
  19. 树莓派使用360wifi2实现无线上网
  20. 浙江大学计算机科学与技术学院分数线,浙江大学分数线是多少 王牌专业有哪些...

热门文章

  1. 我发现:在StackOverflow上拯救歪果仁十分有意思!
  2. 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
  3. Emgucv中快捷的显示图像直方图
  4. C++数据类型与C#对应关系 c#调用WINDWOS API时,非常有用
  5. 2019-2-15 日记
  6. 【转】Nginx服务并发过10万的Linux内核优化配置
  7. PHP框架 CI与TP之MVC比较
  8. 边做边学小型封装--利用主流框架进行Dao层通用化,Spring3.0+Hibernate3.3.2通用Dao层整合(四)...
  9. JAVA集合(四、ConcurrentHashMap)
  10. windows程序窗体创建流程模型A--利用基本数据类型