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

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

Ответы [ 18 ]

159 голосов
/ 11 января 2014

Вы также можете просто перегрузить функцию console.log по умолчанию:

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(d) { //
  log_file.write(util.format(d) + '\n');
  log_stdout.write(util.format(d) + '\n');
};

Приведенный выше пример войдет в debug.log и stdout.

Редактировать: См. Многопараметрическую версию Clément также на этой странице.

63 голосов
/ 06 декабря 2011

Обновление 2013 - Это было написано вокруг Node v0.2 и v0.4; В настоящее время есть гораздо лучшие утилиты для ведения журнала. Я настоятельно рекомендую Уинстон

Обновление, конец 2013 г. - Мы по-прежнему используем Winston, но теперь с библиотекой регистратора, чтобы обернуть функциональность вокруг регистрации пользовательских объектов и форматирования. Вот образец нашего logger.js https://gist.github.com/rtgibbons/7354879


Должно быть так просто.

var access = fs.createWriteStream(dir + '/node.access.log', { flags: 'a' })
      , error = fs.createWriteStream(dir + '/node.error.log', { flags: 'a' });

// redirect stdout / stderr
proc.stdout.pipe(access);
proc.stderr.pipe(error);
54 голосов
/ 06 декабря 2011

Если вы ищете что-то в производстве, winston , вероятно, лучший выбор.

Если вы просто хотите быстро создавать вещи, выводить их напрямую в файл (я думаю, это работает только для * nix систем):

nohup node simple-server.js > output.log &
49 голосов
/ 24 ноября 2015

Я часто использую много аргументов для console.log () и console.error () , поэтому мое решение будет таким:

var fs = require('fs');
var util = require('util');
var logFile = fs.createWriteStream('log.txt', { flags: 'a' });
  // Or 'w' to truncate the file every time the process starts.
var logStdout = process.stdout;

console.log = function () {
  logFile.write(util.format.apply(null, arguments) + '\n');
  logStdout.write(util.format.apply(null, arguments) + '\n');
}
console.error = console.log;
26 голосов
/ 01 декабря 2016

Winston - очень популярный npm-модуль, используемый для регистрации.

Вот инструкции.
Установите winston в свой проект как:

npm install winston --save

Вот готовая к использованию конфигурация, которую я часто использую в своих проектах в качестве logger.js в разделе utils.

 /**
 * Configurations of logger.
 */
const winston = require('winston');
const winstonRotator = require('winston-daily-rotate-file');

const consoleConfig = [
  new winston.transports.Console({
    'colorize': true
  })
];

const createLogger = new winston.Logger({
  'transports': consoleConfig
});

const successLogger = createLogger;
successLogger.add(winstonRotator, {
  'name': 'access-file',
  'level': 'info',
  'filename': './logs/access.log',
  'json': false,
  'datePattern': 'yyyy-MM-dd-',
  'prepend': true
});

const errorLogger = createLogger;
errorLogger.add(winstonRotator, {
  'name': 'error-file',
  'level': 'error',
  'filename': './logs/error.log',
  'json': false,
  'datePattern': 'yyyy-MM-dd-',
  'prepend': true
});

module.exports = {
  'successlog': successLogger,
  'errorlog': errorLogger
};

А затем просто импортируйте туда, куда требуется:

const errorLog = require('../util/logger').errorlog;
const successlog = require('../util/logger').successlog;

Тогда вы можете зарегистрировать успех как:

successlog.info(`Success Message and variables: ${variable}`);

и ошибки как:

errorlog.error(`Error Message : ${error}`);

Он также регистрирует все журналы успеха и журналы ошибок в файле в каталоге журналов по дате, как вы можете видеть здесь.
log direcotry

12 голосов
/ 09 февраля 2017
const fs = require("fs");
const {keys} = Object;
const {Console} = console;

/**
 * Redirect console to a file.  Call without path or with false-y
 * value to restore original behavior.
 * @param {string} [path]
 */
function file(path) {
    const con = path ? new Console(fs.createWriteStream(path)) : null;

    keys(Console.prototype).forEach(key => {
        if (path) {
            this[key] = (...args) => con[key](...args);
        } else {
            delete this[key];
        }
    });
};

// patch global console object and export
module.exports = console.file = file;

Чтобы использовать его, сделайте что-то вроде:

require("./console-file");
console.file("/path/to.log");
console.log("write to file!");
console.error("also write to file!");
console.file();    // go back to writing to stdout
10 голосов
/ 06 декабря 2011

Если это для приложения, вам, вероятно, лучше использовать модуль регистрации.Это даст вам больше гибкости.Некоторые предложения.

4 голосов
/ 14 декабря 2016

Другое решение, еще не упомянутое, заключается в подключении потоков Writable в process.stdout и process.stderr. Таким образом, вам не нужно переопределять все функции консоли , которые выводят в stdout и stderr. Эта реализация перенаправляет как stdout, так и stderr в файл журнала:

var log_file = require('fs').createWriteStream(__dirname + '/log.txt', {flags : 'w'})

function hook_stream(stream, callback) {
    var old_write = stream.write

    stream.write = (function(write) {
        return function(string, encoding, fd) {
            write.apply(stream, arguments)  // comments this line if you don't want output in the console
            callback(string, encoding, fd)
        }
    })(stream.write)

    return function() {
        stream.write = old_write
    }
}

console.log('a')
console.error('b')

var unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) {
    log_file.write(string, encoding)
})

var unhook_stderr = hook_stream(process.stderr, function(string, encoding, fd) {
    log_file.write(string, encoding)
})

console.log('c')
console.error('d')

unhook_stdout()
unhook_stderr()

console.log('e')
console.error('f')

Следует печатать в консоли

a
b
c
d
e
f

и в файле журнала:

c
d

Для получения дополнительной информации, проверьте это Суть .

3 голосов
/ 13 января 2016

Перезапись console.log - это путь.Но для того, чтобы он работал в необходимых модулях, вам также необходимо экспортировать его.

module.exports = console;

Чтобы избавить себя от необходимости записывать файлы журналов, вращаться и все такое, вы можете рассмотреть возможность использования простого модуля регистрации, такого как winston:

// Include the logger module
var winston = require('winston');
// Set up log file. (you can also define size, rotation etc.)
winston.add(winston.transports.File, { filename: 'somefile.log' });
// Overwrite some of the build-in console functions
console.error = winston.error;
console.log = winston.info;
console.info = winston.info;
console.debug = winston.debug;
console.warn = winston.warn;
module.exports = console;
2 голосов
/ 25 июля 2017

Прямо из документации API nodejs на Консоль

const output = fs.createWriteStream('./stdout.log');
const errorOutput = fs.createWriteStream('./stderr.log');
// custom simple logger
const logger = new Console(output, errorOutput);
// use it like console
const count = 5;
logger.log('count: %d', count);
// in stdout.log: count 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...