2015-09-22 16 views
9

Tôi đã tạo:Chuyển hướng stdout nộp nodejs

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' }); 

Sau đó cấp nước tập trung:

process.stdout.pipe(access); 

Sau đó cố gắng:

console.log("test"); 

Và không có gì đã xuất hiện trong thư mục/var/log/nút/api.access.log. Tuy nhiên, cách này đang hoạt động:

process.stdout.pipe(access).write('test'); 

Ai đó có thể giải thích tôi đang làm gì sai?

+0

yeah Tôi thực sự ngạc nhiên khi bạn có thể gọi đường ống trên một ghi có thể không có lỗi, điều gì sẽ xảy ra với điều đó? –

Trả lời

1

process.stdout là Có thể ghi. pipe là một phương pháp của tài liệu Readable (Cf StreamAPI: https://nodejs.org/api/stream.html

Bạn có thể xem tài liệu của process.stdout đây: https://nodejs.org/api/process.html#process_process_stdout

Thật ngạc nhiên mà bạn có thể làm process.stdout.pipe(...); mà không cần bất kỳ lỗi Nhưng tôi cho rằng cuộc gọi này chỉ là không làm gì cả.. Ngoại trừ việc trả về một luồng có thể ghi mới được liên kết với stdout (hoặc có thể nó tự trả về số process.stdout. Không có thông số kỹ thuật nào trong tài liệu đó)

Nếu bạn muốn chuyển hướng stdout sang tệp, bạn có nhiều giải pháp:

  • Chỉ cần sử dụng dòng lệnh của bạn để thực hiện điều đó. Kiểu Windows: node myfile.js > api.access.log.
  • Thay thế đối tượng bảng điều khiển theo đối tượng của riêng bạn. Và bạn có thể viết lại các phương thức console.
  • Tôi không chắc chắn, nhưng nó có thể là có thể thay thế process.stdout với luồng của riêng bạn (và bạn có thể làm bất cứ điều gì bạn muốn với điều này)
+0

Cảm ơn. Câu trả lời của bạn là hữu ích. Bây giờ tôi quyết định viết lại phương thức console.log, nhưng hy vọng sẽ tìm ra giải pháp xây dựng hơn. – Supervision

+0

vâng tôi thực sự ngạc nhiên rằng bạn có thể gọi đường ống trên một ghi mà không có một lỗi, những gì là với điều đó? –

+0

Theo nodejs [doc chính thức] (https://nodejs.org/api/process.html#process_process_stdout) process.stdout là một dòng song công – Alex

15

tôi giải quyết vấn đề này theo cách sau:

var access = fs.createWriteStream('/var/log/node/api.access.log'); 
process.stdout.write = process.stderr.write = access.write.bind(access); 

Tất nhiên bạn cũng có thể tách riêng stdout và stderr nếu muốn.

Tôi cũng xin đề nghị để xử lý ngoại lệ còn tự do:

process.on('uncaughtException', function(err) { 
    console.error((err && err.stack) ? err.stack : err); 
}); 

này sẽ bao gồm các trường hợp sau đây:

  • process.stdout.write
  • process.stderr.write
  • console.log
  • console.dir
  • console.error
  • someStream.pipe (quy trình.stdout);
  • ném Lỗi mới ('Sự cố');
  • ném 'không bao giờ làm điều này';
  • ném không xác định;
+1

Hãy mệt mỏi nếu bạn ghi đè lên 'process.stdout.write' bạn có thể không còn ghi vào bàn điều khiển nữa. – richardpringle

+0

Không phải là phần 'uncaughtException' sẽ sao chép cùng một thông báo lỗi trong tệp nhật ký đó là stderr vẫn được chuyển hướng đến tệp không? – user36476

+0

@ user36476 Không, vì nút chỉ in thông báo đó nếu không có người nghe cho sự kiện uncaughtException. – user3173842

0

Thanh toán console.Console, lớp cha của thông thường console.

var myLogFileStream = fs.createWriteStream(pathToMyLogFile); 

var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

Bạn có thể sau đó bạn sử dụng myConsole.log, myConsole.error, myConsole.dir, vv và viết trực tiếp đến tập tin của bạn.

Bạn cũng monkey patchprocess.stdout.write thể như sau:

var fn = process.stdout.write; 

function write() { 
    fn.apply(process.stdout, arguments); 
    myLogFileStream.write.apply(myLogFileStream, arguments); 
} 

process.stdout.write = write; 

cũng có những lựa chọn khác cho ghi đè console._stdout tùy thuộc vào động lực để đăng nhập các stdout vào một tập tin.

Các vấn đề liên quan