Günlük dosyasını bir Android cihazdan nasıl alırım?


129

Günlük dosyasını bir cihazdan bilgisayarıma çekmek istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


112

Logcollector iyi bir seçenektir, ancak önce onu yüklemeniz gerekir.

Günlük dosyasının postayla gönderilmesini istediğimde, genellikle şunları yapıyorum:


Bu komut satırı benim için çalışmıyor, bu çıktıyı alıyorum. logcat okudu: Geçersiz bağımsız değişken
neoneye

5
logcollector'ın 4.1'in üzerindeki android sürümleri için çalışmadığını unutmayın, çünkü uygulamaların artık yalnızca kendi günlük girişlerini okumasına izin verilmektedir. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe

11
Hiç yok basit yöntem, bu yüklemeye gerek kalmadan, harici bir depolama aygıtı olarak USB üzerinden bağlandığında sadece cihazdan günlük dosyası getirmek için birkaç yolu adb veya böyle bir şey?
VEYA Mapper

Çalıştırmak için doğru dizinde olduğunuzdan emin olun adb. Genellikle içindeC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

30

Umarım bu kod birine yardımcı olur. Cihazdan nasıl oturum açacağımı ve ardından filtrelemem 2 günümü aldı:

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 tarafından işaret edildiği gibi

günlükleri okumak için bildirime izin ekleyin

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

1
bu iyi çalışıyor, ancak ihtiyacınız olan her cihazda çalışıyor<uses-permission android:name="android.permission.READ_LOGS" />
mehdok

27

Bu tür bir şey kullanırdım:

$adb logcat -d > logcat.txt

-D seçeneği, tüm dairesel arabelleği metin dosyasına döker ve belirli bir eylem / amaç arıyorsanız, deneyin

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

Bu yardımcı olur umarım :)


13

USB hata ayıklama veya kullanmakla ilgilenmeyenler adbiçin daha kolay bir çözüm var. Android 6'da (Önceki sürümden emin değilim) geliştirici araçlarının altında bir seçenek vardır: Hata Raporu Al

Bu seçeneğin tıklanması bir hata raporu hazırlayacak ve onu sürücüye kaydetmenizi veya e-posta ile göndermenizi isteyecektir.

Bunu günlükleri almanın en kolay yolu olarak buldum. USB hata ayıklamasını açmayı sevmiyorum.


1
Tam olarak aradığım şey!
YYamil

1
Tam olarak nerede bulabilirim?
gurehbgui

11

DÜZENLE:

Dahili günlük, bellekte dairesel bir tampondur. Aslında her biri için bu tür birkaç dairesel tampon vardır: radyo, olaylar, ana. Varsayılan, main'dir.

Bir tamponun bir kopyasını elde etmek için, bir teknik, cihazda bir komutun çalıştırılmasını ve çıktının bir dizi değişkeni olarak elde edilmesini içerir.

SendLog tam da bunu yapan açık kaynaklı bir uygulamadır: http://www.l6n.org/android/sendlog.shtml

Anahtar, logcatgömülü işletim sistemindeki cihazda çalışmaktır . Göründüğü kadar zor değil, bağlantıdaki açık kaynak uygulamasına bakın.


Bu çıktıyı ekrana döküyor, bir dosyaya ihtiyacım var.
Pentium10

ALogCat ile günlükler gönderebilirsiniz. Veya
DDMS'den

@molnarm Yapması gereken tek şey buysa cevabımın biraz fazla tasarlanmış olduğunu kabul ediyorum =)
Brad Hein

@BradHein SendLog'un açık kaynak olduğunu söylediniz ama kaynak kodunu bulamıyorum. Nerede olduğuna dair bir fikrin var mı?
smith324

8

Genellikle " logcat read: Invalid argument" hatasını alıyorum . Günlükten okumadan önce günlüğü temizlemem gerekiyordu.

Bunu beğendim:

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

Teşekkürler! Bu hatayı uzun zamandır yaşıyordum, logcat -c hemen düzeltti!
Jords

4

Basit bir yol, kendi günlük toplayıcı yöntemlerinizi veya hatta piyasadaki mevcut bir günlük toplayıcı uygulamasını yapmaktır.

Uygulamalarım için, günlükleri e-postama (veya hatta başka bir yere - günlüğü aldıktan sonra dilediğiniz gibi yapabilirsiniz) gönderen bir rapor işlevi yaptım.

Günlük dosyasının bir cihazdan nasıl alınacağına dair basit bir örnek:


3

Basitçe çıktıyı terminalinize almak için aşağıdaki komutu çalıştırın:

adb shell logcat

3

Bunun eski bir soru olduğunu biliyorum, ancak 2018'de bile geçerli olduğuna inanıyorum.

İçin bir seçenek vardır bir hata raporu al gizli Geliştirici seçenekleri her robot cihaz.

NOT: Bu, tüm sistem günlüğünü döker

Geliştirici seçenekleri nasıl etkinleştirilir? bkz: https://developer.android.com/studio/debug/dev-options

Benim için ne işe yarar:

  1. Cihazınızı yeniden başlatın (geliştiricinin analiz etmesi için minimum çöp günlükleri oluşturmak için)
  2. Hatanızı yeniden üretin
  3. Ayarlar -> Geliştirici seçenekleri -> Hata raporu alın bölümüne gidin
  4. Android sisteminin günlükleri toplamasını bekleyin (bildirimde ilerleme çubuğunu izleyin)
  5. Tamamlandığında, paylaşmak için bildirime dokunun (gmail'i veya başka bir yeri kullanabilirsiniz)

bunu nasıl okuyabilirim? açık bugreport-1960-01-01-hh-mm-ss.txt

muhtemelen bunun gibi bir şey aramak istersiniz:

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

veya:

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

2

User1354692 sayesinde tek hatla daha da kolaylaştırabildim! yorum yaptığı kişi:

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

bu kodu koymak için en iyi yer neresi? içinde OnCreate?
Youngjae

2

Günlükleri e-posta ile almak için küçük bir kitaplık (.aar) oluşturdum. Gmail hesaplarıyla kullanabilirsiniz. Oldukça basit ama işe yarıyor. Buradan bir kopyasını alabilirsiniz

Site İspanyolcadır, ancak ürün açıklamasının İngilizce versiyonunun bulunduğu bir PDF dosyası vardır.

Umarım yardımcı olabilir.


2

İki adım:

  • Günlüğü oluştur
  • Günlüğü göndermek için Gmail'i yükleyin

.

  1. Günlüğü oluştur

    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. Günlüğü göndermek için Gmail'i yükleyin

    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 için referanslar

~~

# 2 için - günlük dosyasını görüntülemek ve göndermek için nasıl yükleneceğine dair birçok farklı yanıt var. Son olarak, buradaki çözüm aslında her ikisinde de işe yaradı:

  • Gmail'i bir seçenek olarak yükle
  • dosyayı başarıyla ekler

Doğru çalışan cevap için https://stackoverflow.com/a/22367055/2162226'ya çok teşekkürler


0

Öncelikle PATH'i android sdk platform araçlarına ayarlayarak adb komutunun çalıştırılabilir olduğundan emin olun:

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

o zaman koş:

adb shell logcat > log.txt

VEYA önce adb platform araçlarına geçin:

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

o zaman koş

./adb shell logcat > log.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.