当前位置: 首页 > 后端技术 > Node.js

搭建节点服务(一):日志处理

时间:2023-04-03 13:00:27 Node.js

对于一个应用来说,日志记录是非常重要的。日志可以帮助开发者快速定位线上问题,定制解决方案;日志中包含大量的用户信息,通过日志分析可以获取用户行为、兴趣爱好等信息。通过这些信息,可以获得用户画像,为公司战略的制定提供支持。参考。本文将介绍如何在节点服务中处理日志。一、技术选择选择三种主流技术进行对比:1.1log4jslog4js是一个节点日志管理工具,可以将自定义格式的日志输出到各种渠道。对于控制台的日志输出,可以对日志进行彩色显示,对于文件格式的日志输出,可以根据文件大小或者日期对日志进行裁剪。熟悉java的开发者会发现log4js与java常用的日志记录工具log4j非常相似。没错,log4js就是log4j的JavaScript版本,使用方法也差不多。1.2winstonWinston也是一款非常流行的节点日志管理工具,支持多路传输。默认输出格式为json,也可以自定义输出格式。如果要拆分日志,还需要使用winston-daily-rotate-file模块。1.3PM2PM2实际上是一个节点进程管理工具,具有性能监控、进程守护、负载均衡、日志管理等功能。使用PM2进行日志管理,只需要在项目中添加控制台方法调用,无需额外添加代码。切割日志需要使用pm2-logrotate。由于团队内部很多服务器系统都是基于java的,所以这些系统大多使用log4j来生成日志。日志管理相关的日志采集系统和日志查询系统可以更好的支持log4j格式的日志,所以最终选择了log4j的javascript版本log4js来生成日志。下面将介绍log4js的基本使用。2.基本概念2.1日志级别log4js默认的日志级别分为9个级别,按照优先级从低到高排列如下:ALL{logger.info(`服务器运行在端口${port}`);});3.3日志格式log4js通过layout设置日志格式,内置的layout包括:basic日志基本格式包括时间戳、日志级别、日志类型colored格式和basic一致,只是不同级别的日志显示颜色不同dummy只输出第一个参数Content,不输出时间戳、日志级别、日志分类等信息pattern可以自定义格式的布局示例:默认日志格式:[2020-04-01T11:33:43.317][INFO]default-Serverrunningonport3000customThelogformatof:2020-04-0111:33:43.317[INFO]Serverrunningonport3000代码://自定义日志格式constlayout={type:'pattern',pattern:'%d{yyyy-MM-ddhh:mm:ss.SSS}[%p]%m'};log4js.configure({appenders:{//console输出console:{type:'console'},//日志文件,通过settinglayout设置Logformatfile:{type:'file',filename:path.join(__dirname,'../../logs/server.log'),layout}},categories:{//默认日志default:{appenders:['file','console'],level:'debug'},}});3.4日志切割如果所有的日志都输出到一个文件中,日志文件会越来越大,导致log备份和查看很不方便。通过将appender指定为dateFile类型,可以按日期对日志进行切分。//日志配置log4js.configure({appenders:{//控制台输出console:{type:'console'},//日志文件file:{type:'dateFile',filename:path.join(__dirname,'../../logs/server.log'),//日志切割后的文件名后缀格式pattern:'.yyyy-MM-dd'}},categories:{//默认日志default:{appenders:['file','控制台'],级别:'调试'},}});如果服务是4月1日部署的,日志会输出到service.log文件,4月2日service.log会重命名为server.log.2020-04-01,然后新建service.log文件,新的日志会继续输出到service.log文件中。3.5输出多个文件下面的例子不仅将完整的日志输出到server.log,还将错误级别及以上的日志输出到server-error.log。util/log4jsLogger.jsconstpath=require('path');constlog4js=require('log4js');//配置log4jslog4js.configure({appenders:{//控制台输出console:{type:'console'},//所有日志文件allFile:{type:'file',filename:path.join(__dirname,'../../logs/server.log')},//错误日志文件errorFile:{type:'file',filename:path.join(__dirname,'../../logs/server-error.log')}},categories:{//默认日志,输出调试级别及以上日志default:{appenders:['allFile','console'],level:'debug'},//错误日志,输出错误级别及以上的日志error:{appenders:['errorFile'],level:'error'},}});//获取默认日志constdefaultLogger=log4js.getLogger();//获取错误级别日志consterrorLogger=log4js.getLogger('error');//日志代理,同时调用默认日志和错误日志constloggerProxy={};constlevels=log4js.levels.levels;levels.forEach(level=>{constcurLevel=level.levelStr.toLowerCase();loggerProxy[curLevel]=(...params)=>{defaultLogger[curLevel](...参数);errorLogger[curLevel](...参数);}});module.exports=loggerProxy;3.6重写控制台,因为log4js需要调用logger.debug,logger.info,logger。warn、logger.error等方法,对于已经调用console方法输出日志的项目,全部改成调用logger方法,改起来很麻烦。可以通过重写控制台方法使用log4js输出日志/***创建日志代理方法*@paramlogLevel日志级别*@paramloggerlogobject*@return{function}*/functioncreateLogProxy(logLevel,logger){return(...param)=>{logger[logLevel](...param);};}console.log=createLogProxy('debug',logger);console.info=createLogProxy('info',logger);console.warn=createLogProxy('warn',logger);console.error=createLogProxy('错误',记录器);为了保证所有的日志都能输出到日志文件中,应该尽快获取logger对象并重写console方法。4.小结本章介绍了log4js的基本使用,并给出了常用函数的例子。想了解更多log4js功能,请参考log4js官网:https://log4js-node.github.io...。另外,本文相关代码已提交GitHub参考,项目地址:https://github.com/liulinsp/n...。