【问题标题】:winston-mongodb log connection failswinston-mongodb 日志连接失败
【发布时间】:2015-02-15 12:43:49
【问题描述】:

我的 express web 应用使用 Winston 进行日志记录,并且使用 winston-mongodb 将日志保存到 mongolab 托管的 mongoDB(副本集)。

这几天一切正常,然后当流量增加一点时,日志就停止保存/连接到数据库。不幸的是,这意味着我没有日志可以检查出了什么问题——这是一个令人沮丧的情况。其他一切仍然正常 - 其他集合(如用户)正在正确保存和更新,服务器已启动。

我尝试重新部署/重新启动服务器无济于事,日志不会再次开始记录。我怀疑我的服务器/记录器设置存在一些细微的问题,可能是与数据库连接相关的竞争条件,但我现在真的迷路了。代码如下:

//server.js (simplified required modules - only ones possibly relevant to question)
var express = require( 'express' );
var session = require('express-session');
var methodOverride = require('method-override');
var cookieParser = require('cookie-parser');
var mongoose = require( 'mongoose' );
var uriUtil = require('mongodb-uri');
var config = require('config');
var bodyParser = require('body-parser');
var MongoStore = require('connect-mongostore')(session);
var logger = require('./logs/logger.js'); 

// DATABASE CONNECT

var options = { server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, 
                replset: { socketOptions: { keepAlive: 1, connectTimeoutMS : 30000 } } }; 

var mongodbUri = "mongodb://<user>:<pw>@ds012345-a0.mongolab.com:12345,ds012345-a1.mongolab.com:12345/<db>"

//use mongo-uri to make sure url is in the correct format
var mongooseUri = uriUtil.formatMongoose(mongodbUri);               

mongoose.connect(mongooseUri, options);

var conn = mongoose.connection;

// __Create server__
var app = express();

conn.on('open', function(e) {

    var sessionStore = new MongoStore({ mongooseConnection: mongoose.connections[0] });

    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({extended: false}));  
    app.use(methodOverride()); 

    app.use(cookieParser()); 
    app.use(session({
      store: sessionStore,
      secret: config.session.secret,
      cookie: {
        maxAge: config.session.maxage,
        httpOnly: true, 
        secure: false
        //If I set 'secure:true', it prevents the session from working properly.
      },
      saveUninitialized: true,
      resave: true
    })); 

    app.use(passport.initialize());
    app.use(passport.session());

    app.use( express.static( path.join( __dirname, 'site') ) );

    //Routes
    app.use('/api/forgot', controllers.forgotpw);
    //etc.

});

conn.on('connected', function(){

//Start server

    app.listen(config.port, function() {
        logger.info( 'Express server listening on port %d in %s mode', config.port, app.settings.env );
        logger.info(process.env.NODE_ENV);
    });
});

//logger.js

var winston = require('winston');
var config = require('config');
require('winston-mongodb').MongoDB;


if (process.env.NODE_ENV == 'production') {
    var winston = new (winston.Logger)({  
        transports: [
            new (winston.transports.Console)({ level: 'warn' }),
            new (winston.transports.MongoDB)({
                //db : 'atlas_database',
                level : 'debug',
                //ssl : true,
                dbUri : "mongodb://<user>:<pw>@ds012345-a0.mongolab.com:12345,ds012345-a1.mongolab.com:12345/<db>"
            })
        ]
    });

    winston.info('Chill Winston, the logs are being captured with production settings');
}


module.exports = winston; 

如果您对导致日志不再起作用的原因有任何想法,我们将不胜感激。

【问题讨论】:

    标签: mongodb express mongoose mlab nodejitsu


    【解决方案1】:

    当 Winston 与 Mongo 实例建立连接时,它会专门查找 replicaSet 标志以确定连接是否为副本集。否则,它将连接到 dbUri 中的第一台主机。 (来源:https://github.com/indexzero/winston-mongodb/blob/master/lib/winston-mongodb.js#L28)

    要使用能够正确处理故障转移的连接配置 Winston,请使用以下 URI:

    dbUri : "mongodb://<user>:<pw>@ds012345-a0.mongolab.com:12345,ds012345-a1.mongolab.com:12345/<db>?replicaSet=<replsetname>"

    如果您想测试您的代码以验证它是否可以优雅地处理副本集故障转移,您可以使用此处描述的称为触发器的测试集群:http://mongolab.org/flip-flop/

    (完全披露:我为 MongoLab 工作。)

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 2018-06-20
      • 2017-02-11
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多