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日志并进行多维度分析。
目录
相关文章
|
5天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
88 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
3天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
1天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
3天前
|
存储 关系型数据库 Java
探索后端开发:从基础到进阶
【10月更文挑战第33天】在这篇文章中,我们将深入探讨后端开发的各个方面,包括基本概念、关键技术和最佳实践。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。我们将通过代码示例来展示一些常见任务的实现方法,并分享一些实用的技巧和策略,帮助你提高后端开发的效率和质量。无论你是想学习新的编程语言还是想了解最新的后端技术趋势,这篇文章都会为你提供有益的指导和灵感。让我们一起开启后端开发的探索之旅吧!
|
3天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
22 2
|
4天前
|
存储 JavaScript 前端开发
探索后端开发:从基础到进阶的旅程
【10月更文挑战第31天】本篇文章旨在通过浅显易懂的语言,带领读者了解后端开发的奥秘。我们将一起探讨后端开发的核心概念、常用技术栈,以及如何通过实践不断提升自己的后端技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供一个清晰的学习路径和实用的建议。让我们一起踏上这段探索后端世界的旅程吧!
14 1
|
3天前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
11 0
|
3天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
3天前
|
存储 Java 关系型数据库
探索后端开发:从基础到进阶的旅程
【10月更文挑战第33天】在这篇文章中,我们将一起踏上一段激动人心的旅程,深入探索后端开发的奥秘。我们将从最基本的概念开始,逐步深入,直到能够理解并应用高级后端技术。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和知识。让我们一起开始这段旅程吧!
|
4天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
10 0
下一篇
无影云桌面