【问题标题】:How to archive log files after they reach certain size limit in Node JS using winston?使用winston在Node JS中达到一定大小限制后如何归档日志文件?
【发布时间】:2016-06-15 11:49:26
【问题描述】:

我是 Node JS 的新手。我一直在寻找 Node 的日志库,然后我找到了 Winston。现在,我想在日志文件达到一定大小并在名称中包含时间戳后归档它们。

例如:

当前日志文件:logs/devlog.log(10 MB)

因为它达到了 10 MB,我想存档它

归档日志文件:Archive/devlog-03.02.2016.log

请帮助我在温斯顿或任何其他解决方案中做到这一点。提前致谢

我的 app.js(节点服务器)代码:

    console.log('Hello world');
var winston = require('winston');
var date1 = new Date();
winston.emitErrs = true;
var date = new Date();
var loggerName = "server.app.js";
var winston = require('winston'),
path = require('path'),
transports = [];

transports.push(new winston.transports.DailyRotateFile({
    name: 'file',
    datePattern: '.yyyy-MM-ddTHH-mm',
    filename: path.join(__dirname, "logs", "log_file.log"),
    maxFiles: 5,
    maxsize: 100000000
}));

var logger = new winston.Logger({ transports: transports });
//winston.loggers.add('ServerLogger', {
//    transports: [
//        new (winston.transports.File)({
//            name: 'Devlogger', //Name of the transport
//            filename: 'logs/devlogNormalF.log', // log file name
//            json: false,
//            maxsize: 1048576, //1MB
//            maxFiles: 10, // 10 Files max
//            timestamp: function () {
//                return new Date().toISOString();//.substring(0,23);
//            }
//        }
//        ), new archiveFile(options)
//    ]
//});
//var logger = winston.loggers.get('ServerLogger');
logger.info ('Logger Name: '+loggerName+' App starting...');
logger.info('Logger Name: ' + loggerName + 'Hello world');
logger.info('Logger Name: ' + loggerName + ' Accessing test/user');
logger.error('Logger Name: ' + loggerName + ' Cannot access test/user/user.png');
var express = require('express');
var app = express();
app.get('/', function (req, res) {
    res.send('Hello World!');
    var date2 = new Date();
    var diff = date2 - date1;
    logger.info('Start '+ date1+' Stop '+date2)
    logger.info('Logger Name: ' + loggerName + ' Response time of Node is ' + diff+' ms');
});

app.listen(3000, function () {
    logger.warn('Logger Name: ' + loggerName + ' Example app listening on port 3000!');
    logger.info('Logger Name: ' + loggerName + ' App ending...');
});

【问题讨论】:

    标签: node.js express logging archive winston


    【解决方案1】:

    Winston 支持使用日期模式进行日志轮换。
    您可以像这样指定 datepattern、maxfilesize 和 maxfile:

    var winston     = require ('winston'),
        path        = require ('path'),
        transports  = [];
    
    transports.push(new winston.transports.DailyRotateFile({
      name: 'file',
      datePattern: '.yyyy-MM-ddTHH-mm',
      filename: path.join(__dirname, "logs", "log_file.log"),
      maxFiles: 5,
      maxsize: 100000000
    
    }));
    
    var logger = new winston.Logger({transports: transports});
    

    我对您的代码进行了一些更改。我对其进行了测试,它工作正常。它使用日期模式创建日志。

     console.log('Hello world');
    var date1 = new Date();
    var date = new Date();
    var loggerName = "server.app.js";
    var winston = require('winston');
    var logger = new (winston.Logger)({
      transports: [
        new (winston.transports.DailyRotateFile)({ 
        name: 'file',
        datePattern: '.yyyy-MM-ddTHH-mm',
        filename: "log_file",
        maxFiles: 5,
        maxsize: 100000000
    
    
    
    })
      ]
    });
    
    
    
    logger.info ('Logger Name: '+loggerName+' App starting...');
    logger.info('Logger Name: ' + loggerName + 'Hello world');
    logger.info('Logger Name: ' + loggerName + ' Accessing test/user');
    logger.error('Logger Name: ' + loggerName + ' Cannot access test/user/user.png');
    
    var express = require('express');
    var app = express();
    app.get('/', function (req, res) {
        res.send('Hello World!');
        var date2 = new Date();
        var diff = date2 - date1;
        logger.info('Start '+ date1+' Stop '+date2)
        logger.info('Logger Name: ' + loggerName + ' Response time of Node is ' + diff+' ms');
    });
    
    app.listen(3000, function () {
        logger.warn('Logger Name: ' + loggerName + ' Example app listening on port 3000!');
        logger.info('Logger Name: ' + loggerName + ' App ending...');
    });
    

    【讨论】:

    • 我试着做这个代码,它给了我一个错误说明:
    • 我尝试执行此代码,它给了我一个错误说明: transports.push(new winston.transports.DailyRotateFile({ ^ TypeError: winston.transports.DailyRotateFile is not a function at Object. (C:\Users\user123231\Documents\Visual Studio 2015\Projects\LogTester\LogTester\app.js:16:17) 在 Module._compile (module.js:413:34) 在 Object.Module._extensions。 .js
    • 我刚刚更新了响应中的语法。试试@Junu。
    • 请检查您已声明的winston对象,并检查您是否在transports.push中使用了相同的对象。
    • 我刚刚将代码添加到问题中。请看一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2016-11-11
    • 2021-12-17
    • 2014-09-21
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多