如何从cpanel启用node.js应用程序日志?

ddarikpa  于 2023-04-20  发布在  Node.js
关注(0)|答案(3)|浏览(117)

我有一个使用nodemailer发送电子邮件的node.js应用程序。它在本地主机上工作正常,但当我从服务器上尝试时,我收不到任何邮件。
由于,应用程序的其他活动工作正常意味着我假设nodemailer在服务器上安装正确.我尝试了两种方式使用主机作为我的服务器和使用gmail作为服务上.这里,是我上次尝试的.这在本地主机上也工作正常.但是,当我把这个放在服务器上时,我没有得到任何响应.
我有nodemailer的配置:

const output = `
    <h3>Limit Details</h3>
    <p>Admin has added ${limit} quota(s) to ${username}.</p>
  `;

  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    service: 'gmail',
    port: 25,
    secure: false, // true for 465, false for other ports
    auth: {
        user: '<gmail>', 
        pass: '<password>' 
    }
  });

  // setup email data with unicode symbols
  let mailOptions = {
      from: '"Sender" <sender gmail>', // sender address
      to: '<receiver gmail>', // list of receivers
      subject: 'Quota added information.', // Subject line
      html: output // html body
  };

  // send mail with defined transport object
  transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
          return console.log(error);
      }
      console.log('Message sent: %s', info.messageId);   
      console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
  });

为了测试,我已经控制了messageId和预览URL,那么,从哪里我可以在cpanel中查看此控制台消息?我如何在cpanel中从我的应用程序中查看此类控制台内容??

vi4fp9gy

vi4fp9gy1#

不幸的是,据我所知,在cpanel服务器上没有简单的方法来访问node的日志。我通常会设置log4js将日志写入文件:

const log4js = require('log4js');

log4js.configure({
  appenders: { everything: { type: 'file', filename: 'logs.log' } },
  categories: { default: { appenders: ['everything'], level: 'ALL' } }
});

const logger = log4js.getLogger();

然后,您可以使用以下命令创建日志:

logger.debug('log message');

您还可以使用服务器提供日志文件:

app.get('/log', (req, res) => {
  res.sendFile(path.join(__dirname + '/logs.log'));
});
uz75evzq

uz75evzq2#

cPanel的应用程序管理器不是很充实。我一直在尝试它,并将其与我习惯的(PM2)进行比较,并将切换回PM2。我确实向cPanel提出了一个功能请求,如果有人有兴趣支持。
否则,答案是使用自定义日志记录器,如@zenott建议的。然而,我更喜欢覆盖console.log,这样如果需要的话,很容易切换回常规的控制台日志记录。
我的解决方案:

const moment = require('moment')
const fs = require('fs')
let logStream = fs.createWriteStream('log.txt')
let console = {}
console.log = (obj) => {
  var s = ''
  if (typeof obj === 'string')
    s = obj
  else
    s = JSON.stringify(obj)

  var dS = '[' + moment().format(momentFormat) + '] '
  s = `[${dS}] ${s}'\n'`
  logStream.write(s)
}
xuo3flqw

xuo3flqw3#

有一种更简单的方法可以访问cPanel服务器上的NodeJS应用日志。而不是使用:

console.log()

用途:

console.error()

这将毫无保留地填充cPanel上NodeJS应用根文件夹中的stderr.log文件。它甚至可以输出Circular和JSON格式,而无需任何stringify()

更新:

以上仅在cPanel在CloudLinux上运行时有效(Setup NodeJS App可用)。
对于其他Distro(只有Application Manager可用),只需将以下内容粘贴到主App.js文件中:

const fs = require('fs');
const util = require('util');
const log_file = fs.createWriteStream(__dirname + '/debug.log', {flags: 'w'});
const log_stdout = process.stdout;

console.log = (d, e, f, g) => {
  log_file.write(util.format('LOG: ', d?d:'', e?e:'', f?f:'', g?g:'') + '\n');
  log_stdout.write(util.format('LOG: ', d?d:'', e?e:'', f?f:'', g?g:'') + '\n');
}

console.error = (d, e, f, g) => {
  log_file.write(util.format('ERROR: ', d?d:'', e?e:'', f?f:'', g?g:'') + '\n');
  log_stdout.write(util.format('ERROR: ', d?d:'', e?e:'', f?f:'', g?g:'') + '\n');
}

然后像往常一样在所有级联模块中使用console.log()。这将创建并填充位于NodeJS应用根文件夹中的debug.log文件。您也可以使用console.trace()来获取错误的行号。使用终端中的tail -f debug.log命令进行实时日志记录。

相关问题