express-日志、开发环境、生产环境

为了记录在开发的过程以及项目使用过程中的操作,通常会使用日志记录用户操作

express脚手架搭建看这里

日志的使用

  • express-日志、开发环境、生产环境
  • 日志
  • 打印日志
  • 将log写入文件中
    • 1、使用fs进行文件写入
    • 2、使用插件file-stream-rotator进行文件写入
      • 安装插件
      • 引用插件
      • 写入文件
  • 封装log代码
    • 封装准备
    • logger.js代码
    • app.js的部分代码
  • 生产环境和开发环境
    • 环境配置
    • 打印当前环境
    • 根据当前环境判断是将日志保存到文件还是打印在控制台上

日志

由于使用的是express的脚手架创建项目,所以自带了一个日志的插件,我们可以直接使用这个插件进行打印和保存日志

打印日志

在开发的时候可以打印日志进行查看操作

var logger = require('morgan');
// 使用morgan中间件,默认格式直接打印日志
app.use(logger('dev'));
// 自定义格式打印日志 具体格式类型可以去查看文档
app.use(logger(':method :url :status :res[content-length] - :response-time ms'));

打印结果

将log写入文件中

由于打印日志是在开发的时候使用的,所以要对用户的操作日志进行保存,要将日志写入文件中,写入文件中有两种方法

1、使用fs进行文件写入

var logger = require('morgan');
var fs = require('fs')
const accessLogStream = fs.createWriteStream(path.join(__dirname, '/log/access.log'), {flags: 'a'
})
app.use(logger(function (tokens, req, res) {return [tokens.method(req, res),tokens.url(req, res),tokens.status(req, res),tokens.res(req, res, 'content-length'), '-',tokens['response-time'](req, res), 'ms'].join(' ')
}, {stream: accessLogStream}));

2、使用插件file-stream-rotator进行文件写入

由于用户数量太多,所有日志写入同一个文件会导致文件内容太多,所以需要分不同文件插入,这里可以使用file-stream-rotator插件进行对文件进行每天插入一个文件中(具体用法格式等可以参考文档)

安装插件

npm i file-stream-rotator -S

引用插件

var fileStreamRotato = require('file-stream-rotator')

写入文件

// 写入文件中 file-stream-rotator所有日志
// 这个会写入所有的日志
var accessLogStream = fileStreamRotato.getStream({filename:'./log/access-%DATE%.log',frequency:'daily',verbose:false,date_format:'YYYYMMDD'
})
app.use(logger(function (tokens, req, res) {return [tokens.method(req, res),tokens.url(req, res),tokens.status(req, res),tokens.res(req, res, 'content-length'), '-',tokens['response-time'](req, res), 'ms'].join(' ')
}, {stream: accessLogStream}));// 使用skip可以写入错误操作的日志
// 写入文件中 file-stream-rotator 错误日志
var accessLogStreamErr = fileStreamRotato.getStream({filename:'./log/access-err-%DATE%.log',frequency:'daily',verbose:false,date_format:'YYYYMMDD'
})
app.use(logger(function (tokens, req, res) {return [tokens.method(req, res),tokens.url(req, res),tokens.status(req, res),tokens.res(req, res, 'content-length'), '-',tokens['response-time'](req, res), 'ms'].join(' ')
}, {stream: accessLogStreamErr,skip: function (req, res) { return res.statusCode < 400 }
}));

封装log代码

之前都是在app.js上进行日志操作,但是app.js作为入口函数,不应该写过多的代码,所以对日志代码进行封装

封装准备

创建一个utils文件夹,文件夹中创建一个logger.js文件 如图

logger.js代码

// 日志的封装
// 写入文件中 file-stream-rotator所有日志
var express = require('express');
var logger = require('morgan');
var fileStreamRotato = require('file-stream-rotator')
var app = express()
var accessLogStream = fileStreamRotato.getStream({filename: './log/access-%DATE%.log',frequency: 'daily',verbose: false,date_format: 'YYYYMMDD'
})// 格式化日志输出格式  由于代码重复,对输出格式进行封装
function formatLog(tokens, req, res) {return [tokens.method(req, res),tokens.url(req, res),tokens.status(req, res),decodeURI(tokens.url(req, res)), // 获取get参数JSON.stringify(req.body),tokens.res(req, res, 'content-length'), '-',tokens['response-time'](req, res), 'ms'].join(' ')
}const accessLog = (logger(function (tokens, req, res) {return formatLog(tokens, req, res)
}, {stream: accessLogStream}));
// 写入文件中 file-stream-rotator 错误日志
var accessLogStreamErr = fileStreamRotato.getStream({filename: './log/access-err-%DATE%.log',frequency: 'daily',verbose: false,date_format: 'YYYYMMDD'
})
const accessLogErr = (logger(function (tokens, req, res) {return formatLog(tokens, req, res)
}, {stream: accessLogStreamErr,skip: function (req, res) {return res.statusCode < 400}
}));
// 导出代码
module.exports = {accessLog, accessLogErr, logger}

app.js的部分代码

const logger = require('./utils/logger')
// 写入所有日志
app.use(logger.accessLog)
// 写入错误日志
app.use(logger.accessLogErr)
// 打印日志
app.use(logger.logger('dev'))

生产环境和开发环境

由于开发和部署到服务器上以后的使用是在不同的环境中,所以每次部署之前都要对代码进行修改,这样的话太麻烦了,express脚手架封装了判断开发环境还是生产环境的代码,所以我么可以对代码进行配置,这样就可以让代码自动判断当前环境

环境配置

在package.json文件中对启动命令进行配置

打印当前环境


express中的这段代码会对当前环境进行判断使用npm run dev 和 npm run start会在控制台上打印当前的环境

根据当前环境判断是将日志保存到文件还是打印在控制台上

由于开发的时候不需要将日志打印在控制台上,所以对环境进行判断是将日志保存到文件还是打印在控制台上

if (process.env.NODE_ENV === 'development'){// 开发环境打印日志不保存app.use(logger.logger('dev'))
}else {// 生产环境app.use(logger.accessLog)app.use(logger.accessLogErr)
}

根据生产环境的开放环境的判断可以对数据库之类的进行不同的配置,这样就不需要在每一次部署都要修改配置数据了

express-日志、开发环境、生产环境相关推荐

  1. 开发测试服务器配置信息,node服务端中台实现及开发测试生产环境配置

    本人node服务端新人一枚,网上找了不少资料,看了很多别人的配置信息,感觉都不是很合适,看的多了自己也明白配置的具体思路跟实现方式了,以下为我的实现方式.通过package.json里面的script ...

  2. ionic app 开发和生产环境的配置

    前言 像 Angular2 一样,希望 ionic 可以提供 2 个文件 ( environment.dev.ts 和 environment.prod.ts ),其中包含与开发和生产环境相对应的不同 ...

  3. 在package.json里面的script设置环境变量,区分开发及生产环境。注意mac与windows的设置方式不一样...

    在package.json里面的script设置环境变量,区分开发及生产环境. 注意mac与windows的设置方式不一样. "scripts": {"publish-m ...

  4. Computer:计算机测试理论(开发/测试/上线)之DEV、SIT、UAT、PRD四套环境(测试环境/开发环境/生产环境)详细介绍之详细攻略

    Computer:计算机测试理论(开发/测试/上线)之DEV.SIT.UAT.PRD四套环境(测试环境/开发环境/生产环境)详细介绍之详细攻略 目录 测试理论 1.DEV.SIT.UAT.PRD四套环 ...

  5. 极光推送环境区分php,JPush Android 推送如何区分开发、生产环境

    我们 Android 开发者在使用极光推送时可能会发现,在通过官方控制台进行推送时.只有 iOS 区分了开发和生产环境,而 Android 则没有.但实际开发中又确实经常需要针对开发和生产环境分别来推 ...

  6. git(gitlab)子模块功能在团队协同开发和生产环境中的应用(git,gitlab,TortoiseGit,CI/CD,Jenkins,docker-compose,分支合并,开发环境,测试环境)

    git(gitlab)子模块功能在团队协同开发和生产环境中的应用 目录 git(gitlab)子模块功能在团队协同开发和生产环境中的应用 一.前言 二.先决条件 三.创建gitlab项目(项目管理员操 ...

  7. php微服务架构设计模式,《微服务架构设计模式》读书笔记---第十一章:开发面向生产环境的微服务应用...

    为了部署到生产环境中,需要考虑三个关键的质量属性:安全性,可配置性和可观测性. 开发安全的服务 需要实现安全性的四个方面: 身份验证. 访问授权.验证是否允许访问主体对指定数据完成请求的操作. 审计. ...

  8. vue服务端渲染——项目搭建、开发、生产环境的部署、浏览渲染、SEO优化

    几个月前,公司要求(服务端渲染)--用vue-ssr做了个服务端渲染,从起搭建.开发.部署.浏览器渲染到优化,希望对有需要的小伙伴有帮助,若是有不足之处,望指出,一起讨论学习.--几个月过去了,公司又 ...

  9. centos 日志审计_生产环境日志审计

    日志审计,就是记录所有系统和相关用户行为的信息,并且可以自动分析,处理.在中小企业环境中,一般都是在单个服务器上记录日志,而大型企业的生产环境当中,会有专门的日志服务器乃至集群.本文通过sudo配合c ...

  10. 基于webpack的PC端和mobile端开发以及生产环境的搭建

    我们用webpack做单页面应用开发应该尝试过很多次了,如果在同一个项目需要支持PC端和移动端,做成多页面应用,开发时能根据请求的终端返回不同的内容,应该怎么做呢?以下描述的是我尝试的一种方案,并且以 ...

最新文章

  1. 遇到的问题和解决方案
  2. SpringBoot+gradle+idea实现热部署和热加载
  3. Vim配置IDE开发环境
  4. 机器学习经典算法实践_服务机器学习算法的系统设计-不同环境下管道的最佳实践
  5. paip.SVN merge分支合并到主干
  6. 谷粒学院项目总结(持续更新)
  7. 开源和互联网是天生的一对好基友
  8. DAMO在启动或初始化时可能会挂起
  9. 芯片制作 | 和我一起来卷芯片
  10. 游戏玩到这种程度,酱紫真的好吗?
  11. 语音识别_ML-KWS-for-MCU_资料整理
  12. bzoj1778 驱赶猪猡/luogu2937 赶小猪
  13. 看片神器人人视频APP突遭下架:上亿用户慌了!
  14. 汽车抵质押贷款系统-押品评估、登记、入库、出库、处理等标准化流程管理
  15. 独角兽项目 8 - 了解产品
  16. mysql实现layui分页_LayUI
  17. 初学python:Python 3的下载、安装、第一个程序(Helloworld.py)与卸载
  18. html css点击展开列表,html+js+css实现点击展开显示
  19. 铁轨巡检机器人_上海试点轨道智能巡检机器人
  20. java字符串截取遇到的字符,java 截取字符串遇到的有关问题

热门文章

  1. 公司封了MSN怎么办(Web版MSN解决方案)
  2. 程序员在就业时专科和本科学历有什么区别
  3. mysql建立数据浏览器_一个简单的MySQL数据浏览器_php
  4. java浏览器最大化,JavaScript:完全容错和浏览器自动最大化_js
  5. 测试输入框常用特殊字符类别
  6. 荣耀waterplay鸿蒙,【荣耀Waterplay】不只是防水那么简单。
  7. OpenCv人脸贴画
  8. 第13周项目3-Dijkstra算法的验证
  9. php 全局变量 $global 跨文件,PHPGlobal全局变量 - 米扑博客
  10. 【编码】csv文件打开是乱码