2014-04-10 14 views
10

Tôi đang làm việc trên một chương trình giám sát đọc tệp /var/log/auth.log. Tôi đang sử dụng Apache Commons IO Tailer lớp để đọc tệp trong thời gian thực. Để bắt đầu, tôi muốn kiểm tra phần đọc thời gian thực trên một tệp đơn giản và nhập thủ công một số mã trong dòng điều khiển. Đây là mã của tôi:Ví dụ về Apache Commons IO Tailer

public class Main { 
    public static void main(String[] args) { 
     TailerListener listener = new MyListener(); 
     Tailer tailer = Tailer.create(new File("log.txt"), listener, 500); 
     while(true) { 

     } 
    } 
} 

public class MyListener extends TailerListenerAdapter { 
    @Override 
    public void handle(String line) { 
     System.out.println(line); 
    } 
} 

Và từ nhà ga: sudo echo "Hello" >> log.txt Vấn đề là khi tôi cố gắng viết bằng tay một cái gì đó trong tập tin, nó không in nó trong giao diện điều khiển. Tôi đã cố gắng tìm một ví dụ cụ thể về cách sử dụng lớp Tailer, nhưng không may mắn. Tôi làm gì sai ở đây?

+0

'while (true) {}' không bao giờ là ý hay. Bạn có đang khởi chạy MyListener trong một chuỗi riêng biệt không? Bạn nên thêm ít nhất một 'Thread.sleep (...)' vào vòng lặp của bạn. – SebastianH

+0

Tôi không chắc tại sao bạn lại bị bỏ phiếu. Có vẻ như một câu hỏi rõ ràng với mã chứng minh vấn đề. –

+0

bạn có thể đánh giá nó không? Tôi đã cố gắng làm rõ, phơi bày vấn đề và hiển thị mẫu mã của tôi. Tôi tôn trọng điều kiện của stackoverflow – user2435860

Trả lời

14

Dựa trên thử nghiệm của tôi, Tailer sẽ chỉ in một dòng khi bạn đã thêm dòng mới vào tệp. Vì vậy, hãy thử sudo echo "Hello\n" >> log.txt

Cũng lưu ý rằng nếu bạn gọi create, bạn bắt đầu một chuỗi nhưng không xử lý được. Do đó tại sao bạn phải có một vòng lặp while/true.

Bạn có thể thử này để thay thế:

public static void main(String[] args) { 
    TailerListener listener = new MyListener(); 
    Tailer tailer = new Tailer(new File("log.txt"), listener, 500);   
    tailer.run(); 
} 
+1

OK, vì vậy tôi đã làm những gì bạn nói, và nó đang hoạt động. Một điều mặc dù, tôi in đầu ra hai lần. ví dụ, nếu tôi cố gắng viết vào echo "Hello" >> log.txt, nó sẽ in "Hello" hai lần trong giao diện điều khiển. Tại sao vậy? – user2435860

+2

@ user2435860 Tôi đoán đó là vì bạn vẫn có 'Tailer tailer = Tailer.create' thay vì' Tailer tailer = new Tailer'? Sai lầm đó sẽ khiến cho bạn có hai luồng chạy, mỗi lần in để xuất chuẩn. –

+0

Cảm ơn bạn rất nhiều, đã giải quyết được vấn đề của tôi. Tôi nghĩ rằng việc sử dụng tạo là cách duy nhất để tạo một cá thể mới. Tôi có cảm giác rằng các nhà xây dựng không phải là công khai, vì vậy đây là lý do tại sao tôi sử dụng phương pháp tha Factory bằng cách sử dụng tạo ra. Bây giờ nó hoạt động hoàn hảo. Bây giờ tôi có thể chuyển sang bước tiếp theo đang phân tích cú pháp. Cảm ơn rất nhiều! Chúc mừng! – user2435860

1

Mã của bạn nên làm việc. Đối với tôi, điều này hoạt động như mong đợi.

package de.lhorn.stackoverflowplayground; 

import java.io.File; 
import org.apache.commons.io.input.Tailer; 
import org.apache.commons.io.input.TailerListenerAdapter; 

public class App { 

    private static final int SLEEP = 500; 

    public static void main(String[] args) throws Exception { 
     App app = new App(); 
     app.run(); 
    } 

    private void run() throws InterruptedException { 
     MyListener listener = new MyListener(); 
     Tailer tailer = Tailer.create(new File("/tmp/log.txt"), listener, SLEEP); 
     while (true) { 
      Thread.sleep(SLEEP); 
     } 
    } 

    public class MyListener extends TailerListenerAdapter { 

     @Override 
     public void handle(String line) { 
      System.out.println(line); 
     } 

    } 
} 
+0

Tôi quản lý để làm cho nó hoạt động, vấn đề của tôi bây giờ là nó in mỗi dòng hai lần, làm thế nào cand tôi giải quyết này? – user2435860