Узел: войдите в файл вместо консоли

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

Обновление 2013 года – это было написано вокруг Node v0.2 и v0.4; Сейчас вокруг журналов есть намного лучшие утилиты. Я очень рекомендую Winston

Обновление в конце 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); 

Вы также можете просто перегрузить функцию 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 также на этой странице.

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

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

 nohup node simple-server.js > output.log & 

Я часто использую много аргументов для 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; 

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

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

 const fs = require("fs"); const keys = Object.keys; const Console = 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] = function() { con[key].apply(con, arguments); }; } 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 

Еще одно решение, не упомянутое еще, заключается в подключении streamов 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 

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

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

 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 

Overwriting 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; 

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

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

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

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

Вы также можете посмотреть этот модуль npm: https://www.npmjs.com/package/noogger

noogger

простой и прямой …

Я принял идею обменивать выходной stream на мой stream.

 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; 

Усовершенствуйте 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'); }; 

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

  • Маршрутизация Express.js: необязательный параметр с плавающей запятой?
  • Bower: «команда не найдена» после установки
  • Локальная зависимость в package.json
  • Совместное использование сеансов между php и узлом
  • Внесение изменений в несколько записей на основе изменения одной записи с помощью SQL
  • Как заполнить субдокумент в мангусте после его создания?
  • Как получить путь к текущему скрипту с помощью Node.js?
  • Как реализовать безопасный REST API с node.js
  • «Неожиданный импорт токена» в Nodejs5 и babel?
  • Ошибка: для jQuery требуется окно с документом
  • Sails.js заполняют вложенные ассоциации
  • Давайте будем гением компьютера.