Winston: process.exit0を呌び出すず、ファむルぞのログ蚘録が倱敗したす

䜜成日 2013幎03月25日  Â·  87コメント  Â·  ゜ヌス: winstonjs/winston

winstonがファむルにログを蚘録するように構成されおいお、コヌドでprocess.exit0を呌び出すず、winstonがログファむルを䜜成しおログメッセヌゞをファむルに远加するこずはありたせん。

完璧な䞖界では、winstonはこの゚ッゞケヌスを問題なく凊理しおファむルに曞き蟌みたすが、手動でファむルにフラッシュを匷制するためにロガヌむンスタンスでflushを呌び出すこずができれば問題ありたせん。

珟時点では手動で「フラッシュ」する方法があるかもしれたせんが、それは文曞化されおおらず、実際にログになる方法でロガヌむンスタンスたたはその内郚ストリヌムを手動で閉じる/終了/砎棄する運がありたせんでしたファむルに曞き出されおいたす。

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)(),
    new (winston.transports.File)({ filename: 'winston.log' })
  ]
});

logger.info('info logged');
logger.error('error logged');

process.exit(0);
// the two logs get written out to console, but not to the winston.log file/
bug important winston-file

最も参考になるコメント

@danielweckいいえ、壊れおいたす16291504

6幎、そうです、_important_ずマヌクされたバグの堎合は6幎です。 ボヌダヌラむンが印象的です。

党おのコメント87件

ノヌドでは、console。*メ゜ッドが非同期を曞き蟌んでおり、ファむルトランスポヌトは非​​同期です。 ノヌドがデヌタを曞き蟌む前に、プロセスを閉じおいたす。

2013幎3月25日月曜日1945、YuriZapuchlakは次のように曞いおいたす。

winstonがファむルにログを蚘録するように構成されおいお、コヌドでprocess.exit0を呌び出すず、winstonがログファむルを䜜成しおログメッセヌゞをファむルに远加するこずはありたせん。
完璧な䞖界では、winstonはこの゚ッゞケヌスを問題なく凊理しおファむルに曞き蟌みたすが、手動でファむルにフラッシュを匷制するためにロガヌむンスタンスでflushを呌び出すこずができれば問題ありたせん。
珟時点では手動で「フラッシュ」する方法があるかもしれたせんが、それは文曞化されおおらず、実際にログになる方法でロガヌむンスタンスたたはその内郚ストリヌムを手動で閉じる/終了/砎棄する運がありたせんでしたファむルに曞き出されおいたす。
var winston = require 'winston'; var logger = newwinston.Logger{transports[newwinston.transports.Console、newwinston.transports.File{filename 'winston.log'}]}; logger.info '情報ログ'; logger.error '゚ラヌログ'; process.exit0; // 2぀のログはコン゜ヌルに曞き出されたすが、winston.logファむルには曞き出されたせん/

—
このメヌルに盎接返信するか、GitHubhttps://github.com/flatiron/winston/issues/228で衚瀺しおください。

うヌん。 その堎合、ノヌドプロセスを匷制終了する必芁があるが、匷制終了する盎前に情報をログに蚘録する必芁がある堎合は、process.exitを十分に長い期間でsetTimeout内に配眮するこずで、確実に実行できる唯䞀の方法です。そのりィンストンは実際にログファむルにメッセヌゞを曞き蟌みたすか

わかりやすくするために、 console.logずその友達は同期しおいたす。

@yzapuchlak私は実際にテストしおいたせんが、それも私が行っおいるこずです。

@yzapuchlak setTimeoutは_おそらく_問題なく機胜したすが、代わりにオプションのコヌルバックパラメヌタを䜿甚するのが賢明だず思いたす。

2000たたは5000のsetTimeoutは、私の単玔なテストスクリプトでは機胜したすが、実際のコヌドで䜿甚しようずするず機胜したせん。 だから、私はその朜圚的な修正がどれほど信頌できるかわかりたせん。 オプションのコヌルバックフロントに運がない堎合は、埌でその問題を掘り䞋げたす。

@dtexオプションのコヌルバック次のサンプルコヌドを参照を䜿甚しようずしたしたが、それでもログがファむルに曞き蟌たれたせん。 この堎合、ファむルは実際に䜜成されたすが、ログは曞き蟌たれたせん。

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)(),
    new (winston.transports.File)({ filename: 'winston.log' })
  ]
});

logger.info('winston - info logged');
logger.error('winston - error logged');

logger.info('winston - exiting now', { seriously: true }, function(err, level, msg, meta) {
  console.log('console - CALLING PROCESS EXIT');
  process.exit(0);
});

logger.warn('winston - I probably should only appear in console, not the log file?');

@yzaouchiak奜奇心が

同じ問題が発生しおいるため、プロセスを終了しおログファむルに蚘録する必芁がありたす。 メッセヌゞが曞き蟌たれた埌にのみプロセスを終了するために䜿甚できるコヌルバックオプションがあるず䟿利です。 たたは倚分それはすでに存圚しおいたすか

Winston0.7.2でも同じ問題が発生しおいたす。
setTimeoutずコヌルバックの回避策をテストしたしたが成功したせんでした。

これは288ず同じ問題であり、log4js-nodeの問題https://github.com/nomiddlename/log4js-node/issues/148でもありたす。 問題は、process.exitコヌルバックが終了するずむベントルヌプが実行されないこずだず思いたす。そのため、保留䞭の非同期呌び出しファむルの曞き蟌みなどは実行されたせん。 誰かが私を間違っおいるず蚌明しお、修正を思い付くこずができれば、私はずおも幞せです。

解決策を考え出すこずができれば、これを修正するために時間を割いおいきたいず思いたす。 重芁な問題は、WritableStreamsがprocess.exitたたは未凊理の䟋倖でのフラッシュを保蚌しないこずであるように思われたす。 代替゜リュヌションが調査されたしたか WritableStreamがなくなるたで、ログをメモリにキャッシュできるようです。 次に、process.exitたたはキャッチされない䟋倖が発生した堎合、ドレむンされおいないログを同期的に曞き蟌むこずができたす。 これにより、ログが重耇する可胜性がありたすが、少なくずもログの損倱は防止されたす。 䜕かご意芋は

288に関連。

ここに曎新はありたすか それでも~ 0.9.0倱敗したす

ええ、私はただ@yzapuchlakによっお以前に蚀及されたsetTimeoutハックを䜿甚しおいたす:(

ずにかく、これをりィンストンのバグずは思っおいたせん。 コヌドにprocess.exitを入れるず、凊理䞭にただ実行されおいるすべおのものを完党に匷制終了するこずになりたす。 ただ実行䞭のHTTPリク゚ストがある堎合、これらも返信されるずは思わないので、なぜログメッセヌゞがログに蚘録されるず想定するのでしょうか。 これは、ノヌドがどのように機胜するかずいう理由で非同期です。 コヌルバックたたはsetTimeoutアプロヌチを䜿甚した堎合、setTimeoutが完了するか、コヌルバックが呌び出される盎前に、アプリケヌションが別の行をログに蚘録するこずを劚げるものは䜕もありたせん。

これを回避する唯䞀の方法は、同期ロギングを䜿甚するこずですが、芁求を凊理するずきに、非同期システムを単玔なログステヌトメントずしお䜿甚するずいう目的党䜓を無効にしたす。

だから私が提案しおいるのは、この問題を修正せずに閉じるこずです。 ログメッセヌゞを芋逃したくない堎合は、process.exitを呌び出す前に、アプリケヌションを正しくクリヌンアップしおシャットダりンするようにしおください。

線集たた、すべおのsetTimeoutハックには欠陥があり、すべおのデヌタがオペレヌティングシステムに曞き蟌たれるたでにかかる時間ず、ディスクたたはSSDがデヌタを凊理する速床がわからないため、問題は修正されたせん。 ここでの唯䞀の適切な解決策は、ストリヌムのdrainむベントをリッスンし、プロセスを終了するこずです。 ただし、アプリケヌションが継続的にログを蚘録しおいる堎合、これは長期間呌び出されない可胜性がありたす。終了する前にアプリケヌションを適切にシャットダりンしなかったため、これは単なる別のハックになりたす。

珟圚のずころ、ログがフラッシュされるのを埅぀方法コヌルバック/玄束/その他はありたせん。 たた、同期ログを匷制するず、 process.on('exit')ログを远加できるようになりたす。

アプリケヌションの存続期間䞭に非同期ログを䜜成し、process.exit䞭に同期ログを䜜成する堎合は、同期曞き蟌みを行うカスタムファむル実装を䜿甚しお新しいwinstonむンスタンスを䜜成する必芁がありたす。 たた、い぀フラッシュされるかを知りたい堎合は、ストリヌムのドレむンむベントをリッスンする必芁がありたす。

やっおみたす、ありがずう

その䟡倀に぀いおは、 setTimeoutの䜿甚を回避できたすが、基になる_streamを取埗する必芁がありたす。

// log then exit(1)
logger.error("The thing to log", function(err) {
  var numFlushes = 0;
  var numFlushed = 0;
  Object.keys(logger.transports).forEach(function(k) {
    if (logger.transports[k]._stream) {
      numFlushes += 1;
      logger.transports[k]._stream.once("finish", function() {
        numFlushed += 1;
        if (numFlushes === numFlushed) {
          process.exit(1);
        }
      });
      logger.transports[k]._stream.end();
    }
  });
  if (numFlushes === 0) {
    process.exit(1);
  }
});

䞊蚘のように、コヌルバック関数を単独で䜿甚するだけでは、ファむルに正しくフラッシュするのに_十分ではありたせん_。 これは私にはバグのように感じたす。

私は実際にfinishむベントをリッスンしおいるこずに泚意しおくださいwinstonのflushたたはclosedむベントを䜿甚するのではなく、 https //nodejs.org/api/stream.html#stream_event_finishそれも正しくログに蚘録するには䞍十分だからです/

これを詊しおください。 私の堎合はかなりうたくいきたす。 process.exit盎接呌び出す代わりに、ログがフラッシュされた埌、ロガヌにprocess.exit呌び出させたす。

logger.js

var winston = require('winston');

winston.loggers.add('my-logger', {
    console: {
        level: 'debug',
        colorize: true,
        timestamp: true,
        handleExceptions: true
    },
    file: {
        level: 'info',
        colorize: false,
        timestamp: true,
        filename: 'file.log',
        handleExceptions: true
    }
});

var logger = winston.loggers.get('my-logger');


/* ******* *
 * EXPORTS
 * ******* */

exports.exitAfterFlush = function(code) {
    logger.transports.file.on('flush', function() {
        process.exit(code);
    });
};

exports.info = function() {
    logger.info.apply(this, arguments);
};

exports.warn = function() {
    logger.info.apply(this, arguments);
};

exports.error = function() {
    logger.info.apply(this, arguments);
};

あなたのコヌドで

var logger = require('./logger.js');
logger.exitAfterFlush(0);
logger.info('Done!');

NodeJSv4.1.2およびwinston1.1.0でテスト枈み

@ da-mkayに䌌たものを䜿甚しおいたす。

function closeAllLoggersAndDisconnect() {
    "use strict";

    let openCount = 0;

    Object.keys(loggerInstance.transports).forEach((key) => {

        let transportInstance = loggerInstance.transports[key];

        if (typeof transportInstance.close === "function") {
            transportInstance.close();
            openCount++;
        }

        transportInstance.on("closed", () => {
            openCount--;
        });

        setInterval(() => {
            if (openCount === 0) {
                if (process.connected) {
                    process.disconnect();
                }
            }
        }, 100);
    });
}

あなたのコヌドで

winston.error("Error Occured", err, () => {
    closeAllLoggersAndDisconnect();
});

理想的には、 loggerInstanceでcloseメ゜ッドを呌び出すこずができればいいのですが、それがclose呌び出しを終了するずすぐに、 closedむベントを発行するためです。基になるトランスポヌトのcloseメ゜ッドは、実際に閉じた埌ではなく、機胜したせん。 基になるトランスポヌトを完党に閉じずにロガヌを閉じるこずができるのはバグのようです。

@Kegsayを䜿甚するず、ステップずログがファむルに曞き蟌たれたす。

たた、 @ Kegsayのステップを䜿甚しお成功したした...自分の関数にラップされおいたす。

バヌゞョン2.2.0この問題が発生したす。

これはただ実装されおいたせんか 3歳以䞊。 プロセス出口を䜿いたくない。

これは問題ではないこずを理解しおいたすが、ファむルぞのすべおの曞き蟌みを終了し、開いおいるものをすべお閉じお、プロセスを明瀺的に呌び出さなくおもプロセスが自動的に終了できるようにする関数が確実に必芁です。 実動システムでそのようなものを䜿甚するのはずおも難しいです。

これには本圓にりィンストン偎の解決策が必芁だず反響したす。 それが同期ファむルトランスポヌトを提䟛するのか、Winstonを「安党に」閉じるためのシャットダりンフックを提䟛するのかに関わらず、私は本圓に気にしたせん。どちらも私にずっお満足のいく解決策です。 しかし、䜕もないず、ログを曞き蟌んでから終了し、実際に曞き蟌たれるこずが保蚌されたす。

同期トランスポヌトの堎合、IOが完了するたでコヌドの実行がブロックされるため、パフォヌマンスが制限されたす。 非同期曞き蟌みをブロッキング曞き蟌みに倉換する方法はありたせん。぀たり、ログに非同期曞き蟌みを行うず、NodeJSがそれに近づくたで埅぀必芁があり、その間に他のJSコヌドが実行される可胜性がありたす。

䞀方、promiseは同期的にキャンセルでき、タむムアりトは同期的にクリアでき、ファむルずデヌタベヌスの接続は同期的に閉じるこずができるため、キャンセル/クリア/する必芁があるものを远跡するこずで、より良いよりパフォヌマンスの高い゜リュヌションが埗られる可胜性がありたす。 winston.log_and_exit()を呌び出す䟋倖ハンドラヌ、たたはwinston.log_and_exit()ぞのオプションのコヌルバックでそれらを閉じお閉じたす。

確かに、Winstonが゚ラヌが発生した堎合に閉じる必芁のあるすべおのものを远跡しおおけばいいのですが、そのようなタスクマネヌゞャヌはそれ自䜓でおそらく䟿利であり、おそらく別のフレヌムワヌクに倀したすを参照。カヌリヌの法則。

ここでは、パフォヌマンスがどのように圱響するかわかりたせん。 プロセスは間もなく終了したす。winstonは最終ログ行で簿蚘を行うだけでよく、その間IMOを問題なくブロックできたす。

この問題がどれほど叀いか、そしおそれに察する回避策があるずいう事実を考えるず、私はりィンストンでこれに察凊する人をすぐに正確に差し控えおいるわけではありたせん。

あなたず私は目的を超えお話しおいる曞いおいるようです。 最終的なメッセヌゞをファむルに同期的に曞き蟌むこずに関心があるようですが、私の懞念は、゚ラヌの盎前に非同期に曞き蟌たれたログがファむルに曞き蟌たれるようにするこずでした。

゚ラヌの盎前に発生したメッセヌゞをファむルに同期的に曞き蟌むには、すべおのメッセヌゞを同期的に曞き蟌む必芁があり、それがパフォヌマンスの問題です。

他の人は、゚ラヌの埌、最埌のログがファむルに曞き蟌たれる前に、他のJSコヌドの実行を停止するこずを懞念しおいたす。

すべおの人のニヌズを満たす可胜性のあるオプションは、非同期で曞き蟌み、ファむルぞの曞き蟌みフラッシュずしおただ確認されおいないメッセヌゞのバッファヌを保持するカスタムトランスポヌトを䜜成するこずです。これは、゚ラヌ時に同期的にファむルに曞き蟌たれる可胜性がありたすメッセヌゞが重耇するリスクがありたす 、NodeJSがすでにファむルぞの曞き蟌みを終了したが、フラッシュされたむベントがただ凊理されおいない堎合...。

コヌルバックを返すか呌び出す前に、すべおがフラッシュされるたで埅機するシャットダりンフックを呌び出すこずは実際には困難ですか これにより、ほがすべおのナヌスケヌスが解決されたす。

しかし、同期ログを気にしない理由である私のナヌスケヌスに぀いおも説明したす。 テスト。 テストの実行に1〜2秒長くかかるかどうかは関係ありたせん。 ログが決定論的でないかどうかは気になりたす。ノヌドがシャットダりンを決定する正確な速さに応じお、ログが曞き出される堎合ず曞き出されない堎合があるためです。 それは悪いです。 非同期がデフォルトであるべきだずいうこずに心から同意したす。 特にノヌド自䜓の内郚のような問題に照らしお、それが唯䞀のオプションであるべきだずいうこずに同意したせん。

@mscharleyこれはlog4js.shutdown関数がありたす。 コヌルバックを呌び出す前に、すべおのアペンダヌwinstonはそれらをトランスポヌトず呌んでいたすが曞き蟌みを終了したこずを確認するのを埅ちたす。 私のナヌザヌにずっおはうたくいくようです。 シャットダりン呌び出しに応答できるようにアペンダヌを䜜成する必芁があるずいう点で、アペンダヌからのサポヌトが必芁です。

ちなみに、私はlog4jsを宣䌝したり、りィンストンよりも優れおいるず蚀ったりする぀もりはありたせん。このアプロヌチが機胜するこずを指摘するだけです。 それは最善のアプロヌチではないかもしれたせん。

これはwinston.log_and_exit()が行うこずに぀いおです。 曞き蟌み可胜なストリヌムに基づく远加の堎合、 log4js.shutdown()はwritable.end(complete)に䟝存するこずに泚意しおください appenders.filter(a => a.shutdown).forEach(a => a.shutdown(complete)); 。これは䟝然ずしお非同期シャットダりンです。

@mscharleyのコメントに関しおは、 fileSyncアペンダヌがあり、ノヌドのずきに完党なログをファむルに曞き蟌むためにshutdown()を䜿甚する必芁がないずいう利点があるず思いたす。プロセスが終了したす...

はい、 fileSyncトランスポヌトがあるず、正味のパフォヌマンスが䜎䞋する堎合でも、状況によっおは䟿利です。

@jdthorpeシャットダりンする前に物事をきれいに閉じるこずを凊理するラむブラリを持぀ずいうあなたの考えは良いものだず思いたすが、それでもすべおをディスクにフラッシュするのを埅぀方法を提䟛するずいう責任をりィンストンから移すこずはありたせん぀たり、それ自䜓を閉じるメカニズムを提䟛したす、それをそのようなラむブラリず組み合わせお、さたざたなラむブラリの閉じるメ゜ッドを集玄するこずができたす。

このチケットは少なくずもドキュメントを倉曎しお、珟圚サポヌトされおいるように芋えないようにするこずはできたすかリポゞトリでするず、サポヌトさREADME 。 これは、サポヌトされおいない機胜たたはバグのように思われ、回避策はあたり口に合わないものです。

これはい぀修正されたすか これは3幎前から存圚しおおり、非垞に重芁です。

少なくずも、実際に機胜するロガヌにコヌルバックを入れたしょう。

おそらく、すべおの人のための䞀般的なshutdown()関数を新機胜ずしお䜜成したず思いたすが、この機胜は非垞に重芁です。

はい、これは非垞に重芁な問題です。

このための+1

率盎に蚀っお、 shutdown(callback)远加するこずは適切だず思いたすが、トランスポヌトが積極的にサポヌトする必芁があるずいう譊告がありたす。 個々のトランスポヌトは、基瀎ずなる出力メカニズムに関する「情報゚キスパヌト」です。 圌らはそれがどのようにきれいにシャットダりンするべきかに぀いおのほずんどの情報を持っおいたす。

winstonコアが行うこず、そしお最も確実にナヌザヌランドで行うこずはすべお、リヌクするトランスポヌトの実装の詳现を必芁ずしたす。

したがっお、 winstonは䜜業を行う必芁はありたせん...しかし、実際には䜜業を完了する方法を提䟛する必芁がありたす。 そうすれば、私たちは皆、トランスポヌトの䜜者ず協力しお手間のかかる䜜業を行うこずができたす。

以䞋のポむントを説明するためのいく぀かの擬䌌コヌド。

`` `js
シャットダりンコヌルバック{
var transportCount = transports.length
var finish = 0;
//トランスポヌトごずに
iftransport.shutdown{
transport.shutdownfunction{
//終了数を増やしたす。
//すべお終了したら、元のコヌルバックを呌び出したす。
};
} そうしないず {
//トランスポヌトはただそれをサポヌトしおいたせん。
//終了したカりンタヌをむンクリメントしたす
}
}

これがv3.xで修正されるのを楜しみにしおいたす。

これが私の解決策です async / awaitをサポヌトする環境を想定しおいたす


単䞀のトランスポヌトの堎合

const logTransport = new winston.transports.File({filename: '/log/app.log'})

global.log = winston.createLogger({transports: [logTransport]})

// helper to exit with a given return code, but only after the logger is finished
// this will return a Promise that will never resolve, thus halting execution
log.exit = (exit = 5) => {
  return new Promise(() => {
    logTransport.on('finished', () => process.exit(exit))
  })
}



耇数のトランスポヌトの堎合未テスト

`` `js
const logTransports = [new winston.transports.File{filename '/ log / app.log'}]

global.log = winston.createLogger{transports[logTransport]}

//指定されたリタヌンコヌドで終了するヘルパヌ。ただし、ロガヌが終了した埌のみ
//これは解決されないPromiseを返すため、実行が停止したす
log.exit =exit = 5=> {
新しいPromise=> {を返す
Promise.all
logTransports.maptransport => new Promiseresolve => transport.on 'finished'、resolve
.then=> process.exitexit
}
}

</details>
<br>
Then, call with `await` like:

```js
try {
  something()
} catch(e) {   
  //do something with the error
  await log.exit(5) // <--- nothing will happen past this line as the promise will never resolve!
  // <--- process will have exited before it reaches here
  trySomethingElse() // <--- this will never be called, and control wont return to the calling code
}

壊れた蚘録ではありたせんが、 winston-log-and-exitもこの問題を解決したす

非垞に特定のナヌスケヌスのみ。 プロセスが終了しないAWSLambdaではwinston-log-and-exitを䜿甚できたせんでしたが、実行間でフリヌズするため、ログは倱われたす。 たた、どのメッセヌゞが私の最埌のメッセヌゞであるかを知っおいるこずを前提ずしおいたすが、成功した実行パスでは垞にそうであるずは限りたせん。

@mscharley䞊蚘のawait゜リュヌションはナヌスケヌスで機胜したすか おそらくlog.exit()代わりに、より良いAPIはawait log.finish()で、すべおのトランスポヌトが曞き蟌みを完了するたで埅っおから、䜕でもできたす process.exitを呌び出し、lamda done呌び出したす

これは、りィンストンの内郚を陀いお、基本的にこの問題で私たちが掚進しおきたこずです。 なぜこれがプラグむンになるのでしょうか もっず頻繁に出おくるはずの䜕かのようです。 私たちがやっおいるこずは特別なこずではないず思いたすが、すべおのプロゞェクトでこの壁にぶ぀かりたした。そのため、最終的にりィンストンから離れたした。 特にプロセスの最埌゚ラヌが発生する可胜性が最も高い堎所でログを倱うこずは、少なくずも危険であるように思われたす。

log4js-nodeは、すべおのトランスポヌトをフラッシュし、 process.exit()などのコヌルバックを受け取るシャットダりンメ゜ッドを実装したした。 このようなものをりィンストンに远加できたすか

log4js-ノヌドそれはその埌です

曎新はありたすか 問題は非垞に珟実的です。

どのロギングシステムでも、埮積分は次のずおりです。

  • どうしおもログが必芁で、応答時間が遅くなるずいう代償を払っおも構わないず思っおいる堎合は、同期ロガヌを䜿甚しおください
  • 自分でprocess.exit()呌び出す堎合は、バッファリングされたメッセヌゞがクリアされるたで埅ちたす。 winstonの堎合、 winston-log-and-exitパッケヌゞがこれを行いたす。
  • 他のコヌドがprocess.exit()を呌び出しおいお、プラットフォヌムにon-exitフックがある堎合は、そのフックを䜿甚しお、バッファリングされたメッセヌゞがクリアされるたで埅ちたす。 winston-log-and-exitもそれを助けるこずができたす。
  • 出口フックのないAWSLambdaのようなプラットフォヌムを䜿甚しおいる堎合は、デヌタを倱うリスクずプラットフォヌムのメリットを亀換しおいるこずになりたす。

ちなみに、@ begin-ここでも、 log_and_exit()メ゜ッドはlog-4jsのshutdown()メ゜ッドず基本的に同じですが、提䟛されたログメッセヌゞがログに蚘録されるずいう远加の保蚌がありたす。

@jdthorpeしかし、 winston-log-and-exitはwinston3では簡単に機胜したせん

@VRuzhentsovああ、それは問題です。 圌らは本圓にそれに぀いお䜕かをすべきです。

@jdthorpeで修正したした

const transport = new Transport();
const logger = createLogger({
  transports: [
    transport 
  ]
})

logger.finish = (exitCode) => {
  transport.on('finish', () => process.exit(exitCode));
  transport.close();
};

const shutDown = (exitCode) => {
  logger.info('Shutting down');
  logger.finish(exitCode);
};

shutDown(1);

以䞋は私のために働きたす

logger.info('winston - info logged');
logger.error('winston - error logged');
process.nextTick(() => {
    process.exit(0)
})

@ redhat-raptor。 これはほずんどの堎合機胜したすが、わけではありたせん。 ちょうどあなたのバッファがnextTickが呌び出された時点でクリアされたこずが起こりたすが、接続に応じお、あなたのロガヌがオンに䟝存しおいるこず、これは簡単に倱われたメッセヌゞに぀ながる可胜性が...

このコヌドは私のために働いた

            logger.error(`No value specified for ${value} variable! Node will exit now...`);
            logger._flush(() => {
                process.exit(1);
            })

これはv3でネむティブにサポヌトされおいたせんか

https://github.com/winstonjs/winston/blob/master/README.md#awaiting -logs-to-be-written-in-winston

@danielweckいいえ、壊れおいたす16291504

6幎、そうです、_important_ずマヌクされたバグの堎合は6幎です。 ボヌダヌラむンが印象的です。

私はwaitForWinston()玄束を䜿甚したす

const winston = require('winston');

const fileTransport = new winston.transports.File({ name: 'file', filename: FILE_PATH });
const consoleTransport = new winston.transports.Console({ name: 'console', stderrLevels: ['error'] });
const transports = [
    fileTransport,
    consoleTransport
];
winston.configure({
    level: 'verbose',
    transports,
    format: winston.format.cli()
});
winston.log('info', 'TEST MSG');
try {
    await waitForWinston();
} catch (err) {
    console.log(err);
}
process.exit(0);
const waitForWinston = async () => {
    return new Promise(async (resolve, _reject) => {
        for (const transport of transports) {
            try {
                await closeWinstonTransportAndWaitForFinish(transport);
            } catch (err) {
                console.log(err);
            }
        }
        resolve();
    });
};
const closeWinstonTransportAndWaitForFinish = async (transport) => {
    if (!transport.close) {
        // e.g. transport.name === 'console'
        return Promise.resolve();
    }
    // e.g. transport.name === 'file'

    return new Promise(async (resolve, _reject) => {
        transport._doneFinish = false;
        function done() {
            if (transport._doneFinish) {
                return; // avoid resolving twice, for example timeout after successful 'finish' event
            }
            transport._doneFinish = true;
            resolve();
        }
        setTimeout(() => { // TODO: use a cancellable setInterval instead
            done();
        }, 5000); // just in case the 'finish' event never occurs
        const finished = () => {
            done();
        };

/* Update: `stream.end()` does not flush pending writes, so this solution is inadequate.  For some reason, in recent tests `transport.close();` + `transport.once('finish', ...);` works just fine ... not sure why this works now though! (it used to fail!) */

/*
        if (transport._stream) {
            transport._stream.once('finish', finished);
            transport._stream.end();
        }
*/
            transport.once('finish', finished);
            transport.close();
    });  
};

曎新 stream.end()は保留䞭の曞き蟌みをフラッシュしないため、この゜リュヌションは䞍十分です。 䜕らかの理由で、最近のテストではtransport.close(); + transport.once('finish', ...);は問題なく機胜したす...なぜ今これが機胜するのかわかりたせん 以前は倱敗しおいたした

䞊蚘の私の䜜業゜リュヌションでは、重芁なのは次を䜿甚するこずです。
transport._stream.once('finish', finished); transport._stream.end();
の代わりに
transport.once('finish', finished); transport.close();
远加されたタむムアりト戊略は私のナヌスケヌスに固有であり、䞀般的なケヌスではおそらくオプション/冗長です

より簡単な方法

logger.error(`No value specified for ${missing_vars.join(',')} variable! Node will exit now...`, () => {
            process.exit(1);
        });

@danielweckこれに察する解決策を芋぀けるこずができたしたか 最近Winston3.xにアップグレヌドしたしたが、2.xに戻るか、ここで解決策のない別のロガヌを芋぀ける必芁がある堎合がありたす。

@ matttowerssonos 、IIRC、これらの問題はすべおWinston @ 2に関連しおい

ずころで、 Winston @ 3でログが倱われるずいう問題は芋られないので、新しい問題に構成を含めるこずをお勧めしたす。

@cjbarthこれは機胜したせん

  process.on(type as any, (err: ErrorExtended) => {
    const processLogger: Logger = loggers.get('processLogger');

    processLogger.error(errorFormatter(err, type));

    processLogger.on('finish', function () {
      processLogger.end();
      console.log('never reaches here');
      process.exit(1);
    });
  });

processExit('uncaughtException');
// log and exit for unhandledRejection events.
processExit('unhandledRejection');

@stephanoparaskeva私が間違っおいなければ、 processLogger.end()呌び出さないため、 finishむベントがprocessLoggerこずはありたせん。 これを呌び出すず、Winstonのロギングが完了するず、 finishむベントが発生するはずです。

たた、 process.disconnect()代わりにprocess.exit()を䜿甚したす。これにより、キュヌが空になりたす。 キュヌが空になるず自動的に終了したす。

@stephanoparaskeva私が間違っおいなければ、 processLogger.end()呌び出さないため、 finishむベントがprocessLoggerこずはありたせん。 これを呌び出すず、Winstonのロギングが完了するず、 finishむベントが発生するはずです。

たた、 process.disconnect()代わりにprocess.exit()を䜿甚したす。これにより、キュヌが空になりたす。 キュヌが空になるず自動的に終了したす。

ガッチャ、だからこのようなもの

process.on(type as any, (err: ErrorExtended) => {
  const processLogger: Logger = loggers.get('processLogger');

  processLogger.error(errorFormatter(err, type));
  processLogger.end()

  processLogger.on('finish', function () {
    process.disconnect();
  });
});

// log and exit for uncaughtException events.
processExit('uncaughtException');
// log and exit for unhandledRejection events.
processExit('unhandledRejection');

@stephanoparaskevaそれは良く芋えたす。

通垞、 processLogger.end()呌び出す前にむベントハンドラヌをバむンドしたすが、 finishむベントはむベントルヌプが終了した埌にのみ発生するため、問題ではありたせん。その時点でハンドラヌがバむンドされたす。 むベントハンドラヌが最初にバむンドされるコヌドを曞くず、それがより明確になるず思いたす。

@cjbarth
ああ、どのようにむベントハンドラヌを䜕かにバむンドしたすか
それは

processLogger.on('finish', () => {
    this.process.disconnect();
  });

@stephanoparaskevaはい。 これは、関数をバむンドするための正しい構文です。

{
  this.process.disconnect();
}

オブゞェクトprocessLoggerによっお発行されたfinishむベントに。

それは私のために働きたす https 

process.exitを呌び出さずに、代わりに適切なシャットダりンを実行する堎合は、すべおの接続を閉じ、むベントルヌプがドレむンされるのを埅぀こずで、たったく問題はありたせん。

@deedfが䜕を指しおいるのかをよりよく理解するには、 https  //stackoverflow.com/a/37592669を参照しおください。 このアドバむスに埓っお、私にずっおもこの問題を軜枛したした。

フィニッシュむベントが䜕幎も経っおもただ出おこないずいう事実は、珟時点では恥ずかしいこずです。 これは、ロガヌを切り替えお、すべおのカスタムトランスポヌトを曞き盎さなければならないのは面倒です。

りィンストンがこれをただ解決しおいないのかわかりたせん。 コヌドの最初のロガヌのみがLogstashにログに蚘録されるずいう問題がありたすwinston-elasticsearchも䜿甚。 logger.endを䜿甚するず、すべおがログに蚘録されたすが、プログラムの終了が早すぎたす。 䞊蚘のすべおの゜リュヌションを䜿甚しおみたしたが、実際には機胜したせんでした。
私は本圓に無力です

りィンストンがこれをただ解決しおいないのかわかりたせん。 コヌドの最初のロガヌのみがLogstashにログに蚘録されるずいう問題がありたすwinston-elasticsearchも䜿甚。 logger.endを䜿甚するず、すべおがログに蚘録されたすが、プログラムの終了が早すぎたす。 䞊蚘のすべおの゜リュヌションを䜿甚しおみたしたが、実際には機胜したせんでした。
私は本圓に無力です

これを詊し

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

したがっお、この問題の解決策は、process.exitを呌び出さないこずです。

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

したがっお、この問題の解決策は、process.exitを呌び出さないこずです。

はい、nodejsでは垞に悪い考えです。https  //stackoverflow.com/a/37592669を参照しお

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

したがっお、この問題の解決策は、process.exitを呌び出さないこずです。

はい、nodejsでは垞に悪い考えです。https  //stackoverflow.com/a/37592669を参照しお

私が個人的にprocess.exitを䜿甚しおいる理由は、uncaughtExceptionずunhandledRejectionをリッスンしおすべおのトランスポヌトにログを蚘録し、アプリケヌションを終了するためです。 この問題を解決するためのより良い方法はありたすか

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

exitを䜿甚したず蚀ったのはどこでしたか

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

exitを䜿甚したず蚀ったのはどこでしたか

あなたの読曞ず理解の胜力がこのバグが䜕であるかを理解するのに十分であるず仮定しお申し蚳ありたせん。 タむトルをもう䞀床確認しおください。

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

exitを䜿甚したず蚀ったのはどこでしたか

あなたの読曞ず理解の胜力がこのバグが䜕であるかを理解するのに十分であるず仮定しお申し蚳ありたせん。 タむトルをもう䞀床確認しおください。

8幎間開かれおいる問題に遭遇し、適切な支揎をたったく提䟛しない堎合、あなたはずおも忙しいに違いありたせん。

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

したがっお、この問題の解決策は、process.exitを呌び出さないこずです。

はい、nodejsでは垞に悪い考えです。https  //stackoverflow.com/a/37592669を参照しお

私が個人的にprocess.exitを䜿甚しおいる理由は、uncaughtExceptionずunhandledRejectionをリッスンしおすべおのトランスポヌトにログを蚘録し、アプリケヌションを終了するためです。 この問題を解決するためのより良い方法はありたすか

私はしばらくりィンストンを䜿甚しおいたせんが、ずにかくそれはログに蚘録されたせんか そうでない堎合は、ログに蚘録した埌に゚ラヌを再スロヌしたせんか

この「問題」が「解決」されおいないのは、䜕もないので、人々がどうやっお理解できないのかわかりたせん。 exitを呌び出さずに適切なコヌドを曞くだけで、問題ありたせん。

exitを䜿甚したず蚀ったのはどこでしたか

あなたの読曞ず理解の胜力がこのバグが䜕であるかを理解するのに十分であるず仮定しお申し蚳ありたせん。 タむトルをもう䞀床確認しおください。

8幎間開かれおいる問題に遭遇し、適切な支揎をたったく提䟛しない堎合、あなたはずおも忙しいに違いありたせん。

少なくずも、資栌のあるガキのように泣き蚀を蚀うこずなく、自分の問題を解決するこずができたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡