NodeJS 后端开发 08 使用log4js打日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: NodeJS 后端开发 08 使用log4js打日志日志是什么?

像记日记一样,日志是通过程序打印出来的,记录程序内部何时何处发生了什么事件。


本文只为使用学习为主,想对日志管理和分析有更深认识的可以看 => 日志原理与开发分析这篇完全指南就够了!适应各种规模


我们也用过console.log来打印一些调试信息,有什么区别呢?请读者带着这个问题往下读。


先安装

我们这里先安装一个日志的模快。


打开终端执行下面命令:


npm install log4js

npm install log4js

const log4js = require('log4js')
var logger = log4js.getLogger('雷学委开发日常')
logger.level = 'info'
logger.info('早上起床')
logger.info('拥抱太阳')
logger.info('吃完早餐')
logger.info('充满希望')
logger.info('开始了代码的一天')

保存上面代码为demo-fun.js ,然后运行:

node demo-fun.js

可以得到跟上面日志图片的效果,读完可以试试。

效果如下:

image.png

项目配置使用日志

log4js 可以基于代码配置日志规则,但是我们推荐使用json来配置。这是一个好习惯,虽然修改代码和配置都需要重启应用,但是可以通过程序实现让代码不重启也加载日志,这一点本文不作深入展示,后续补上。


代码配置日志

读者可以保存为demo2.js, 自行运行。


//demo2.js
const log4js = require("log4js");
//这里配置log4js使用fileAppender来输出“error”级别的日志。
//然后fileAppender是一个文件类型的日志累加器,输出日志到文件demo2.log
log4js.configure({
  appenders: { fileAppender: { type: "file", filename: "demo2.log" } },
  categories: { default: { appenders: ["fileAppender"], level: "error" } }
});
const logger = log4js.getLogger("demo");
//下面调用logger对象来打印一些日志。
logger.info("普通日志输出在这里!!!");
logger.error("雷学委,程序发现错误了,报警信息!");
logger.fatal("雷学委,这里通常是服务端/引擎吃不消了,打印严重错误日志。");

使用JSON配置log4js

把下面的内容保存为log4js.json

  • 定义了两个appender:fileAppender, stdout,分别写日志到文件和标准输出流。
  • 然后设置了default(默认)加载的appenders列表。
{
    "appenders": { 
        "fileAppender": { "type": "file", "filename": "leiXueWei.log" },
        "stdout": { "type": "stdout", "layout": {
             "type": "pattern",
              "pattern": "%d [%p] [%c] - %m%n"
         }}
     },
     "categories": {
         "default": { 
              "appenders": ["fileAppender","stdout"],
               "level": "info"
          }
      }
}

雷学委的 simpleweb.js 代码

const log4js = require("log4js");
const logCfg = require("./log4js.json")
console.log('logCfg:',logCfg)
log4js.configure(logCfg)
const logger = log4js.getLogger('雷学委Logger') 
const pid = require('process').pid
logger.info("process id:",pid)
const server = require('http').createServer((req,res)=>{
    console.log(new Date() + ' - visiting app:', req.url)
    logger.log('visiting app:', req.url)    
    res.write("Levin - Log4js DEMO - ProcessId: "+pid)
    res.end()
})
server.listen(8000,()=>{console.log('listening at 8000, pid:',pid)})

使用log4js打印日志效果图

image.png

当前项目路径中,可以找到下面日志文件leixuewei.log,我们查看发现console.log的信息都没有被记录。

image.png

log4js的logger 跟console.log的区别

console.log

通常是我们用来输出程序中间状态/事件等信息,也能像打印日志一样把日期其他数据都配套上,但是它更加轻便,而且不能写到文件中,打印方式也比较单一。


log4js提供logger给我们使用,这样我们可以log4js.getLogger(不同logger的名字),来区别的打印程序中间状态/事件等信息。

关键是能够写到文件中,这样方便我们以后回溯程序状态。


log数据很有用,必须让程序打印准确的信息

比如程序运营一个月后某段时间发现程序渲染页面特别慢。有了文件日志,我们可以轻松的进行统计分析,发现程序一些懒惰的bug,那些随着时间才能被发现的bug。


特别是一些多人协作的项目,一个开发可能不知道其他开发代码的逻辑,经过多次包装后,有可能出现一些诡异的循环,或者特定条件才执行的代码(比如根据节假日来展示活动的代码)。


很多问题在程序不被运行时,很难被发现,所以通过日志,可以记录并跟踪发现潜在问题,当然前提是,开发者得往程序中输出日志。


另外一个,就是不能盲目输出过多日志,访问主页,你打印1G的log数据,不光是占有硬盘还容易导致主页加载不出来。说的稍微夸张,但是品一品。


生产环境可用的log4js配置

好,刚好端午,附送一个适合生存环境使用的log4js.prod.json配置。 它定义了每天日志回滚,并保持30天的log数据,基本符合生产使用。


{
  "appenders": {
    "fileAppender": {
      "type": "dateFile",
      "daysToKeep": 30,
      "pattern": ".yyyyMMdd",
      "filename": "leixuewei.log",
      "layout": {
        "type": "pattern",
        "pattern": "%d [%p] [%c] - %m%n"
      }
    }
  },
  "categories": {
    "default": {
      "appenders": ["fileAppender"],
      "level": "info"
    }
  }
}

下面是pattern为“.yyyyMMddhhmm’ 是的日志滚动效果,读者自行下载代码修改尝试吧。

image.png

总结

博主给个小建议

  • 一定要打log,除非这个应用只有你维护不然出故障就是坑人。
  • 可能我们写了100行代码可以打印个2到3行,如果是一些特别复杂的业务可以多打点。
  • 同时使用不同级别的日志来打印。

这不是硬性标准,关键是反复使用中学会高效的使用日志系统。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1天前
|
存储 JavaScript Java
深入浅出后端开发:从零到一的旅程
【9月更文挑战第10天】本文将带领读者走进后端开发的神秘世界,从基本概念到实战应用,一步步揭开后端技术的面纱。通过浅显易懂的语言和实际代码示例,我们将探索如何搭建一个简单的后端服务,理解数据库交互,并实现API的基本功能。无论你是编程新手还是希望扩展知识的开发者,这篇文章都将为你提供一条清晰的学习路径。
|
2天前
|
存储 前端开发 Java
探索后端开发:从新手到专家的旅程
在这篇文章中,我们将一起踏上一段奇妙的旅程,探索后端开发的奥秘。无论你是刚刚踏入编程世界的新手,还是已经在这条路上走了一段时间的开发者,这篇文章都将为你提供有价值的见解和建议。我们将从基础概念开始,逐步深入到高级主题,包括框架选择、数据库设计、API开发等。让我们一起开启这段旅程吧!
|
2天前
|
JavaScript 关系型数据库 数据库
探索后端开发:从新手到专家的旅程
本文将带领读者踏上一场激动人心的旅程,从零基础开始,逐步深入后端开发的奥秘。我们将一起揭开后端世界的面纱,探索其核心概念、关键技术和实用工具。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和启发,帮助你在后端开发的道路上更进一步。准备好迎接挑战,让我们启程吧!
21 8
|
2天前
|
前端开发 API 数据处理
探索后端开发中的API设计哲学
【9月更文挑战第10天】在数字化时代的浪潮下,后端开发作为连接数据与前端界面的桥梁,其重要性不言而喻。本文将深入探讨如何通过精心设计的API来提升后端服务的可维护性、扩展性和用户体验。我们将从API设计的基本原则出发,逐步展开对RESTful API和GraphQL两种流行风格的比较分析,并结合具体场景讨论最佳实践。文章旨在为开发者提供一套实用的API设计指南,助力打造高效、稳定且易于协作的软件架构。
14 6
|
2天前
|
关系型数据库 API 数据库
探索后端开发:从基础到进阶的实用指南
在数字化时代的浪潮中,后端开发作为支撑整个互联网世界的根基,其重要性不言而喻。本文旨在为初学者和有一定经验的开发者提供一个深入浅出的后端开发指南,涵盖从基础概念到高级实践的各个阶段。我们将一起探讨如何选择合适的编程语言,理解数据库的重要性,学习API的设计,以及掌握容器化部署等关键技能。无论你是初出茅庐的新手,还是希望提升自己技能的老手,这篇文章都将是你的宝贵财富。
|
3天前
|
JavaScript 测试技术 API
探索后端开发:构建高效API的艺术
【9月更文挑战第8天】本文旨在揭示后端开发中一个经常被忽视的领域——API设计。通过深入浅出的方式,我们将探讨如何构建一个既高效又易于维护的API。文章将涵盖设计原则、最佳实践以及一些常见的陷阱和解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在后端开发的道路上更进一步。
|
2天前
|
网络协议 JavaScript Java
探索后端开发:从基础到高级
本文将带你走进后端开发的神秘世界。无论你是初学者还是有经验的开发者,都可以在这篇文章中找到你需要的内容。我们将从基础开始,逐步深入,最后达到高级水平。让我们一起来探索后端开发的奥秘吧!
15 4
|
2天前
|
消息中间件 存储 缓存
后端开发之深入浅出微服务架构
在数字化时代的浪潮中,后端开发如同一座桥梁,连接着用户与数据的世界。本文将带你探索微服务架构的奥秘,从基础概念到实战应用,一步步揭开它神秘的面纱。我们将一起思考,如何在这个快速变化的时代,找到属于自己的节奏和方向。
11 2
|
2天前
|
存储 安全 API
探索后端开发:构建高效API的艺术
【9月更文挑战第9天】在数字时代的浪潮中,后端开发如同一位默默无闻的艺术家,精心雕琢着每一个数据交互的细节。本文将带你走进后端的世界,从基础概念到实战技巧,一起学习如何打造高效、稳定且易于扩展的API。我们将通过深入浅出的方式,探讨后端开发的哲学与实践,让你在编码之旅中,找到属于自己的节奏和和谐。让我们一起跟随代码的脚步,解锁后端开发的无限可能。
|
2天前
|
设计模式 Kubernetes 开发者
探索后端开发中的微服务架构
本文旨在通过浅显易懂的方式,向读者介绍微服务架构的概念、优势以及在后端开发中的应用。我们将从微服务的基本定义出发,逐步深入到如何设计、部署和维护一个高效的微服务系统。文章还将分享一些实际案例,帮助初学者和有经验的开发者更好地理解和掌握微服务架构。