ฉันจะรับ logfile จากอุปกรณ์ Android ได้อย่างไร


129

ฉันต้องการดึงไฟล์บันทึกจากอุปกรณ์ไปยังพีซีของฉัน ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


112

Logcollectorเป็นตัวเลือกที่ดี แต่คุณต้องติดตั้งก่อน

เมื่อฉันต้องการให้ logfile ส่งทางไปรษณีย์ฉันมักจะทำสิ่งต่อไปนี้:


commandline นี้ไม่ทำงานสำหรับฉันฉันได้รับผลลัพธ์นี้ logcat อ่าน: อาร์กิวเมนต์ไม่ถูกต้อง
neoneye

5
โปรดทราบว่า logcollector ไม่สามารถใช้งานได้กับ Android รุ่นที่สูงกว่า 4.1 เนื่องจากขณะนี้แอปพลิเคชันได้รับอนุญาตให้อ่านรายการบันทึกของตนเองเท่านั้น ( groups.google.com/forum/#!topic/android-log-collector/ … )
Matthew Lowe

11
ไม่มีวิธีการใด ๆง่ายๆที่จะดึง logfile จากอุปกรณ์เมื่อเชื่อมต่อผ่าน USB เป็นอุปกรณ์จัดเก็บข้อมูลภายนอกโดยไม่จำเป็นต้องติดตั้งadbหรืออะไรอย่างนั้น?
หรือผู้ทำแผนที่

adbตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเรกทอรีที่เหมาะสมในการทำงาน โดยปกติในC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

30

ฉันหวังว่ารหัสนี้จะช่วยให้ใครบางคน ฉันใช้เวลา 2 วันเพื่อหาวิธีการล็อกจากอุปกรณ์แล้วกรอง:

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;
    }

ตามที่ @mehdok ชี้

เพิ่มสิทธิ์ในรายการสำหรับการอ่านบันทึก

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

1
ใช้งานได้ดี แต่ใช้งานได้กับทุกอุปกรณ์ที่คุณต้องการ<uses-permission android:name="android.permission.READ_LOGS" />
mehdok

27

ฉันจะใช้สิ่งนี้ประเภท:

$adb logcat -d > logcat.txt

ตัวเลือก -d ดัมพ์บัฟเฟอร์วงกลมทั้งหมดลงในไฟล์ข้อความและหากคุณกำลังมองหาการดำเนินการ / ความพยายามโดยเฉพาะ

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

หวังว่าจะช่วย :)


13

สำหรับผู้ที่ไม่สนใจการดีบัก USB หรือใช้งานadbจะมีวิธีแก้ไขที่ง่ายกว่า ใน Android 6 (ไม่แน่ใจเกี่ยวกับรุ่นก่อนหน้า) มีตัวเลือกภายใต้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์: ใช้รายงานข้อผิดพลาด

การคลิกตัวเลือกนี้จะจัดทำรายงานข้อผิดพลาดและแจ้งให้คุณบันทึกลงในไดรฟ์หรือส่งมาทางอีเมล

ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดในการรับบันทึก ฉันไม่ชอบเปิดการดีบัก USB


1
สิ่งที่ฉันกำลังมองหา!
YYamil

1
ฉันจะหามันได้ที่ไหนกันแน่?
gurehbgui

11

แก้ไข:

บันทึกภายในคือบัฟเฟอร์แบบวงกลมในหน่วยความจำ จริงๆแล้วมีบัฟเฟอร์วงกลมสองสามตัวสำหรับวิทยุกิจกรรมหลัก ค่าเริ่มต้นคือหลัก

ในการรับสำเนาของบัฟเฟอร์หนึ่งเทคนิคเกี่ยวข้องกับการดำเนินการคำสั่งบนอุปกรณ์และรับเอาท์พุทเป็นตัวแปรสตริง

SendLog เป็นแอปโอเพนซอร์ซซึ่งทำได้เพียงแค่นี้: http://www.l6n.org/android/sendlog.shtml

กุญแจสำคัญคือการทำงานlogcatบนอุปกรณ์ในระบบปฏิบัติการฝังตัว มันไม่ยากอย่างที่คิดฟังแค่ไปที่แอพโอเพนซอร์สในลิงค์


สิ่งนี้ทิ้งผลลัพธ์ไปที่หน้าจอฉันต้องการมันเป็นไฟล์
Pentium10

คุณสามารถส่งบันทึกด้วย aLogCat หรือเพียงคัดลอกวางจาก DDMS: P
molnarm

@molnarm ผมยอมรับคำตอบของฉันถูกเล็กน้อยในช่วงวิศวกรรมถ้านั่นคือทั้งหมดที่เขาต้องทำ =)
แบรด Hein

@BradHein คุณบอกว่า SendLog เป็นโอเพ่นซอร์ส แต่ดูเหมือนว่าฉันจะไม่พบซอร์สโค้ด คิดอะไรอยู่ที่ไหน
smith324

8

ฉันมักจะได้รับข้อผิดพลาด " logcat read: Invalid argument" ฉันต้องล้างบันทึกก่อนอ่านจากบันทึก

ฉันทำสิ่งนี้:

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

ขอบคุณ! ฉันมีข้อผิดพลาดเป็นเวลานาน logcat นั้น -c แก้ไขมันทันที!
Jords

4

วิธีง่ายๆคือการสร้างวิธีการเก็บบันทึกของคุณเองหรือแม้กระทั่งเพียงแค่แอปบันทึกที่มีอยู่จากตลาด

สำหรับแอพของฉันฉันได้สร้างฟังก์ชั่นรายงานซึ่งจะส่งบันทึกไปยังอีเมลของฉัน (หรือแม้แต่ที่อื่น - เมื่อคุณได้รับบันทึกแล้วคุณสามารถทำได้ไม่ว่าคุณจะต้องการ)

นี่คือตัวอย่างง่ายๆเกี่ยวกับวิธีรับไฟล์บันทึกจากอุปกรณ์:


3

ง่าย ๆ แค่รันคำสั่งต่อไปนี้เพื่อรับเอาต์พุตไปยังเทอร์มินัลของคุณ:

adb shell logcat

3

ฉันรู้ว่ามันเป็นคำถามเก่า แต่ฉันเชื่อว่ายังใช้ได้แม้กระทั่งในปี 2018

มีตัวเลือกในการใช้รายงานข้อผิดพลาดที่ซ่อนอยู่ในตัวเลือกนักพัฒนาในทุกอุปกรณ์ Android

หมายเหตุ: นี่จะดัมพ์บันทึกของระบบทั้งหมด

วิธีเปิดใช้งานตัวเลือกนักพัฒนาซอฟต์แวร์ ดู: https://developer.android.com/studio/debug/dev-options

อะไรที่เหมาะกับฉัน:

  1. รีสตาร์ทอุปกรณ์ของคุณ (เพื่อสร้างบันทึกขยะขั้นต่ำสำหรับนักพัฒนาในการวิเคราะห์)
  2. สร้างข้อผิดพลาดของคุณอีกครั้ง
  3. ไปที่การตั้งค่า -> ตัวเลือกสำหรับนักพัฒนา -> ทำรายงานข้อผิดพลาด
  4. รอให้ระบบ Android รวบรวมบันทึก (ดูแถบความคืบหน้าในการแจ้งเตือน)
  5. เมื่อเสร็จสิ้นแล้วให้แตะการแจ้งเตือนเพื่อแชร์ (คุณสามารถใช้ gmail หรือสิ่งอื่นใดก็ได้)

วิธีการอ่านนี้ open bugreport-1960-01-01-hh-mm-ss.txt

คุณอาจต้องการมองหาสิ่งนี้:

------ 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

หรือ:

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

2

ขอบคุณ user1354692 ฉันสามารถทำให้มันง่ายขึ้นด้วยบรรทัดเดียวเท่านั้น! คนที่เขาแสดงความคิดเห็น:

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

ที่ที่ดีที่สุดในการวางรหัสนี้อยู่ที่ไหน ในOnCreate?
ยองแจ

2

ฉันได้สร้างห้องสมุดขนาดเล็ก (.aar) เพื่อดึงบันทึกทางอีเมล คุณสามารถใช้กับบัญชี Gmail มันค่อนข้างง่าย แต่ใช้งานได้ คุณสามารถรับสำเนาได้จากที่นี่

เว็บไซต์เป็นภาษาสเปน แต่มี PDF พร้อมคำอธิบายผลิตภัณฑ์เวอร์ชันภาษาอังกฤษ

ฉันหวังว่ามันจะช่วยได้


2

สองขั้นตอน:

  • สร้างบันทึก
  • โหลด Gmail เพื่อส่งบันทึก

.

  1. สร้างบันทึก

    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. โหลด Gmail เพื่อส่งบันทึก

    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);

การอ้างอิงสำหรับ # 1

~~

สำหรับ # 2 - มีคำตอบต่าง ๆ มากมายสำหรับวิธีการโหลดไฟล์บันทึกเพื่อดูและส่ง ในที่สุดโซลูชันที่นี่ใช้งานได้จริงกับทั้งสอง:

  • โหลด Gmail เป็นตัวเลือก
  • แนบไฟล์สำเร็จ

ขอบคุณมากที่https://stackoverflow.com/a/22367055/2162226สำหรับคำตอบที่ถูกต้อง


0

ก่อนอื่นตรวจสอบให้แน่ใจว่าคำสั่ง adb นั้นสามารถเรียกใช้งานได้โดยการตั้งค่า PATH เป็น android sdk platform-tools:

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

จากนั้นเรียกใช้:

adb shell logcat > log.txt

หรือย้ายไปที่เครื่องมือแพลตฟอร์ม adb ก่อน:

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

จากนั้นเรียกใช้

./adb shell logcat > log.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.