【问题标题】:Winston File transport logs escape charactersWinston 文件传输日志转义字符
【发布时间】:2016-09-08 17:31:54
【问题描述】:

我正在使用 winston 登录 Sails 应用程序。这是我的配置:

var customLogger = new winston.Logger({
    transports: [
        new(winston.transports.File)({
            level: 'debug',
            filename: 'app.log',
            colorize: false,
            showLevel: false,
            prettyPrint: false,
            exitOnError: false,
            json: true,
            zippedArchive: true,
            maxsize: 1000000000,
            maxFiles: 30,
            tailable: true
        }),
        new(winston.transports.Console)({
            level: 'info',
            exitOnError: false,
            colorize: false,
            showLevel: false
        })
    ],
});

但在输出文件中有奇数字符。

{"level":"info","message":"\u001b[32minfo: \u001b[39m","timestamp":"2016-05-12T17:58:03.281Z"}

【问题讨论】:

  • 这些是来自控制台的颜色。
  • 是的,但我不想避免输出这些字符。
  • 遵循本博客中的指导方针,它奏效了 - thisdavej.com/…

标签: logging sails.js winston


【解决方案1】:

目前在 Sails 中,您无需使用 customLogger 即可使用 Winston。您可以安装sails-hook-winston。比你的config/log.js 看起来像这样:

var path = require('path');
var pkgJSON = require(path.resolve('package.json'));

module.exports.log = {

    // This options are for Console transport that is used by default
    level: 'info', // you are familiar with this value, right?
    timestamp: true, // if you want to output the timestamp in the console transport
    colors: false,
    // Transports
    // more information: https://github.com/winstonjs/winston/blob/master/docs/transports.md
    transports: [{
        module: require('winston-daily-rotate-file'),
        config: {
            dirname: path.resolve('logs'),
            datePattern: '.yyyy-MM-dd.log',
            filename: pkgJSON.name,
            prettyPrint: true,
            timestamp: true,
            level: 'info',
            json: true,
            colors: false
        }
    }]
};

你可以同时使用几个transports,不同的日志级别。

【讨论】:

    【解决方案2】:

    我确实遇到了类似的问题,并通过从以下代码中删除 winston.format.colorize() 语句来解决它,以消除日志文件中的奇数或转义码。

    const logFormat = winston.format.combine (
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
    winston.format.colorize(),
    winston.format.align(),
    winston.format.printf(
        info => `${info.timestamp} ${info.level.toUpperCase()}: ${info.message}`    
    ));
    

    虽然下面分享的是完整的工作代码,但没有任何与奇数或转义码相关的问题。

    作为 /zipCode/config/default.json 文件的一部分捕获的默认配置

    {
       "port":      3000,
       "logConfig": {
            "logFolder":    ".//logs//",
            "logFile":      "zip-code-%DATE%.log",
            "logLevel":     "info"
        }
    }
    

    将创建记录器实现合并为 /zipCode/logger/log.js 文件的一部分

    /**
     * @author: dinesh.lomte
     */
    const winston = require('winston');
    const dailyRotateFile = require('winston-daily-rotate-file');
    const config = require('config');
    const logFormat = winston.format.combine (
        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
        winston.format.align(),
        winston.format.printf(
            info => `${info.timestamp} ${info.level.toUpperCase()}: ${info.message}`    
        )
    );
    const transport = new dailyRotateFile({
        filename:       config.get('logConfig.logFolder') + config.get('logConfig.logFile'),
        datePattern:    'YYYY-MM-DD',
        zippedArchive:  true,
        maxSize:        '20m',
        maxFiles:       '14d',
        level:          config.get('logConfig.logLevel')        
    });
    
    transport.on('rotate', function(oldFile, newFile) {
        // Call function like upload to s3 or on cloud
    });
    
    const logger = winston.createLogger({
        format:     logFormat,
        transports: [
            transport,
            new winston.transports.Console({
                level:  config.get('logConfig.logLevel')
            })
        ]
    });
    
    module.exports = logger;
    

    /zipCode/api/controller.js 文件下方显示记录器的使用情况

    /**
     * @author: dinesh.lomte
     */
    'use strict';
    
    var distance = require('../service/distance');
    var logger = require('../logger/log');
    
    var controllers = {
        get_distance: function(req, res) {
            logger.info('Processing get_distance request...');
            distance.find(req, res, function(err, dist) {
                if (err) {
                    logger.error('Failed to process distance request, due to: ' + err);
                    res.send(err);
                }
                logger.debug('Processed get_distance request...');
                res.json(dist);
            });
        }
    };
    
    module.exports = controllers;
    

    【讨论】:

      【解决方案3】:

      我根据是否通过dotenv 库启用了winston's 着色功能:

      .env:

      LOG_COLORIZE_FORMAT_ENABLED=false
      

      Logger.ts

      require('dotenv').config()
       ...
      
         const formats = [
            format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
            process.env.LOG_COLORIZE_FORMAT_ENABLED === 'true' ? format.colorize({ all: true }) : null,
            format.splat(),
            format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`),
            
          ].filter(f => f !== null);
          
          const _format = formats.length ? format.combine(...formats) : null;
          
          const Logger = createLogger({
            level: level(),
            levels,
            format: _format,
            transports: [new transports.Console()],
          });
          
          export { Logger };
      

      【讨论】:

        猜你喜欢
        • 2015-02-14
        • 1970-01-01
        • 2017-09-19
        • 2012-04-20
        • 2019-05-20
        • 2015-04-24
        • 2019-04-17
        • 2023-03-16
        • 2021-04-26
        相关资源
        最近更新 更多