百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

nodejs之日志记录 node 日志框架

qiyuwang 2024-10-31 15:52 33 浏览 0 评论

前言

近期有新的项目上线,基于nodejs的前后端分离方案,借此机会又顺便深入学习了一下nodejs服务日志记录相关的问题和注意点。对于前端开发人员来讲,如果你的开发工作不涉及服务端的话对日志没有太多概念,尤其是一个服务的运行日志。虽然现在前端(客户端层面)也会涉及一些比如js运行异常日志的收集,但最终还是会上报到后台系统,所以,如果你的开发工作涉及后端服务,如何更合理的记录日志是非常有必要学习和运用的。

原则

首先,要知道记录日志是为了方便我们追踪服务运行状态,在服务出现异常波动时定位问题,什么时候需要记录,记录什么信息,记录什么级别,怎么去分类,这些至关重要。我认为要遵循以下几个要点:

  • 分类,要合理的进行日志分类,以方便定位问题的所在范围;
  • 错误及时记录,有预期的调用错误或者运行错误要及时记录;
  • 重要信息记录,一些重要的接口调用要记录,如接口响应时间;
  • 减少非必要的记录,每一次的输出都有IO操作,不能因日志影响性能;

log4js

log4js是java语言中常用的log4j日志组件的 nodejs版,其支持 日志分级,日志分类,日志落盘,配置简单易上手,是近些年大家常用的日志记录模块。

日志等级


{

ALL: new Level(Number.MIN_VALUE, 'ALL', 'grey'),

TRACE: new Level(5000, 'TRACE', 'blue'),

DEBUG: new Level(10000, 'DEBUG', 'cyan'),

INFO: new Level(20000, 'INFO', 'green'),

WARN: new Level(30000, 'WARN', 'yellow'),

ERROR: new Level(40000, 'ERROR', 'red'),

FATAL: new Level(50000, 'FATAL', 'magenta'),

MARK: new Level(9007199254740992, 'MARK', 'grey'),

OFF: new Level(Number.MAX_VALUE, 'OFF', 'grey')

}

以上是日志等级的图示,权限代码和输出颜色,>=所设定的等级日志才会被输出,我们在使用时要根据自己的需求配置。

日志分类

除了设定等级,为了方便我们查阅日志,还需要进行日志分类,log4js 2.0之后 categories和 appenders 需要组合配置,我在项目中分类配置如下:

appenders:{

"rule-console": {"type": "console"},

"errorLogger": {

//设置类型为 dateFile

"type": "dateFile",

// 配置文件罗盘地址并且名为 app_error.log

"filename": "/data/logs/app_error.log",

// 指定编码格式为 utf-8

"encoding":"utf-8",

// 单文件的大小,超过会创建新的文件

"maxLogSize": 104800,

//保留最新的文件数

"backups": 5,

//设置日志输出格式

"layout":{

"type": 'pattern',

"pattern": '%h %d{yyyy-MM-dd hh:mm:ss} | %p | %z | %c | %m%n'

}

},

"infoLogger": {

"type": "dateFile",

"filename": "/data/logs/app_info.log",

"encoding":"utf-8",

"maxLogSize": 104800,

"backups": 5,

"layout":{

"type": 'pattern',

"pattern": '%h %d{yyyy-MM-dd hh:mm:ss} | %p | %z | %c | %m%n'

}

}

},

categories: {

"default": {"appenders": ["rule-console"], "level": "all"},

"infoLogger": {"appenders": ["infoLogger"], "level": "info"},

"errorLogger": {"appenders": ["errorLogger"], "level": "error"}

}

layout

上述配置中layout 是定义日志输出的具体字段和格式,这个要根据自己实际情况去约定,下面列出pattern 中的具体解释:

  1. %r 日志输出时间,以 toLocaleTimeString 函数格式化
  2. %p 日志等级
  3. %c 日志分类
  4. %h 访问计算机的 hostname
  5. %m 打印的日志主题内容
  6. %n 换行标识
  7. %d 日志输出日期 ( 默认以 ISO8601 方式格式化 )可自定义输出类型 %d{yyyy-MM-dd hh: mm:ss},输出 2020-12-01 15:42:18
  8. %z 记录进程 pid 号 ( 数据来自 node 方法 process.pid )
  9. %x{} 输出自定义 tokens 中的项目,例如上述例子中的 user
  10. %[ 想要输出的内容 %] 用来给被扩起来的内容着色,颜色和日志 level 有关

注意点

上述配置在启动单进程时可正常输出日志,但是如果你是通过pm2 启动集群(Cluster)模式,日志会有丢失现象,原因是 Log4js 在 Cluster 模式下,worker 将日志发送至 master,master 实现日志写入文件。但在 PM2 Cluster 模式下,所有进程皆为 worker,log4官方给出了解释和解决办法:

  • pm2 (boolean) (optional) - set this to true if you’re running your app using pm2, otherwise logs will not work (you’ll also need to install pm2-intercom as pm2 module: pm2 install pm2-intercom)
  • pm2InstanceVar (string) (optional, defaults to ‘NODE_APP_INSTANCE’) - set this if you’re using pm2 and have changed the default name of the NODE_APP_INSTANCE variable.

我们需要安装 pm2-intercom ,在配置中增加配置如下即可解决

Log4JS.configure({

pm2: true,

pm2InstanceVar: 'INSTANCE_ID'

});

完成以上配置后,我们还需要封装一个日志工具方法,供具体业务代码中调用,以下是我封装后的:


const log4js = require('log4js')

const config = require('../../config');


log4js.configure(config.log4js);


//调用预先定义的日志名称

let errorLogger = log4js.getLogger('errorLogger');

let infoLogger = log4js.getLogger('infoLogger');


let logger = {};


//getIp

const getIp = function(req) {

let ip = req.headers['x-real-ip'] ||

req.headers['x-forwarded-for'] ||

req.socket.remoteAddress || '';

if(ip.split(',').length>0){

ip = ip.split(',')[0];

}

return ip;

};


//封装错误日志,包含 ctx 信息

logger.logError = (ctx, err) => {

let logText = new String();

if(ctx && ctx.request){

//客户端ip

logText += getIp(ctx.request) +" | ";

//访问方法 + 地址

logText += ctx.request.method +" | "+ctx.request.originalUrl+' | ';

}

//错误信息

logText += "errInfo [" + err.name +" , "+err.message+" , "+err.stack+ "] ";

errorLogger.error(logText);

}

//Error日志,记录必要错误信息

logger.error = (info, err) => {

errorLogger.error(info + " , errInfo [" + err.name +" , "+err.message+" , "+err.stack+ "] ");

}

//封装访问日志

logger.logAccess = (ctx, resTime) => {

if(ctx && ctx.request){

let logText = new String();

//客户端ip

logText += getIp(ctx.request);

//访问方法 + 地址

logText += ' | '+ctx.request.method +" | "+ctx.request.originalUrl;

//请求状态

logText += ' | '+ctx.status;

//响应时间

logText += ' | '+resTime + "ms";

//userAgent

logText += ' | '+JSON.stringify(ctx.request.header['user-agent']);

if(ctx.status !== 200){

//请求参数

if (ctx.request.method !== 'GET') {

logText += ' | ' + 'request body [' + JSON.stringify(ctx.request.body)+']';

}

}

infoLogger.info(logText);

}

}

//info日志,记录必要信息

logger.info = (info) => {

if (info){

infoLogger.info(info);

}

}

module.exports = logger;

小结

本文主要记录了我在项目中使用的日志工具和具体配置方法,在生产环境中还是需要多关注服务本身的性能,不能因记录日志影响了服务性能,log4是我目前使用的,可能你在使用其他工具或者有更好的实践经验,欢迎跟我一起分享讨论。

相关推荐

基于Docker方式安装与部署Camunda流程引擎

1Camunda简介官网:https://docs.camunda.org/manual/7.19/installation/docker/Camunda是一个轻量级、开源且高度灵活的工作流和决策自...

宝塔Linux面板如何部署Java项目?(宝塔面板 linux)

通过宝塔面板部署Java还是很方便的,至少不需要自己输入tomcat之类的安装命令了。在部署java项目前,我还是先说下目前的系统环境,如果和我的系统环境不一样,导致部署不成功,那你可能需要去找其他资...

浪潮服务器如何用IPMI安装Linux系统

【注意事项】此处以浪潮服务器为例进行演示所需使用的软件:Chrome浏览器个人PC中需要预先安装java,推荐使用jdk-8u181-windows-x64.exe【操作步骤】1、在服务器的BIOS中...

Centos7环境Hadoop3集群搭建(hadoop集群环境搭建实验报告)

由于项目需要存储历史业务数据,经过评估数据量会达到100亿以上,在原有mongodb集群和ES集群基础上,需要搭建Hbase集群进行调研,所以首先总结一下Hadoop集群的搭建过程。一、三个节点的集群...

Hadoop高可用集群搭建及API调用(hadoop高可用原理)

NameNodeHA背景在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNo...

使用Wordpress搭建一个属于自己的网站

现在开源的博客很多,但是考虑到wordpress对网站的seo做的很好,插件也多。并且全世界流量排名前1000万的网站有33.4%是用Wordpress搭建的!所以尝试用Wordpress搭建一个网站...

Centos 安装 Jenkins(centos 安装ssh)

1、Java安装查看系统是否已安装Javayumlistinstalled|grepjava...

Java教程:gitlab-使用入门(java中的git)

1导读本教程主要讲解了GitLab在项目的环境搭建和基本的使用,可以帮助大家在企业中能够自主搭建GitLab服务,并且可以GitLab中的组、权限、项目自主操作...

Dockerfile部署Java项目(docker部署java应用)

1、概述本文主要会简单介绍什么是Docker,什么是Dockerfile,如何安装Docker,Dockerfile如何编写,如何通过Dockerfile安装jar包并外置yaml文件以及如何通过do...

如何在Eclipse中搭建Zabbix源码的调试和开发环境

Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...

Java路径-02-Java环境配置(java环境搭建及配置教程)

1Window环境配置1.1下载...

35.Centos中安装python和web.py框架

文章目录前言1.Centos7python:2.Centos8python:3.进行下载web.py框架然后应用:4.安装好之后进行验证:5.总结:前言...

《我的世界》服务器搭建(我的世界服务器如何搭建)

1.CentOS7环境1.1更改YUM源#下载YUM源文件curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com...

CentOS 7 升级 GCC 版本(centos7.4升级7.5)

1.GCC工具介绍GCC编译器:...

Linux安装Nginx详细教程(linux安装配置nginx)

环境准备1.因为Nginx依赖于gcc的编译环境,所以,需要安装编译环境来使Nginx能够编译起来。命令:yuminstallgcc-c++显示完毕,表示安装完成:2.Nginx的http模块需要...

取消回复欢迎 发表评论: