Winston未在Google Cloud Compute Engine上托管的Node.js应用程序的产品版本中记录事件

Winston未在Google Cloud Compute Engine上托管的Node.js应用程序的产品版本中记录事件,node.js,google-app-engine,logging,google-compute-engine,winston,Node.js,Google App Engine,Logging,Google Compute Engine,Winston,我正在使用winston在我的应用程序中记录一些事件。当我在本地使用node app.js运行代码时,winston会很好地记录事件。但当我将代码推送到服务器时(gcloud preview app deploy app.yaml),甚至在本地生产环境中运行它(gcloud preview app run app.yaml),它不会记录任何事件。winston在本地创建general.log和request.log,并根据需要对其进行编辑,但在生产模式下不执行任何操作 这是我的logging.j

我正在使用winston在我的应用程序中记录一些事件。当我在本地使用
node app.js
运行代码时,winston会很好地记录事件。但当我将代码推送到服务器时(
gcloud preview app deploy app.yaml
),甚至在本地生产环境中运行它(
gcloud preview app run app.yaml
),它不会记录任何事件。winston在本地创建
general.log
request.log
,并根据需要对其进行编辑,但在生产模式下不执行任何操作

这是我的logging.js代码

"use strict";

var fs = require('fs');
var path = require('path');
var winston = require('winston');
var expressWinston = require('express-winston');


module.exports = function(logPath) {

  // Create logging directory if necessary.
  if (!fs.existsSync(logPath)) {
    fs.mkdirSync(logPath);
  }


  /*
    Logger to capture all requests and output them to the console
    as well as request.log.
  */
  // [START requests]
  var requestLogger = expressWinston.logger({
    transports: [
      new winston.transports.Console({
        json: false
      }),
      new winston.transports.File({
        filename: path.join(logPath, 'request.log'),
      })
    ],
    expressFormat: true
  });
  // [END requests]


  /*
    Logger to capture any top-level errors from requests and
    output them in error.log
  */
  // [START errors]
  var errorLogger = expressWinston.errorLogger({
    transports: [
      new winston.transports.Console({
        json: false
      }),
      new winston.transports.File({
        filename: path.join(logPath, 'error.log'),
      })
    ]
  });
  // [END errors]


  /*
    General logger used for .log, .info, etc. Outputs all logs
    to the console as well as general.log.
  */
  // [START general]
  winston.add(winston.transports.File, {
    filename: path.join(logPath, 'general.log')
  });
  // [END general]


  return {
    requestLogger: requestLogger,
    errorLogger: errorLogger,
    error: winston.error,
    warn: winston.warn,
    info: winston.info,
    log: winston.log,
    verbose: winston.verbose,
    debug: winston.debug,
    silly: winston.silly
  };

};
下面是我在app.js中记录的一个示例(不重要)事件,用于测试目的

var logging = require('./lib/logging')(process.env.LOG_PATH || './');
app.use(logging.requestLogger);
app.use(logging.errorLogger);
logging.info("Sample test log");
为什么这段代码不能在生产模式下工作

我按照这里的步骤设置了这个代码


您的NodeJ实际上是在Google Compute Engine托管虚拟机上的Docker容器中运行的

您必须使用SSH连接到托管VM并连接到容器

sudo docker ps

这将输出4个容器: gunicornnginx用于代理,fluentd是登录到应用程序引擎的连接器,最后npm start是您的节点应用程序

sudo docker exec -it <ID of the container running npm start> bash
sudo docker exec-it bash
这会在容器上给出提示,您应该能够从那里看到日志文件。
请注意,如果您想在App Engine Web控制台上查看日志(您应该将这些文件放在文件夹“/var/log/App\u Engine/custom\u logs/*.log”中)


在我写这篇文章的时候,在谷歌云上创建和查看日志确实不容易。 我想建议您在使用谷歌云时使用另一种登录方式。您可能想尝试使用winston和papertrail

您可以使用
winston express
winston papertrail
节点模块记录您的请求。papertrail提供了丰富多彩的界面,可以快速分析日志


查看有关如何配置的详细信息。

谢谢!我使用SSH连接到我的实例并尝试导航到custom_logs目录。但路径如下:'/var/log/app_engine/app/custom_logs/*.log',当我使用该路径运行时,应用程序会中断,当我使用您提供的路径运行时,不会发生任何事情,是的,我想查看我的日志在Web控制台中。默认情况下,文件夹“custom_logs”不存在,但我认为您在调用记录器时创建了它。您提供的日志路径是什么?它应该是“/var/log/app_engine/custom_logs/”