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

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,