2011-01-11 38 views
5

Tôi cần theo dõi bằng cách nào đó nhật ký LogCat, có nghĩa là trong khi dịch vụ của tôi đang chạy, tôi cần đọc LogCat cho các mục nhập mới. Tại thời điểm này tôi chỉ biết làm thế nào để lấy lại một khi Log:Làm cách nào để theo dõi chặt chẽ tệp LogCat?

Process mLogcatProc = null; 
    BufferedReader reader = null; 
    try 
    { 
      mLogcatProc = Runtime.getRuntime().exec(new String[] 
        {"logcat", "-d", "ActivityManager:I *:S" });   

      reader = new BufferedReader(new InputStreamReader 
    (mLogcatProc.getInputStream())); 

      String line; 
      final StringBuilder log = new StringBuilder(); 
      String separator = System.getProperty("line.separator"); 

      while ((line = reader.readLine()) != null) 
      { 
        log.append(line); 
        log.append(separator); 
      } 

Nếu tôi loại bỏ các tùy chọn -d nó sẽ không thoát khỏi nhưng cũng có thể nó sẽ không thể làm việc. Vậy làm thế nào tôi có thể sửa đổi mã dưới đây để tiếp tục đọc các mục mới từ LogCat?

+2

Tôi có thể hỏi tại sao bạn muốn làm điều này? Nghe có vẻ như một ý tưởng tồi tệ. – torkildr

+1

adb logcat? Tại sao bạn muốn logcat trong chương trình của bạn? –

+1

Bởi vì nó có vẻ là cách duy nhất để biết khi nào một hoạt động bắt đầu. Để làm gì ? Đối với ứng dụng bảo vệ ứng dụng. Giống như App Protector .. và nếu bạn nhìn vào các điều khoản cần đọc nhật ký hệ thống ... – Alex

Trả lời

2

Bạn có thể tạo một chuỗi mới để chạy logcat (không có tùy chọn -d) trong nền.

Lưu ý: Sử dụng các sự kiện bộ đệm thay vì quá trình ActivityManager, nó chính xác hơn. "logcat sự kiện -b"

6

Đây là cách tôi đã làm nó, sử dụng gợi ý Jiahao Liu:

ReadThread thread; 

public void startRecordingLogs() 
{ 
    if(thread == null || !thread.isAlive()) 
    { 
    ReadThread thread = new ReadThread(); 
    thread.start(); 
    } 
} 

public String stopRecordingLogs() 
{ 
    String results = thread.stopLogging(); 
    return results; 
} 

private class ReadThread extends Thread{ 

    String results; 
    Process process; 
    Object lockObject = new Object(); 

    public void run(){ 
    synchronized(lockObject) 
    { 
     process = Runtime.getRuntime().exec("logcat -v time");   

     reader = new BufferedReader(new InputStreamReader (process.getInputStream())); 

     String line; 
     final StringBuilder log = new StringBuilder(); 
     String separator = System.getProperty("line.separator"); 

     while ((line = reader.readLine()) != null) 
     { 
     log.append(line); 
     log.append(separator); 
     } 
    } 

    results = log.toString(); 
    } 

    public String stopLogging() 
    { 
    process.destroy(); 
    synchronized(lockObject) 
    { 
     return results; 
    } 
    } 
} 
+0

"kết quả" được định nghĩa ở đâu? – gonzobrains

+0

@gonzobrains Ngay dưới nơi lớp ReadThread được định nghĩa. – you786

+0

Có, nhưng trừ khi tôi xác định một "kết quả" khác ngoài lớp thì kết quả không được định nghĩa cho stopRecordingLogs(). – gonzobrains

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