【问题标题】:Express Morgan not writing logs to file or STDOUTExpress Morgan 没有将日志写入文件或 STDOUT
【发布时间】:2016-06-24 14:05:03
【问题描述】:

我有一个要添加日志记录的 Express 应用程序。我安装了 Morgan 并在管理我的 API 调用的文件中设置了中间件:

/src/api/calls.js

morgan 中间件设置为将日志记录结果发送到文件:errors.txt

    var express = require('express'),
        app = express(),
        dbConfig = require('../config/db.config'),
        connectToMongo = require('./db.js'),
        bodyParser = require("body-parser"),
        ObjectId = require('mongodb').ObjectID,
        morgan = require('morgan'),
        fs = require('fs'),
        Sb;

    //middleware
    var accessLogStream = fs.createWriteStream('../sample/errors.txt', {flags: 'a'})
    app.use(morgan('combined',  {stream: accessLogStream}));

    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
      next();
    });
    app.use(bodyParser.urlencoded({ extended: true }));

module.exports = function apiRoutes(app) {
  app.get("/v1/api/sample/:call", function(req, res, next) {
     //route db calls and code here
  });
}

/app.js

app.js 文件中需要 api 路由并调用 apiRoutes 函数:

var express = require('express');
var app = express();
var config = require('./src/config/server.config');
//api and server
var http = require('http');
var server = new http.Server(app);

//load the api calls for the server
var apiRoutes = require('./src/api/calls.js');
apiRoutes(app);

问题是 - 当我将代码更改为简单的 STDOUT 时,我没有将任何日志数据写入我的 errors.txt 文件甚至控制台中。我在这里想念什么?

【问题讨论】:

    标签: node.js express logging


    【解决方案1】:

    我想通了 - 日志记录代码需要位于 app.js 文件中,而不是包含 api 调用的文件中。我知道日志记录代码需要成为第一个中间件,但我没有意识到它需要在服务器的新实例被实例化之后立即出现。

    var express = require('express'),
        app = express(),
        config = require('./src/config/server.config'),
        morgan = require('morgan'),
        fs = require('fs'),
    //api and server
        http = require('http'),
        server = new http.Server(app); 
    
    //set up the logger
    var accessLogStream = fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})
    app.use(morgan('combined',  {"stream": accessLogStream}));
    
    
    //load the api calls for the server
    var apiRoutes = require('./src/api/calls.js');
    apiRoutes(app);
    

    【讨论】:

    • 完全正确。我遇到了同样的问题,您的解决方案节省了我的时间。谢谢!
    • 如果你有app.use(morgan('combined', {"stream": accessLogStream})); 之前 new http.Server(app);
    【解决方案2】:

    当使用 express 时,它适用于我

    app.use(morgan('dev'));
    

    【讨论】:

      【解决方案3】:

      如果您从 VS Code 运行/调试 Node 代码,那么这个问题是由 VS Code 引起的。

      Morgan 通过process.stdout.write 写入控制台,VS Code 的调试控制台 不支持。 调试控制台 将仅显示通过console.log 编写的内容。

      有两种方法可以解决此问题。两者都包括将整体添加到launch.json

      • 第一个解决方案 - 添加"console": "integratedTerminal"
      • 第二个解决方案 - 添加"outputCapture": "std"(不尊重日志颜色)

      我在这里找到了这个解决方案:

      【讨论】:

        【解决方案4】:

        就我而言,当我将以下代码移至 app.js 文件的开头时,它开始工作:

        app.use(logger('combined'));
        app.use(logger('common', {
            stream: fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})
        }));
        

        由于某种原因,当这是在文件的开头时:

        app.use(logger('combined'));
        

        这是最后:

        app.use(logger('common', {
            stream: fs.createWriteStream(__dirname + '/access.log', {flags: 'a'})
        }));
        

        然后它没有工作。我不知道为什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-06
          • 2017-05-17
          • 2021-04-26
          • 2022-07-06
          相关资源
          最近更新 更多