Soru Düğüm: konsol yerine bir dosyaya giriş yapın


Yapılandırabilir miyim console.log Böylece, kayıtlar konsolda yazdırılmak yerine bir dosyaya yazılır mı?


124
2017-12-05 23:58


Menşei


olabilir, ancak uzun çalışma zamanı üretim uygulamaları için, sadece belirli bir gün için günlükleri bulmak zor olurdu, değil mi? @racar


Cevaplar:


2013 Güncellemesi - Bu Node v0.2 ve v0.4 etrafında yazılmıştır; Günlüğe kaydetme konusunda çok daha iyi faydalar var. şiddetle tavsiye ediyorum Winston

Geç 2013'ün Güncelleştirmesi - Hala winston kullanıyoruz, ancak şimdi özel nesnelerin ve biçimlendirmenin günlüğe kaydedilmesiyle ilgili işlevselliği sarmak için bir logger kütüphanesi kullanıyoruz. İşte bizim logger.js örneğimiz https://gist.github.com/rtgibbons/7354879


Bu kadar basit olmalı.

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

56
2017-12-06 00:28



Proc nedir ???? - trusktr
Nvm, bu düşündüğüm süreç anlamına geliyor ... Bu nasıl çalışıyor? console.log(whatever); hala konsola gidiyor, dosya değil. - trusktr
Pencerelerde yanımda çalışmıyor ... - inf3rno
Yakın zamanda yapılan bir değişiklik nedeniyle, artık stderr.pipe () öğesini çağıramazsınız - şimdi şunu alır: process.__defineGetter__('stderr', function() { return fs.createWriteStream(__dirname + '/error.log', {flags:'a'}) }) - damianb
Şahsen ben Winston'dan iyice uzaklaşırdım. Bunu bir yıldan fazla bir süredir kullandık ve sonunda üretim ortamımızda birçok soruna neden olduğu için tamamen kaldırmaya karar verdik. Proje şimdi çok zayıf bir şekilde korunmuş gibi görünüyor. Kolun olduğu sürece bir sorun listesi var. Sorunların çoğu, diğer kullanıcılar tarafından sunulan çekme taleplerine sahipti, ancak proje sahipleri bunları birleştirmek için zaman bile almadılar. Alternatifler için node-bunyan ve tırtıl göz atmaya değer olabilir. - UpTheCreek


Varsayılan konsol.log işlevini de aşırı yükleyebilirsiniz:

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');
};

Yukarıdaki örnekte debug.log ve stdout'a giriş yapılacaktır.

Düzenle:  Clément tarafından çoklu parametreye bakınız ayrıca bu sayfada.


145
2018-01-11 10:45



console.log üzerine yazmaktan rahatsız olmazdım. Sadece belirli bir dosyaya giriş yapan kendi işlevinizi oluşturun. - Alexander Mills
Ayrıca bu, birden çok parametre için çalışmaz. Örneğin. console.log (p1, p2, p3) - user603749
Mükemmel cevap! Ayrıca, birden çok console.log argümanını yakalamak istiyorsanız, 'Arg' nesnesini 'd' yerine yakalayın - developer.mozilla.org/en/docs/Web/JavaScript/Reference/... - Charlie
Mükemmel cevap! - yushulx
ama her js dosyasında buna ihtiyacım var, bunu global hale getirmek mümkün mü? - stackdave


Eğer üretimde bir şey arıyorsanız winston Muhtemelen en iyi seçimdir.

Eğer hızlı bir şekilde dev şeyler yapmak istiyorsanız, doğrudan bir dosyaya çıkın (bence bu sadece * nix sistemleri için geçerlidir):

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

45
2017-12-06 08:56



kullanma > STDOUT çalışmalarını Windows'ta da yeniden yönlendirmek için. nohup yapmaz. - Brad
bu olmadan mutlu çalışır nohup üzerinde * nix, yani node simple-server.js > output.log. Daha sonra günlükleri yazılı olarak takip etmek istiyorsanız tail -f output.log - nasty pasty
Bu işlem işe yaramadı. - eran otzap
Üretimde bunu yapmanın dezavantajı nedir? - m-a-r-c-e-l-i-n-o
Birimiz için iyi bir m-a-r-c-e-l-i-n-o, bu çıktının sonuna kadar tüm çıktılar için bu output.log dosyası doldurulacaktır. bunun yerine uygulamanızda, günlük dosyalarının günlüğüne eklenen bir günlüğe sahip olduğu bir "günlükler klasöründe" depolayan bir yönteminiz olabilir. Bu şekilde en azından her gün yeni bir günlük dosyası oluşturuyorsunuz daha yönetilebilir. - ferr


Sık sık birçok argüman kullanırım console.log () ve console.error (), bu yüzden benim çözümüm:

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;

43
2017-11-24 15:47





Winston kayıt için kullanılan çok popüler bir npm-modülüdür.

İşte nasıl yapılır.
Winston'u projenize aşağıdaki gibi kurun:

npm install winston --save

İşte, projelerimde sıkça kullandığım bir kullanıma hazır bir yapılandırma.

 /**
 * 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
};

Ve sonra sadece gereken bu şekilde basitçe içe aktarın:

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

Sonra başarıyı şu şekilde kaydedebilirsiniz:

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

ve Hatalar:

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

Ayrıca, tüm başarı kayıtlarını ve hata kayıtlarını, burada görüldüğü gibi, günlükler dizini altındaki bir dosyada kaydeder.
log direcotry


22
2017-12-01 09:02



Günlükler konsolda görünür. ve hemen hiçbir dosya oluşturulmaz! Bir şey mi eksik? - Nigilan
Yapılarınızı paylaşabilir misiniz? Ya da önerdiğim gibi kullandın mı? İthalatları kontrol et (winston & winston-daily-rotate-file) yapılandırmalar iyi ise bir kez. Onlar adında bir klasörde oluşturulmalı logs projenin kök dizininde. Gecikmiş cevap için özür dilerim. - keshavDulal
Teşekkürler. Şimdi çalışıyor.. - Nigilan
@Nigilan bunu nasıl düzelttiniz? Aynı konuyla yüzleşiyorum. - user2180794
Bunları logger-use üzerine eklemek için ihmal etmeyin const winston = require('winston');  const winstonRotator = require('winston-daily-rotate-file');  Ve const errorLog = require('../util/logger').errorlog;  const successlog = require('../util/logger').successlog;  Bir şeyi nereye saklamak istersen. - keshavDulal


Bu bir uygulama içinse, muhtemelen bir kayıt modülü kullanarak daha iyisiniz. Size daha fazla esneklik sağlayacaktır. Bazı öneriler.


10
2017-12-06 07:19



Log4js bağlantınız şimdi bozuldu. Buna ne dersin? github.com/nomiddlename/log4js-node - Joe Hildebrand
Evet, sanırım proje el değiştirdi. Teşekkürler. - Marco


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;

Kullanmak için, aşağıdaki gibi bir şey yapın:

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

9
2018-02-09 18:34



Bu en çok oylanan cevap olmalı. teşekkür ederim! - Chris Scott
Sadece erros kaydetmek için mümkün mü? - stackdave
Döngü yerine Console.prototype sadece açıkça ayarlanmış anahtarlar this.error bir tek. - rich remer


Henüz belirtilmeyen bir başka çözüm, Writable içinde akış process.stdout ve process.stderr. Bu şekilde geçersiz kılmanız gerekmez tüm konsol işlevleri Bu stdout ve stderr çıktı. Bu uygulama, stdout ve stderr dosyalarını bir günlük dosyasına yönlendirir:

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')

Konsolda yazdırmalı

a
b
c
d
e
f

ve günlük dosyasında:

c
d

Daha fazla bilgi için şunu kontrol edin öz.


2
2017-12-14 05:28



Doğru cevap. - nikk wong


Konsolun üzerine yazma, gidilecek yoldur. Ancak gerekli modüllerde çalışması için, onu da dışa aktarmanız gerekir.

module.exports = console;

Kendinize günlük dosyaları yazma, döndürme ve başka şeyler yapma zahmetinden kurtulmak için, winston gibi basit bir kayıt defteri modülü kullanmayı düşünebilirsiniz:

// 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
2018-01-12 22:33



kayıt cihazı = Winston ??? - koolaang
Evet. Afedersiniz. Benim hatam - Simon Rigét


Şimdi kullanabilirsiniz tırtıl akışlar tabanlı bir kayıt sistemi, oturum açmanıza izin verir, sonra çıktıyı farklı dönüşümlere ve konumlara aktarır.

Bir dosyaya çıkış yapmak şu kadar kolay:

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

Komple örnek Caterpillar Web Sitesi


1
2018-05-08 01:09