node 第十五天 生产环境log日志记录 服务器宕机重启 开发环境 热重载 体验

本文主要是介绍node 第十五天 生产环境log日志记录 服务器宕机重启 开发环境 热重载 体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 前言
    当我们的项目上线服务器后, 我们不可能24小时守在服务器身边, 所以我们需要一些操作来记录服务器日志, web服务器一般需要记录用户接口请求操作等等, 除此以外当程序破溃, 服务器意外宕机等原因发生时, 我们需要采取合适的手段来处理, 比如及时结束服务, 保护数据库, 防止cpu飙高, 又比如, 自动重启服务, 开机自动重启服务等
  2. pm2

Node.js Production Process Manager with a built-in Load Balancer.
内置负载均衡的 Node.js 生产流程管理器。

  • 额 负载均衡这个问题我们目前不用考虑
  • 当我们启动node服务后, 不可能一直开着cli界面不让进程结束, 使用pm2可以实现进程守护
  • 当我们启动node服务后, 不可能一直人为监控着console.log, 使用pm2可以将日志写入文件, 包括标准输出流日志和错误日志
  • pm2 天生集群cluster应用启动模式(fork可选) 额 这里又和负载均衡扯上了
  1. 一个标准的express生成器生成的express项目 配置pm2脚本命令如下
//package.json script"scripts": {"pm2:pro": "pm2 start pm2.json --env pro --time","pm2:dev": "pm2 start pm2.json --env dev --time","pm2:re": "pm2 restart 0","pm2:list": "pm2 list","pm2:exit": "pm2 del all"}
//pm2.json
{"apps": {"name": "myapp","script": "./bin/www", // 入口文件"cwd": "./", // 文件根目录"args": "", // 传递给脚本的参数"interpreter": "",// 指定的脚本解释器"interpreter_args": "",// 传递给解释器的参数"watch": false,// 是否监听文件变动然后重启"ignore_watch": ["node_modules", "public", "logs"],// 不用监听的文件"exec_mode": "cluster_mode",// 应用启动模式,支持 fork 和 cluster 模式"instances": "1", // 应用启动实例个数,仅在 cluster 模式有效 默认为 fork"error_file": "./logs/app-err.log",// 错误日志输出文件"out_file": "./logs/app-out.log",// 正常日志输出文件"merge_logs": true,// 设置追加日志而不是新建日志"log_date_format": "YYYY-MM-DD HH:mm:ss",// 指定日志文件的时间格式"min_uptime": "60s", // 应用运行少于时间被认为是异常启动"max_restarts": 30,// 最大异常重启次数"autorestart": true, // 默认为 true, 发生异常的情况(程序奔溃)下自动重启"restart_delay": "60",// 异常重启情况下,延时重启时间"env_pro": {// 环境参数,通过指定pm2脚本 --env pro/dev/test  参数设置服务启动时的环境常量"NODE_ENV": "production","REMOTE_ADDR": ""},"env_dev": {"NODE_ENV": "development","REMOTE_ADDR": ""},"env_test": {"NODE_ENV": "test","REMOTE_ADDR": ""}}
}
  1. 开发时使用npm run pm2:dev (开发环境可以用nodemon替换) 生产环境使用 npm run pm2:pro

实现:

  • 程序崩溃自动重启服务

    修改文件自动重启(一般在开发环境使用, 可以用nodemon代替, nodemon具有良好的开发环境体验, 见下面介绍)
    在生产环境一般 都是 watch: false 因为如果某个报错引起了受监听的文件改动, 那么pm2就会无限重启
    报错–>文件改动–>重启–>报错—>死循环
    导致不断将错误信息产生的log写入文件, 硬盘都被写满
    设置了max_restarts也没用

  • 根据需要注入不同的环境变量

  • 指定标准日志输出文件(可以用下面介绍的morgan 来加强标准日志输出 非常好用)

  • 指定错误日志输出文件

  1. nodemon代替 pm2watch: true 功能

    刚开始接触node时, 当我们修改文件后需要手动去重启服务才能看到效果, 什么? 前端都实现了热重载, 服务端还要手动操作?
    所以让我们来使用nodemon吧,
    npm install nodemon -g 使用 nodemon app.js 代替 node app.js 实现修改文件自动重启服务, 开发体验++

  2. morgan express好用的日志记录中间件

    const logger = require('morgan');
    const accessLogStream = fs.createWriteStream(path.join(__dirname, '/logs/daily.log'), { flags: 'a' });
    // Standard Apache combined log output. time in china +8h
    // 标准的Apache组合日志输出, 时间(时区 +0000)加8小时转换为中国时间
    app.use(logger('combined', { stream: accessLogStream }));
    
  3. 顺带一提, 错误处理

    在express中处理全局的未捕获错误使用一个放在最后的中间件即可

    // error handler
    app.use(function (err, req, res, next) {	// render the error pageres.status(err.status || 500);res.render('error'); 
    });
    

    原生node捕获主要使用到process模块 (process的使用前提是你必须知道自己在干什么)

    process.on('uncaughtException', (err, origin) => {console.log(err, origin);
    });
    
  4. pm2进阶 文档 高级用法
    服务器宕机重启, 开机启动服务

    在 linux 中,设置开机自启动,只需要执行以下两个步骤:
    运行 pm2 startup,即在/etc/init.d/ 目录下生成 pm2-root 的启动脚本,且自动将 pm2-root 设为服务;
    运行 pm2 save ,会将当前 pm2 所运行的应用保存在 /root/.pm2/dump.pm2 下,当开机重启时,运行pm2-root 服务脚本,并且到 /root/.pm2/dump.pm2 下读取应用并启动;

这篇关于node 第十五天 生产环境log日志记录 服务器宕机重启 开发环境 热重载 体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345279

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤