Bagaimana cara saya mendapatkan file log dari perangkat Android?

129

Saya ingin menarik file log dari perangkat ke PC saya. Bagaimana saya bisa melakukan itu?

Pentium10
sumber

Jawaban:

112

Logcollector adalah opsi yang bagus tetapi Anda harus menginstalnya terlebih dahulu.

Ketika saya ingin agar file log dikirim melalui surat, saya biasanya melakukan hal berikut:

Makarse
sumber
Baris perintah ini tidak berfungsi untuk saya, saya mendapatkan output ini. logcat baca: Argumen tidak valid
neoneye
5
perhatikan bahwa logcollector tidak berfungsi untuk versi android di atas 4.1 karena aplikasi sekarang hanya diperbolehkan untuk membaca entri log mereka sendiri. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe
11
Apakah tidak ada metode sederhana , beberapa cara untuk hanya menarik logfile dari perangkat setelah terhubung melalui USB sebagai perangkat penyimpanan eksternal, tanpa perlu menginstal adb atau semacamnya?
ATAU Mapper
Pastikan Anda berada di direktori yang benar untuk dijalankan adb. Biasanya diC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol
30

Saya harap kode ini akan membantu seseorang. Saya butuh 2 hari untuk mencari cara log dari perangkat, dan kemudian menyaringnya:

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

seperti yang ditunjukkan oleh @mehdok

tambahkan izin ke manifes untuk membaca log

<uses-permission android:name="android.permission.READ_LOGS" />
pengguna1354692
sumber
1
ini berfungsi dengan baik, tetapi berfungsi pada setiap perangkat yang Anda butuhkan<uses-permission android:name="android.permission.READ_LOGS" />
mehdok
27

Saya akan menggunakan sesuatu seperti ini:

$adb logcat -d > logcat.txt

Opsi -d membuang seluruh buffer melingkar ke file teks dan jika Anda mencari tindakan / niat tertentu, cobalah

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

Semoga ini membantu :)

Rohit
sumber
13

Bagi mereka yang tidak tertarik dengan USB debugging atau menggunakan adbada solusi yang lebih mudah. Di Android 6 (Tidak yakin tentang versi sebelumnya) ada opsi di bawah alat pengembang: Ambil Laporan Bug

Mengklik opsi ini akan menyiapkan laporan bug dan meminta Anda untuk menyimpannya untuk drive atau mengirimnya dalam email.

Saya menemukan ini sebagai cara termudah untuk mendapatkan log. Saya tidak suka menyalakan USB debugging.

jjhavokk
sumber
1
Persis apa yang saya cari!
YYamil
1
Di mana tepatnya saya menemukannya?
gurehbgui
11

EDIT:

Log internal adalah buffer melingkar dalam memori. Sebenarnya ada beberapa buffer melingkar untuk masing-masing: radio, acara, utama. Standarnya adalah utama.

Untuk mendapatkan salinan buffer, satu teknik melibatkan mengeksekusi perintah pada perangkat dan mendapatkan output sebagai variabel string.

SendLog adalah aplikasi open source yang melakukan hal ini: http://www.l6n.org/android/sendlog.shtml

Kuncinya adalah menjalankan logcatperangkat di OS yang disematkan. Ini tidak sesulit kedengarannya, cukup periksa aplikasi open source di tautan.

Brad Hein
sumber
Ini membuang output ke layar, saya membutuhkannya dalam file.
Pentium10
Anda dapat mengirim log dengan aLogCat. Atau cukup salin-tempel dari DDMS: P
molnarm
@ Molnarm Saya mengakui jawaban saya sedikit over-engineered jika hanya itu yang perlu dia lakukan =)
Brad Hein
@BradHein Anda berkata bahwa SendLog adalah open source, tetapi sepertinya saya tidak dapat menemukan kode sumbernya. Tahu di mana itu?
smith324
8

Seringkali saya mendapatkan kesalahan " logcat read: Invalid argument". Saya harus menghapus log, sebelum membaca dari log.

Saya suka ini:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
neoneye
sumber
Terima kasih! Saya mengalami kesalahan itu untuk waktu yang lama, logcat -c segera memperbaikinya!
Jords
4

Cara sederhana adalah dengan membuat metode pengumpul log Anda sendiri atau bahkan hanya aplikasi pengumpul log dari pasar.

Untuk aplikasi saya, saya membuat fungsionalitas laporan yang mengirim log ke email saya (atau bahkan ke tempat lain - setelah Anda mendapatkan log, Anda dapat melakukan apakah Anda mau).

Berikut adalah contoh sederhana tentang cara mendapatkan file log dari perangkat:

Lumut
sumber
3

Sederhana jalankan saja perintah berikut untuk mendapatkan output ke terminal Anda:

adb shell logcat
Weston Ganger
sumber
3

Saya tahu ini pertanyaan lama, tapi saya yakin masih berlaku bahkan di tahun 2018.

Ada opsi untuk Mengambil laporan bug yang tersembunyi di opsi Pengembang di setiap perangkat android.

CATATAN: Ini akan membuang seluruh log sistem

Bagaimana cara mengaktifkan opsi pengembang? lihat: https://developer.android.com/studio/debug/dev-options

Apa yang berhasil untuk saya:

  1. Mulai ulang perangkat Anda (untuk membuat log sampah minimum untuk dianalisis oleh pengembang)
  2. Reproduksi bug Anda
  3. Buka Pengaturan -> Opsi pengembang -> Ambil laporan bug
  4. Tunggu sistem Android untuk mengumpulkan log (lihat bilah progres dalam notifikasi)
  5. Setelah selesai, ketuk pemberitahuan untuk membagikannya (Anda dapat menggunakan gmail atau di mana pun)

bagaimana cara membaca ini? buka bugreport-1960-01-01-hh-mm-ss.txt

Anda mungkin ingin mencari sesuatu seperti ini:

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

atau:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Piotr Z
sumber
2

Terima kasih kepada user1354692 saya bisa membuatnya lebih mudah, hanya dengan satu baris! yang dia komentari:

try {
    File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
    Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}
jfcogato
sumber
di mana tempat terbaik untuk meletakkan kode ini? di OnCreate?
Youngjae
2

Saya telah membuat perpustakaan kecil (.aar) untuk mengambil log melalui email. Anda dapat menggunakannya dengan akun Gmail. Ini cukup sederhana tetapi berfungsi. Anda bisa mendapatkan salinannya dari sini

Situs ini dalam bahasa Spanyol, tetapi ada PDF dengan versi bahasa Inggris dari deskripsi produk.

Saya harap ini bisa membantu.

lm2a
sumber
2

Dua langkah:

  • Buat log
  • Muat Gmail untuk mengirim log

.

  1. Buat log

    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. Muat Gmail untuk mengirim log

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

Referensi untuk # 1

~~

Untuk # 2 - ada banyak jawaban berbeda di luar sana untuk cara memuat file log untuk dilihat dan dikirim. Akhirnya, solusi di sini sebenarnya bekerja untuk keduanya:

  • muat Gmail sebagai opsi
  • berhasil melampirkan file

Terima kasih banyak untuk https://stackoverflow.com/a/22367055/2162226 untuk jawaban yang berfungsi dengan benar

Gene Bo
sumber
0

Pertama-tama pastikan perintah adb dapat dieksekusi dengan mengatur PATH ke platform-sdk android:

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

lalu lari:

adb shell logcat > log.txt

ATAU pertama-tama pindah ke adb platform-tools:

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

lalu lari

./adb shell logcat > log.txt
Aqib Mumtaz
sumber