2012-01-24 34 views
30

tail -f logfile.txt xuất 10 dòng cuối cùng của logfile.txt và sau đó tiếp tục xuất dữ liệu được nối thêm khi tệp phát triển.Làm thế nào để xử lý `tail -f logfile.txt` giống như trong node.js?

Cách được khuyến nghị thực hiện phần -f trong node.js là gì?

Kết quả đầu ra sau toàn bộ tệp (bỏ qua "hiển thị 10 dòng cuối cùng") và sau đó thoát.

var fs = require('fs'); 
var rs = fs.createReadStream('logfile.txt', { flags: 'r', encoding: 'utf8'}); 
rs.on('data', function(data) { 
    console.log(data); 
}); 

Tôi hiểu sự kiện vòng lặp là thoát vì sau khi dòng cuối & sự kiện gần không có nhiều sự kiện - Tôi rất tò mò về cách tốt nhất để tiếp tục theo dõi dòng.

+0

http: // stackoverflow.com/questions/8224333/scrolling-log-file-tail-f-hoạt hình-sử dụng-javascript – gavenkoa

Trả lời

36

Cách kinh điển để thực hiện việc này là với fs.watchFile. Bạn có thể sử dụng the node-tail module, sử dụng fs.watchFile nội bộ và đã thực hiện công việc cho bạn. Dưới đây là một ví dụ của việc sử dụng nó trực tiếp từ các tài liệu:

Tail = require('tail').Tail; 

tail = new Tail("fileToTail"); 

tail.on("line", function(data) { 
    console.log(data); 
}); 
+0

Rất cám ơn - 'fs.watchFile' chính xác là những gì tôi đang tìm kiếm. Cũng cảm ơn vì đã chỉ ra mô-đun nút đuôi. – mike

+0

Hiện tại, 'fs.watchFile()' sử dụng phép bỏ phiếu stat. 'fs.watch()' có thể được sử dụng thay vào đó, nhưng 'fs.stat()' sẽ phải được sử dụng để tìm kích thước hiện tại và trước đó của tệp. – hexacyanide

+0

Mô-đun đuôi nút đã được cập nhật để sử dụng 'fs.watch()'. –

2

bạn có thể thử sử dụng fs.read thay vì ReadStream

var fs = require('fs') 

var buf = new Buffer(16); 
buf.fill(0); 
function read(fd) 
{ 
    fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buf1) { 
     console.log(buf1.toString()); 
     if (bytesRead != 0) { 
      read(fd); 
     } else { 
      setTimeout(function() { 
       read(fd); 
      }, 1000); 
     } 
    }); 
} 

fs.open('logfile', 'r', function(err, fd) { 
    read(fd); 
}); 

Lưu ý rằng đọc các cuộc gọi gọi lại ngay cả khi không có dữ liệu và nó chỉ đạt cuối tập tin. Nếu không có thời gian chờ bạn sẽ nhận được 100% cpu ở đây. Bạn có thể thử sử dụng fs.watchFile để nhận dữ liệu mới ngay lập tức.

6

node.js APi documentation trên fs.watchFile trạng thái:

Ổn định: 2 - ổn định. Sử dụng fs.watch thay vào đó, nếu có.

vui dù rằng nó nói gần điều tương tự chính xác cho fs.watch:

Ổn định: 2 - ổn định. Không có sẵn trên tất cả các nền tảng.

Trong mọi trường hợp, tôi đã đi trước và đã được nêu ra một webapp nhỏ, cổng sau, rằng ý chí đuôi tập tin của bạn bằng cách sử dụng biến thể fs.watch.

Vui lòng khám phá tại đây: TailGate on github.

1

Substack có mô-đun file slice hoạt động chính xác như tail -f, tệp có thể truyền trực tuyến các bản cập nhật sau khi cắt 10 dòng đầu tiên.

var sf = require('slice-file'); 

var xs = sf('/var/log/mylogfile.txt'); 
xs.follow(-10).pipe(process.stdout); 

Nguồn: https://github.com/substack/slice-file#follow

1

https://github.com/jandre/always-tail dường như là một lựa chọn tuyệt vời nếu bạn phải lo lắng về log xoay, ví dụ từ readme:

var Tail = require('always-tail'); 
var fs = require('fs'); 
var filename = "/tmp/testlog"; 

if (!fs.existsSync(filename)) fs.writeFileSync(filename, ""); 

var tail = new Tail(filename, '\n'); 

tail.on('line', function(data) { 
    console.log("got line:", data); 
}); 


tail.on('error', function(data) { 
    console.log("error:", data); 
}); 

tail.watch(); 
Các vấn đề liên quan