手把手教你在 Node.js 服务中写日志

node 服务中如何写日志?下面本篇文章给大家通过一个实战来了解一下在 node.js 服务中写日志的方法,希望对大家有所帮助!

手把手教你在 Node.js 服务中写日志

Node 写服务端的时候,比较头疼的是排查定位问题,因为不像 Chrome 浏览器中,我们有直接的报错提示在 dev tool 中,或者我们可以直接打断点调试。

经常我们会遇到在明明我在 test 环境可以啊,为什么 live 环境不行的问题。假如没有日志,对于这种问题,根据毫无头绪。

所以这篇文章,我们来聊聊如何在 Node 服务中写日志。

快速新建一个 koa 项目

先保证你全局安装了 Node

npm i koa2 -g

然后执行:

koa2 -e node-log # 新建一个项目cd node-lognpm i # 安装依赖npm run start # 启动

基础的服务就搭建起来了。访问 koa2,就可以看到以下的页面:

1.png

以上是一个快速搭建 http://localhost:3000/ 服务的方法。这个项目中内置了一个写日志的库——koa。我们先来看看它做了什么东西吧。

koa-logger

这个库比较简单,记录请求的基本信息,比如请求的方法、URl、用时等。作为中间件中使用,注意:推荐放在所有的中间件之前,这个跟 koa 的洋葱模型有关。假如不是第一个,计算时间会不准确。

var logger = require('koa-logger');app.use(logger());

在我们访问响应的资源的时候,会在控制台输出相应的日志如下:

   GET / 200 19ms 234b   GET /stylesheets/style.css 200 3ms 111b   GET /favicon.ico 404 1ms -

默认情况下,日志是通过 koa-logger 的方式直接输出到控制台中,假如我们需要对日志做自定义的操作,比如写入到日志文件中等。可以通过类似完成,比如我记录时间:

app.use(logger((str) => {  console.log(new Date() + str)  // redirect koa logger to other output pipe  // default is process.stdout(by console.log function)}))

结果:

Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)   GET / 200 20ms 226bMon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)   GET /stylesheets/style.css 200 4ms 111b

koa-log4js

console 比较轻量,也暴露了相对灵活的接口。但在实际业务中使用,我个人推荐使用 koa-logger。主要理由如下:

koa-log4js 看起来只支持中间件的使用方式,而不支持上报特定日志的功能。内置的功能比较少。比如日志的分类和落盘等。

koa-log4js 对 log4js 做了一层包装,从而支持 koa-logger 日志的中间件。它的配置和 Koa 是保持一致的。所以假如你用 log4js 的话,使用上应该是一致的。

使用

安装:

npm i --save koa-log4

先来看使用,根目录新建一个文件夹 log4js。并且新建一个文件夹 log,在其中新建文件 utils。代码如下:

const path = require('path');const log4js = require('koa-log4');const RUNTIME_PATH = path.resolve(__dirname, '../');const LOG_PATH = path.join(RUNTIME_PATH, 'log');log4js.configure({  // 日志的输出  appenders: {    access: {      type: 'dateFile',      pattern: '-yyyy-MM-dd.log', //生成文件的规则      alwaysIncludePattern: true, // 文件名始终以日期区分      encoding: 'utf-8',      filename: path.join(LOG_PATH, 'access.log') //生成文件名    },    application: {      type: 'dateFile',      pattern: '-yyyy-MM-dd.log',      alwaysIncludePattern: true,      encoding: 'utf-8',      filename: path.join(LOG_PATH, 'application.log')    },    out: {      type: 'console'    }  },  categories: {    default: { appenders: [ 'out' ], level: 'info' },    access: { appenders: [ 'access' ], level: 'info' },    application: { appenders: [ 'application' ], level: 'all'}  }});// getLogger 传参指定的是类型exports.accessLogger = () => log4js.koaLogger(log4js.getLogger('access')); // 记录所有访问级别的日志exports.logger = log4js.getLogger('application');

简单解释一下,logger.jsconfigure 的配置(后文会详解),通过 log4js-node 函数传参为日志类型,比如 getLogger 是访问级别日志。

然后在 access 中加入:

智写助手 智写助手

智写助手 写得更快,更聪明

智写助手 12 查看详情 智写助手

const { accessLogger, logger } = require('./utils/logger');app.use(accessLogger())

以及 app.js 中加入:

+ const { logger } = require('../utils/logger')router.get('/', async (ctx, next) => {+  logger.info('我是首页');  await ctx.render('index', {    title: 'Hello Koa 2!'  })})

刷新,可以看到在 routes/index.js 文件夹中输出两个文件:

2.png

分别记录了:

[2021-10-12T10:43:33.914] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 226 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"[2021-10-12T10:43:34.065] [INFO] access - ::1 - - "GET /stylesheets/style.css HTTP/1.1" 200 111 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
[2021-10-12T10:43:33.902] [INFO] application - 我是首页

接下来我们来看看 log 的配置。

level

日志的分级,主要作用是更好的展示日志(不同颜色)、有选择的落盘日志,比如在生产中避免一些 log4js 的敏感日志被泄露。debug 默认有九个分级(你可以通过 log4js 进行修改),如下:

{  ALL: new Level(Number.MIN_VALUE, "ALL"),  TRACE: new Level(5000, "TRACE"),  DEBUG: new Level(10000, "DEBUG"),  INFO: new Level(20000, "INFO"),  WARN: new Level(30000, "WARN"),  ERROR: new Level(40000, "ERROR"),  FATAL: new Level(50000, "FATAL"),  MARK: new Level(9007199254740992, "MARK"), // 2^53  OFF: new Level(Number.MAX_VALUE, "OFF")}

如下图所示:

3.png

只会输出级别相等或者级别高的日志。比如你配置了 levels,就不会输出 WARN 的日志。可以在下面配置的 INFO 中配置不同的类型日志的日志级别。

categories

日志类别。必须配置默认日志类别,用于没有命中的情况下的兜底行为。该配置为一个对象,categories 值为分类名称。比如上述 key 中:

{  default: { appenders: [ 'out' ], level: 'info' },  access: { appenders: [ 'access' ], level: 'info' },  application: { appenders: [ 'application' ], level: 'all'}}

其中每个类别都有两个配置 demo 是一个字符串数组,是输出配置(后文中会详解),可以指定多个,至少要有一个。appenders 是上文日志级别。

appenders

解决了日志分级和分类,接下来是日志落盘,也就是输出日志的问题。对应的配置是 level,该配置的 appenders 值为自定义的名称(可以给 key 中的 categories 使用),属性值为一个对象,配置输出类型。如下所示:

// 日志的输出appenders: {  access: {    type: 'dateFile',    pattern: '-yyyy-MM-dd.log', //生成文件的规则    alwaysIncludePattern: true, // 文件名始终以日期区分    encoding: 'utf-8',    filename: path.join(LOG_PATH, 'access.log') //生成文件名  },  out: {    type: 'console'  }}

其中,appenders 指的是通过 out 输出,这个可以作为我们的一个兜底。consoleaccesstype,指的是输出文件,然后配置文件的命名和输出路径。除了这个类型,详情可以看官网,比如 dataFile 通过邮件发送(这个需要 SMTP

总结配置

日志分级、日志分类以及日志落盘,配置上的关系如下:

4.png

总结

日志对于我们服务端排查定位问题非常重要,本文通过 nodemailerkoa-logger 讲解了如何上报日志。

koa-log4js 比较轻量,记录请求的基本信息,也提供了一定的自定义能力。

koa-logger 在日志分级、日志分类以及日志落盘上提供了一定的能力,个人认为基本这个更加适用于生产环境。

更多node相关知识,请访问:nodejs 教程!!

以上就是手把手教你在 Node.js 服务中写日志的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/553927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Java框架的文档和教程如何查找?
上一篇 2025年11月9日 21:30:27
《剑灵2》动作系统大变革!畅爽战斗来袭
下一篇 2025年11月9日 21:30:33

相关推荐

  • VS Code微服务开发:Docker与Kubernetes集成

    VS Code通过Docker扩展实现本地容器化开发,支持自动生成Dockerfile、一键构建镜像及devcontainer环境一致性;2. Kubernetes扩展可连接集群并管理资源,结合Bridge to Kubernetes实现本地调试与集群网络集成;3. 使用Skaffold自动化构建部…

    2026年9月24日
    000
  • VSCode主题开发:创建动态色彩主题的进阶技术解析

    动态主题需通过外部插件监听系统事件实现,核心是利用vscode.themeColor API响应主题切换,结合语义化作用域与Semantic Highlighting精准控制配色逻辑,实现智能自适应视觉体验。 想让VSCode主题随环境自动切换色彩?动态主题不只是换个配色那么简单。核心在于理解VSC…

    2026年9月23日
    400
  • 如何在mysql中使用连接池提升并发

    连接池通过复用数据库连接减少开销,提升高并发下系统性能;需根据语言选择HikariCP、SQLAlchemy等组件,合理配置最大连接数、空闲连接等参数,并结合数据库优化与监控调优以充分发挥效果。 在高并发场景下,频繁创建和销毁数据库连接会带来显著的性能开销。MySQL本身不直接提供连接池功能,但可以…

    2026年9月23日
    300
  • 嵌入式Linux开发-根文件系统本地挂载

    嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载嵌入式Linux开发-根文件系统本地挂载

    引言 前一篇文章介绍了根文件系统的制作与nfs网络挂载,本文将探讨如何通过本地挂载根文件系统来完成系统启动。本地挂载通常用于产品发布阶段,并且分为两种操作方式。 第一种方式:在PC机上制作好文件映像rootfs.img,然后通过uboot加载并直接烧写到EMMC中。这种方法最便捷,适用于产品批量生产…

    2026年9月23日 用户投稿
    300
  • 构建VSCode多媒体编程界面与实时音视频处理

    答案:VSCode通过配置Node.js、Python扩展及FFmpeg等工具,结合OpenCV、PyAudio等框架,可构建高效音视频处理环境。1. 安装Python和Node.js支持,启用Pylance、Jupyter插件提升数据处理体验;2. 配置终端与Code Runner实现脚本一键执行…

    2026年9月22日
    100
  • rm -rf 误删文件?别急,或许有救!

    rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!

    立即采取行动! 在生产环境中,我们应尽量避免进行风险操作。但如果不慎犯错,如何挽救呢?让我分享一个故事:上周我为了打包一个应用,需要整理Ubuntu 16.04上的线上数据,不小心删除了一个数据文件,幸而最终有惊无险,现记录如下。 extundelete 我的恢复计划主要依赖于一个工具——extun…

    2026年9月22日 用户投稿
    000
  • Linux系统中文件属性和权限实战操作

    Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作

    —–原本今天的文章是昨天晚上就要更新的,但是由于昨天晚上下班回到住的地方,发现停电了,所以就没写成。今天是在上一篇文章–linux系统中文件类型的基础上,继续进行深入的学习。好了,直接开干。 一、文件的操作权限: 1、在这之前我想还是很有必要介绍对文件的操作权限(…

    2026年9月22日 用户投稿
    300
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    100
  • PHPComposer怎么安装_PHPComposer依赖管理工具安装与使用指南

    PHPComposer是PHP的依赖管理工具,类似npm或pip。需先安装PHP,再下载并验证composer-setup.php,执行安装生成composer.phar,推荐全局安装至/usr/local/bin/composer,运行composer –version验证。使用com…

    2026年9月21日
    100
  • mysql如何实现后台管理系统

    答案:基于MySQL的%ignore_a_1%需设计用户、权限、日志等表结构,通过后端语言实现安全的CRUD接口与JWT认证,前端展示数据并控制权限,确保系统安全稳定。 实现一个基于 MySQL 的后台管理系统,核心是构建一个安全、稳定、可扩展的系统架构,将数据库作为数据存储层,配合后端语言和前端界…

    2026年9月21日
    200
  • VSCode的扩展推荐是怎么工作的?

    VSCode的扩展推荐基于用户行为和项目环境智能生成,当你打开.py文件时会推荐Python相关工具,打开.ts、.vue等文件则触发对应语言插件;系统通过分析package.json、requirements.txt等依赖文件识别技术栈,推荐Docker、ESLint等匹配扩展;同时记录常用操作如…

    2026年9月20日
    000
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • 如何为VSCode添加自定义主题?

    可通过安装扩展、手动添加JSON文件或使用Yeoman生成器创建主题。首先安装现成主题扩展并从颜色主题列表中选择应用;其次将自定义主题JSON文件放入用户themes目录后在命令面板中启用;最后可用yo code生成项目开发发布主题,需编辑配色文件并预览效果。 为 VSCode 添加自定义主题有几种…

    2026年9月20日
    000
  • edge浏览器无法打开本地HTML文件或显示空白怎么办_Edge浏览器打开本地HTML文件失败解决方法

    1、检查文件路径并选择Edge打开,确保路径为纯英文;2、在edge://flags中启用“Allow file access from files”;3、使用开发者工具排查资源加载错误;4、通过命令行启动Edge绕过安全限制;5、推荐使用npx live-server搭建本地服务器运行HTML文件…

    2026年9月20日
    000
  • VSCode的扩展推荐是基于什么?

    答案是VSCode根据文件类型、项目配置、用户行为和社区流行度智能推荐扩展。打开.py文件时提示Python扩展,存在package.json则推荐JS工具,频繁格式化代码会推荐Prettier,安装ESLint后可能推荐Prettier,高评分和官方扩展优先展示。 VSCode的扩展推荐主要基于你…

    2026年9月20日
    000
  • mysql如何实现用户注册功能

    答案:通过MySQL创建用户表并结合后端逻辑实现注册功能。首先在MySQL中创建包含用户名、密码、邮箱等字段的users表,确保唯一性约束;后端接收%ignore_a_1%提交的注册数据,对密码加密(如SHA256或bcrypt),使用参数化查询将数据安全存入数据库;前端通过表单或AJAX发送注册请…

    2026年9月13日
    200
  • 如何利用VSCode的配置文件(Launch.json)环境变量来管理不同环境的配置?

    通过配置launch.json中的多个调试环境并结合.env文件,可高效管理开发、测试、生产等不同环境的运行参数。 在使用 VSCode 进行开发时,launch.json 文件是调试配置的核心。通过合理利用环境变量和配置文件分离,可以轻松管理不同环境(如开发、测试、生产)的运行参数。 理解 lau…

    2026年9月13日
    000
  • 如何用ChatGPT来重构优化一段旧代码_提升代码质量与性能的步骤

    明确目标并提供上下文,分步引导ChatGPT优化代码结构、算法和语言特性,最后验证建议并本地测试,确保重构有效且安全。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 用ChatGPT来重构和优化旧代码是一种高效提升代码质量与性能的方式。关键…

    2026年9月12日
    200
  • 如何让VSCode自动识别项目类型?

    VSCode通过项目中的文件和配置自动识别类型,需提供线索如package.json、requirements.txt等标志性文件,结合安装对应语言扩展、配置.vscode/settings.json及使用.code-workspace文件,即可让编辑器正确识别并支持Node.js、Python、R…

    2026年9月12日
    300
  • 如何配置VSCode以附加(Attach)模式调试一个正在运行的Node.js或Python进程?

    要使用VSCode附加模式调试Node.js或Python进程,需先以可调试方式启动程序。对于Node.js,通过–inspect系列参数开启调试端口(如9229),并在launch.json中配置”request”: “attach”及对…

    2026年9月12日
    100

发表回复

登录后才能评论
关注微信