私が作成しました:
var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
その後、パイプ処理されました:
process.stdout.pipe(access);
次に試してみました:
console.log("test");
そして/var/log/node/api.access.logには何も現れていません。しかし、この方法は機能しています:
process.stdout.pipe(access).write('test');
誰かが私が間違っていることを説明できますか?
この問題は次の方法で解決しました。
var access = fs.createWriteStream('/var/log/node/api.access.log');
process.stdout.write = process.stderr.write = access.write.bind(access);
もちろん、必要に応じてstdoutとstderrを分離することもできます。
また、キャッチされていない例外を処理することを強くお勧めします。
process.on('uncaughtException', function(err) {
console.error((err && err.stack) ? err.stack : err);
});
これは、次の状況をカバーします。
チェックアウトconsole.Console
、通常のconsole
の親クラス。
var myLogFileStream = fs.createWriteStream(pathToMyLogFile);
var myConsole = new console.Console(myLogFileStream, myLogFileStream);
その後、myConsole.log
、myConsole.error
、myConsole.dir
などを使用して、ファイルに直接書き込むことができます。
次のように monkey patchprocess.stdout.write
にすることもできます。
var fn = process.stdout.write;
function write() {
fn.apply(process.stdout, arguments);
myLogFileStream.write.apply(myLogFileStream, arguments);
}
process.stdout.write = write;
stdout
をファイルに記録する動機に応じて、console._stdout
を上書きする他のオプションもあります。
_process.stdout
_は書き込み可能です。 pipe
はReadable
(Cf StreamAPI documentation: https://nodejs.org/api/stream.html のメソッドです
_process.stdout
_のドキュメントはここで見ることができます: https://nodejs.org/api/process.html#process_process_stdout
エラーなしでprocess.stdout.pipe(...);
を実行できることは驚くべきことです。しかし、この呼び出しは何もしないと思います。 stdoutにバインドされた新しいWritableストリームを返すことを除きます(または、_process.stdout
_自体を返します。ドキュメントには仕様がありません)。
Stdoutをファイルにリダイレクトする場合、多くの解決策があります。
node myfile.js > api.access.log
_。process.stdout
_をあなた自身のストリームに置き換えることができるかもしれません(そして、あなたはこれで何でもできます)@ user3173842の返信は、この問題を次の方法で解決しました。
var access = fs.createWriteStream('/var/log/node/api.access.log');
process.stdout.write = process.stderr.write = access.write.bind(access);
https://github.com/nodejs/node/issues/7606 によれば、process.stdout
はprocess.on('exit')
の後に続くため、fs.WriteStream
はprocess.stdout
で終了することを理解しています。
開発者がfs.Writestream.write()
を通常の機能に戻したい場合、およびfs.Writestream.end
が呼び出されると、書き込みストリームが閉じます。開発者はこれをどうやってやろうと思いましたか
a_l = asyncify_listener
p_std_stream_m is a process stream manager object
p_std_stream_m.std_info.p_stdout_write = process.stdout.write
process.stdout.write = w_stream.write.bind(w_stream)
process.once('beforeExit', a_l( p_std_stream_m.handler,process.stdout,w_stream ) )
where in the 'beforeExit' event listener I did
process.stdout.write = p_std_stream_m.std_info.p_stdout_write
w_stream.end()
process.stdout
は現時点で多くの作業を行っているように見えるため、これは機能し、onceメソッドを使用します。これは良い習慣ですか、あなたはこれをしますか、この状況で何をしますか誰でも気軽に返信できます。