Làm cách nào để có được logfile từ thiết bị Android?


129

Tôi muốn kéo tệp nhật ký từ thiết bị sang PC. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


112

Logcollector là một lựa chọn tốt nhưng bạn cần cài đặt nó trước.

Khi tôi muốn nhận logfile để gửi qua thư, tôi thường làm như sau:


Lệnh này không làm việc cho tôi, tôi nhận được đầu ra này. logcat đọc: Đối số không hợp lệ
neoneye

5
lưu ý rằng logcollector không hoạt động đối với các phiên bản Android trên 4.1 vì các ứng dụng hiện chỉ được phép đọc các mục nhật ký của riêng chúng. ( Groups.google.com/forum/#!topic/android-log-collector/ từ )
Matthew Lowe

11
Không có phương pháp đơn giản nào , một cách nào đó chỉ đơn giản là kéo logfile khỏi thiết bị một khi nó được kết nối qua USB như một thiết bị lưu trữ ngoài, mà không cần phải cài đặt adb hay bất cứ thứ gì tương tự?
HOẶC Mapper

Hãy chắc chắn rằng bạn đang ở đúng thư mục để chạy adb. Thường là trongC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

30

Tôi hy vọng mã này sẽ giúp được ai đó. Tôi mất 2 ngày để tìm ra cách đăng nhập từ thiết bị và sau đó lọc nó:

public File extractLogToFileAndWeb(){
        //set a file
        Date datum = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALY);
        String fullName = df.format(datum)+"appLog.log";
        File file = new File (Environment.getExternalStorageDirectory(), fullName);

        //clears a file
        if(file.exists()){
            file.delete();
        }


        //write log to file
        int pid = android.os.Process.myPid();
        try {
            String command = String.format("logcat -d -v threadtime *:*");        
            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder result = new StringBuilder();
            String currentLine = null;

            while ((currentLine = reader.readLine()) != null) {
                   if (currentLine != null && currentLine.contains(String.valueOf(pid))) {
                       result.append(currentLine);
                       result.append("\n");
                    }
            }

            FileWriter out = new FileWriter(file);
            out.write(result.toString());
            out.close();

            //Runtime.getRuntime().exec("logcat -d -v time -f "+file.getAbsolutePath());
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }


        //clear the log
        try {
            Runtime.getRuntime().exec("logcat -c");
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }

        return file;
    }

như được chỉ ra bởi @mehdok

thêm quyền vào bảng kê khai để đọc nhật ký

<uses-permission android:name="android.permission.READ_LOGS" />

1
điều này hoạt động tốt, nhưng để hoạt động trên mọi thiết bị bạn cần<uses-permission android:name="android.permission.READ_LOGS" />
mehdok

27

Tôi sẽ sử dụng một cái gì đó thuộc loại này:

$adb logcat -d > logcat.txt

Tùy chọn -d sẽ chuyển toàn bộ bộ đệm tròn vào tệp văn bản và nếu bạn đang tìm kiếm một hành động / ý định cụ thể, hãy thử

$adb logcat -d | grep 'com.whatever.you.are.looking.for' -B 100 -A 100 > shorterlog.txt

Hi vọng điêu nay co ich :)


13

Đối với những người không quan tâm đến việc gỡ lỗi USB hoặc sử dụng, adbcó một giải pháp dễ dàng hơn. Trong Android 6 (Không chắc chắn về phiên bản trước), có một tùy chọn trong các công cụ dành cho nhà phát triển: Báo cáo lỗi

Nhấp vào tùy chọn này sẽ chuẩn bị báo cáo lỗi và nhắc bạn lưu nó vào ổ đĩa hoặc gửi nó qua email.

Tôi thấy đây là cách dễ nhất để lấy nhật ký. Tôi không muốn bật gỡ lỗi USB.


1
Chính xác những gì tôi đang tìm kiếm!
YYamil

1
Tôi tìm thấy nó chính xác ở đâu?
gurehbgui

11

BIÊN TẬP:

Nhật ký nội bộ là một bộ đệm tròn trong bộ nhớ. Thực tế, có một vài bộ đệm tròn như vậy cho mỗi: radio, sự kiện, chính. Mặc định là chính.

Để có được một bản sao của bộ đệm, một kỹ thuật bao gồm thực hiện một lệnh trên thiết bị và lấy đầu ra dưới dạng một biến chuỗi.

SendLog là một ứng dụng mã nguồn mở thực hiện điều này: http://www.l6n.org/android/sendlog.shtml

Chìa khóa là chạy logcattrên thiết bị trong HĐH nhúng. Nó không khó như âm thanh, chỉ cần kiểm tra ứng dụng nguồn mở trong liên kết.


Điều này đưa đầu ra ra màn hình, tôi cần nó trong một tập tin.
Pentium10

Bạn có thể gửi nhật ký với aLogCat. Hoặc đơn giản là sao chép-dán từ DDMS: P
molnarm

@molnarm Tôi thừa nhận câu trả lời của tôi hơi quá kỹ nếu đó là tất cả những gì anh ấy cần làm =)
Brad Hein

@BradHein Bạn nói SendLog là mã nguồn mở nhưng dường như tôi không thể tìm thấy mã nguồn. Bất cứ ý tưởng nó ở đâu?
smith324

8

Thường thì tôi nhận được lỗi " logcat read: Invalid argument". Tôi đã phải xóa nhật ký, trước khi đọc từ nhật ký.

Tôi thích điều này:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt

Cảm ơn! Tôi đã có lỗi đó trong một thời gian dài, logcat -c đã sửa nó ngay lập tức!
Jords

4

Một cách đơn giản là tạo các phương thức thu thập nhật ký của riêng bạn hoặc thậm chí chỉ là một ứng dụng thu thập nhật ký hiện có từ thị trường.

Đối với các ứng dụng của mình, tôi đã tạo một chức năng báo cáo để gửi nhật ký đến email của mình (hoặc thậm chí đến một nơi khác - một khi bạn nhận được nhật ký, bạn có thể thực hiện cho dù bạn muốn với nó).

Dưới đây là một ví dụ đơn giản về cách lấy tệp nhật ký từ thiết bị:


3

Đơn giản chỉ cần chạy lệnh sau để có được đầu ra đến thiết bị đầu cuối của bạn:

adb shell logcat

3

Tôi biết đó là một câu hỏi cũ, nhưng tôi tin rằng vẫn còn hiệu lực ngay cả trong năm 2018.

Có một tùy chọn để báo cáo lỗi ẩn trong tùy chọn Nhà phát triển trong mọi thiết bị Android.

LƯU Ý: Điều này sẽ đổ toàn bộ nhật ký hệ thống

Làm thế nào để kích hoạt tùy chọn nhà phát triển? xem: https://developer.android.com/studio/debug/dev-options

Những gì làm việc cho tôi:

  1. Khởi động lại thiết bị của bạn (để tạo nhật ký rác tối thiểu để nhà phát triển phân tích)
  2. Tái tạo lỗi của bạn
  3. Chuyển đến Cài đặt -> Tùy chọn nhà phát triển -> Báo cáo lỗi
  4. Đợi hệ thống Android thu thập nhật ký (xem thanh tiến trình trong thông báo)
  5. Khi nó hoàn thành, hãy nhấn vào thông báo để chia sẻ nó (bạn có thể sử dụng gmail hoặc bất cứ ai khác)

Làm thế nào để đọc điều này? mở bugreport-1960-01-01-hh-mm-ss.txt

bạn có thể muốn tìm kiếm một cái gì đó như thế này:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of crash
06-13 14:37:36.542 19294 19294 E AndroidRuntime: FATAL EXCEPTION: main

hoặc là:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main

2

Nhờ user1354692 tôi có thể làm cho nó dễ dàng hơn, chỉ với một dòng! người mà anh ấy đã bình luận:

try {
    File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
    Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}

Đâu là nơi tốt nhất để đặt mã này? trong OnCreate?
Youngjae

2

Tôi đã tạo một thư viện nhỏ (.aar) để lấy nhật ký qua email. Bạn có thể sử dụng nó với tài khoản Gmail. Nó khá đơn giản nhưng hoạt động. Bạn có thể lấy một bản sao từ đây

Trang web bằng tiếng Tây Ban Nha, nhưng có một bản PDF với phiên bản tiếng Anh của mô tả sản phẩm.

Tôi hy vọng nó có thể giúp đỡ.


2

Hai bước:

  • Tạo nhật ký
  • Tải Gmail để gửi nhật ký

.

  1. Tạo nhật ký

    File generateLog() {
        File logFolder = new File(Environment.getExternalStorageDirectory(), "MyFolder");
        if (!logFolder.exists()) {
            logFolder.mkdir();
        }
        String filename = "myapp_log_" + new Date().getTime() + ".log";
    
        File logFile = new File(logFolder, filename);
    
        try {
            String[] cmd = new String[] { "logcat", "-f", logFile.getAbsolutePath(), "-v", "time", "ActivityManager:W", "myapp:D" };
            Runtime.getRuntime().exec(cmd);
            Toaster.shortDebug("Log generated to: " + filename);
            return logFile;
        }
        catch (IOException ioEx) {
            ioEx.printStackTrace();
        }
    
        return null;
    }
  2. Tải Gmail để gửi nhật ký

    File logFile = generateLog();
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(logFile));
    intent.setType("multipart/");
    startActivity(intent);

Tài liệu tham khảo cho # 1

~ ~

Đối với # 2 - có rất nhiều câu trả lời khác nhau về cách tải tệp nhật ký để xem và gửi. Cuối cùng, giải pháp ở đây thực sự có hiệu quả với cả hai:

  • tải Gmail dưới dạng tùy chọn
  • đính kèm tập tin thành công

Xin chân thành cảm ơn https://stackoverflow.com/a/22367055/2162226 vì câu trả lời hoạt động chính xác


0

Trước tiên, hãy đảm bảo lệnh adb có thể được thực thi bằng cách đặt PATH cho các công cụ nền tảng sdk của Android:

export PATH=/Users/espireinfolabs/Desktop/soft/android-sdk-mac_x86/platform-tools:$PATH

sau đó chạy:

adb shell logcat > log.txt

HOẶC di chuyển đầu tiên đến công cụ nền tảng adb:

cd /Users/user/Android/Tools/android-sdk-macosx/platform-tools 

sau đó chạy

./adb shell logcat > log.txt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.