Узел: войти в файл вместо консоли - PullRequest
148 голосов
/ 06 декабря 2011

Можно ли настроить console.log так, чтобы журналы записывались в файл, а не печатались в консоли?

Ответы [ 18 ]

1 голос
/ 20 января 2019

МЕТОД STDOUT И STDERR

Этот подход может помочь вам (я использую что-то подобное в моих проектах) и работает для всех методов, включая console.log, console.warn,console.error, console.info

Этот метод записывает байты, записанные в stdout и stderr, в файл.Это лучше, чем изменение методов console.log, console.warn, console.error, console.info, потому что выходные данные будут точно такими же, как и у этих методов:


var fs= require("fs")
var os= require("os")
var HOME= os.homedir()
var stdout_r = fs.createWriteStream(HOME + '/node.stdout.log', { flags: 'a' })
var stderr_r = fs.createWriteStream(HOME + '/node.stderr.log', { flags: 'a' })

var attachToLog= function(std, std_new){

    var originalwrite= std.write
    std.write= function(data,enc){
        try{
            var d= data
            if(!Buffer.isBuffer(d))
                d= Buffer.from(data, (typeof enc === 'string') ? enc : "utf8")
            std_new.write.apply(std_new, d)
        }catch(e){}
        return originalwrite.apply(std, arguments)
    }


}
attachToLog(process.stdout, stdout_r)
attachToLog(process.stderr, stderr_r)

// recommended catch error on stdout_r and stderr_r
// stdout_r.on("error", yourfunction)
// stderr_r.on("error", yourfunction)
1 голос
/ 09 января 2019

В простых случаях мы могли бы перенаправить потоки Standard Out (STDOUT) и Standard Error (STDERR) непосредственно в файл с помощью > и 2> & 1

Пример:

(function() {
    // Below outputs are sent to Standard Out (STDOUT) stream
    console.log("Hello Log");
    console.info("Hello Info");
    // Below outputs are sent to Standard Error (STDERR) stream
    console.error("Hello Error");
    console.warn("Hello Warning");
})();

узел test.js> test.log 2> & 1

Согласно стандарту POSIX, 'входные, выходные и ошибочные потоки идентифицируются положительным целым числом файловыми дескрипторами (0, 1, 2).т. е. stdin равно 0, stdout равно 1, а stderr равно 2.

'2> & 1' перенаправит 2 (stderr) на 1 (stdout)

'>' перенаправит 1 (стандартный вывод) в файл

1 голос
/ 08 мая 2013

Теперь вы можете использовать Caterpillar , которая представляет собой систему ведения журнала на основе потоков, позволяющую вам регистрироваться в ней, а затем передавать выходные данные в различные преобразования и местоположения.

Вывод в файлтак просто, как:

var logger = new (require('./').Logger)();
logger.pipe(require('fs').createWriteStream('./debug.log'));
logger.log('your log message');

Полный пример на сайте Caterpillar

0 голосов
/ 05 октября 2018

Я для себя просто взял пример от Уинстона и добавил метод log(...) (потому что Уинстон называет его info(..):

Console.js:

"use strict"

// Include the logger module
const winston = require('winston');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        //
        // - Write to all logs with level `info` and below to `combined.log`
        // - Write all logs error (and below) to `error.log`.
        //
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
    ]
});

//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
    logger.add(new winston.transports.Console({
        format: winston.format.simple()
    }));
}

// Add log command
logger.log=logger.info;

module.exports = logger;

Затем просто используйте в своем коде:

const console = require('Console')

Теперь вы можете просто использовать обычные функции журнала в вашем файле, и он создаст файл И зарегистрирует его на вашей консоли (во время отладки / разработки).Из-за if (process.env.NODE_ENV !== 'production') { (в случае, если вы хотите, чтобы это также в производстве) ...

0 голосов
/ 11 июля 2018

Я просто собираю пакет, чтобы сделать это, надеюсь, вам понравится;) https://www.npmjs.com/package/writelog

0 голосов
/ 04 июля 2018

Улучшение Andres Riofrio, для обработки любого количества аргументов

var fs = require('fs');
var util = require('util');

var log_file = fs.createWriteStream(__dirname + '/debug.log', {flags : 'w'});
var log_stdout = process.stdout;

console.log = function(...args) {
    var output = args.join(' ');
    log_file.write(util.format(output) + '\r\n');
    log_stdout.write(util.format(output) + '\r\n');
};
0 голосов
/ 08 мая 2018

Я решил заменить выходной поток своим потоком.

const LogLater                = require ('./loglater.js');
var logfile=new LogLater( 'log'+( new Date().toISOString().replace(/[^a-zA-Z0-9]/g,'-') )+'.txt' );


var PassThrough = require('stream').PassThrough;

var myout= new PassThrough();
var wasout=console._stdout;
myout.on('data',(data)=>{logfile.dateline("\r\n"+data);wasout.write(data);});
console._stdout=myout;

var myerr= new PassThrough();
var waserr=console._stderr;
myerr.on('data',(data)=>{logfile.dateline("\r\n"+data);waserr.write(data);});
console._stderr=myerr;

loglater.js:

const fs = require('fs');

function LogLater(filename, noduplicates, interval) {
    this.filename = filename || "loglater.txt";
    this.arr = [];
    this.timeout = false;
    this.interval = interval || 1000;
    this.noduplicates = noduplicates || true;
    this.onsavetimeout_bind = this.onsavetimeout.bind(this);
    this.lasttext = "";
    process.on('exit',()=>{ if(this.timeout)clearTimeout(this.timeout);this.timeout=false; this.save(); })
}

LogLater.prototype = {
    _log: function _log(text) {
        this.arr.push(text);
        if (!this.timeout) this.timeout = setTimeout(this.onsavetimeout_bind, this.interval);
    },
    text: function log(text, loglastline) {
        if (this.noduplicates) {
            if (this.lasttext === text) return;
            this.lastline = text;
        }
        this._log(text);
    },
    line: function log(text, loglastline) {
        if (this.noduplicates) {
            if (this.lasttext === text) return;
            this.lastline = text;
        }
        this._log(text + '\r\n');
    },
    dateline: function dateline(text) {
        if (this.noduplicates) {
            if (this.lasttext === text) return;
            this.lastline = text;
        }
        this._log(((new Date()).toISOString()) + '\t' + text + '\r\n');
    },
    onsavetimeout: function onsavetimeout() {
        this.timeout = false;
        this.save();
    },
    save: function save() { fs.appendFile(this.filename, this.arr.splice(0, this.arr.length).join(''), function(err) { if (err) console.log(err.stack) }); }
}

module.exports = LogLater;
0 голосов
/ 11 мая 2016

Вы также можете взглянуть на этот модуль npm: https://www.npmjs.com/package/noogger

noogger

просто и прямо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...