在开发 Node.js 应用程序时,记录日志是非常重要的。通过记录应用程序运行过程中的信息,我们可以更好地追踪错误,调试程序,并提高代码质量。在实际应用中,我们通常会使用 PM2 进行 Node.js 应用程序的部署和管理。本文将介绍如何使用 PM2 自定义 Node.js 应用程序的日志输出,从而更好地掌握日志记录的技巧。
什么是 PM2?
PM2 是一个 Node.js 进程管理器,可用于管理应用程序进程,以及集群模式下的负载均衡等。PM2 可以帮助我们方便地部署、启动、停止、重启 Node.js 应用程序,并提供可视化的进程监控和日志记录等功能。PM2 的使用非常广泛,是一个非常优秀的 Node.js 应用程序管理工具。
PM2 自定义日志输出
默认情况下,PM2 会将 Node.js 应用程序的日志输出到标准输出流(stdout)和标准错误流(stderr)。可以通过以下命令查看 PM2 进程的日志输出:
pm2 logs
通过 pm2 logs 命令会在终端上输出应用程序的日志信息。但这种方式往往不够灵活,我们可能需要将日志输出到文件中,从而方便存档和管理。PM2 提供了丰富的自定义日志输出选项,可以实现各种不同类型的日志记录需求。
简单日志输出
首先,我们来看一下如何将 PM2 应用程序的日志输出到文件中。可以通过以下命令将日志输出到指定文件中:
pm2 start app.js -o ./out.log -e ./err.log
其中,-o 指定标准输出日志文件名,-e 指定标准错误日志文件名。这样,PM2 会将应用程序的日志输出到对应的文件中,而不是终端上。
复杂日志输出
在实际应用中,可能需要更加复杂的日志记录方式,比如按照时间或者请求来源进行分类、分级别记录日志等。PM2 也提供了非常强大的日志自定义功能,可以实现各种自定义的日志记录需求。
分类日志输出
假设我们有两个不同的请求来源,需要将它们的日志输出到不同的日志文件中。可以通过以下代码实现:
// www.javascriptcn.com code example
var pm2 = require('pm2');
var util = require('util');
var fs = require('fs');
var path = require('path');
pm2.connect(function(err) {
if (err) {
console.error(err);
process.exit(2);
}
const appname1 = 'app1';
const appname2 = 'app2';
pm2.start({
name: appname1,
script: 'app1.js',
args: []
}, function(err, proc1) {
if(err) throw err;
pm2.start({
name: appname2,
script: 'app2.js',
args: []
}, function(err, proc2) {
if(err) throw err;
const logdir = './logs';
if (!fs.existsSync(logdir)) {
fs.mkdirSync(logdir);
}
const logpath1 = path.join(logdir, `${appname1}.log`);
const logpath2 = path.join(logdir, `${appname2}.log`);
proc1.pm2_env.log_date_format = 'YYYY-MM-DDTHH:mm:ss';
proc1.pm2_env.log_type = `${appname1}-out`;
proc1.pm2_env.log_file = logpath1;
proc2.pm2_env.log_date_format = 'YYYY-MM-DDTHH:mm:ss';
proc2.pm2_env.log_type = `${appname2}-out`;
proc2.pm2_env.log_file = logpath2;
console.log(`${appname1} and ${appname2} started.`);
pm2.disconnect();
});
});
});在上述代码中,我们分别使用 pm2.start() 方法启动两个不同的 Node.js 应用程序,分别记录不同的日志。在启动应用程序之前,我们可以通过 proc1.pm2_env 和 proc2.pm2_env 对象,设置日志输出的相关参数,包括日期格式、日志类型和日志文件路径等。在本例中,我们将 app1 的标准输出日志输出到 ./logs/app1.log 中,将 app2 的标准输出日志输出到 ./logs/app2.log 中。
日志分级输出
除了按照来源分类输出日志,我们还可以按照日志级别进行分类输出。可以通过以下代码实现:
// www.javascriptcn.com code example
var pm2 = require('pm2');
var util = require('util');
var fs = require('fs');
var path = require('path');
pm2.connect(function(err) {
if (err) {
console.error(err);
process.exit(2);
}
const appname = 'app';
pm2.start({
name: appname,
script: 'app.js',
args: []
}, function(err, proc) {
if(err) throw err;
const logdir = './logs';
if (!fs.existsSync(logdir)) {
fs.mkdirSync(logdir);
}
const logpath = (level) => path.join(logdir, `${appname}-${level}.log`);
proc.pm2_env.log_date_format = 'YYYY-MM-DDTHH:mm:ss';
proc.pm2_env.log_type = 'out';
proc.pm2_env.log_file = logpath('debug');
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
error: { type: 'file', filename: logpath('error') },
warn: { type: 'file', filename: logpath('warn') },
info: { type: 'file', filename: logpath('info') },
debug: { type: 'file', filename: logpath('debug') }
},
categories: {
default: { appenders: ['out'], level: 'debug' },
error: { appenders: ['error'], level: 'error' },
warn: { appenders: ['warn'], level: 'warn' },
info: { appenders: ['info'], level: 'info' },
debug: { appenders: ['debug'], level: 'debug' }
}
});
const logger = log4js.getLogger('default');
logger.error('this is an error message');
logger.warn('this is a warning message');
logger.info('this is an info message');
logger.debug('this is a debug message');
pm2.disconnect();
});
});在上述代码中,我们使用了 log4js 模块,对不同级别的日志进行分类记录。同时,我们使用 PM2 的标准输出日志记录 debug 级别的日志。这样,我们可以实现按照日志级别进行分类输出的功能。
小结
通过上述介绍,我们可以看到 PM2 提供了丰富的自定义日志输出选项,可以方便地实现不同的日志记录需求。在实际应用中,我们应该根据具体情况选择合适的日志输出方式,提高应用程序的可管理性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d004d2e46428fe9ec80f95