2010-01-22 4 views
25

Gibt es eine Möglichkeit zum Abrufen von Protokollmeldungen von einem Android-Mobilteil.Anmelden an einer Datei unter Android

Ich baue eine Anwendung, die das GPS meines HTC Hero verwendet. Ich kann die Anwendung von Eclipse ausführen und debuggen, aber das ist kein guter Anwendungsfall von GPS, saß an meinem Schreibtisch.

Wenn ich die App fire, wenn ich herum laufe, bekomme ich eine zeitweilige Ausnahme. Kann ich diese Ausnahmen trotzdem in eine Textdatei auf der SD-Karte ausgeben oder Anrufe an Log.x("") in eine Textdatei ausgeben, damit ich sehen kann, was die Ausnahme ist.

Dank

EDIT: Lösung

Hier ist der Code mit I ... schließlich ging

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 

    PrintWriter pw; 
    try { 
     pw = new PrintWriter(
       new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true)); 
     ex.printStackTrace(pw); 
     pw.flush(); 
     pw.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
}); 

Ich hatte die Linie

pw = new PrintWriter(new FileWriter(Environment.getExternalStorageDirectory()+"/rt.log", true)); 

einzuwickeln in Ein Versuch/Catch als Eclipse würde mich nicht kompilieren lassen er app. Es sagte immer wieder

Unhandled exception type IOException 

1 quick fix 
    Sorround with try/catch 

Also tat ich und es funktioniert alles, die für mich in Ordnung, aber es mich macht sich fragen, was von Eclipse auf etwa war ...

+3

Schön, wenn Sie einen Thread schreiben, aber was zu dieser Lösung passiert, wenn man 5 Threads zu demselben Schreiben Datei, keine gute Lösung dann. – JPM

+0

Verwendung synchronisiert? – Michael

Antwort

19

Sie Thread.setUncaughtExceptionHandler() verwenden könnte zu fangen die Ausnahmen.

Schreiben auf SD-Karte ist so einfach wie das Verzeichnis für die Karte mit Environment.getExternalStorageDirectory() abrufen und dort eine Datei erstellen.

File f = new File(Environment.getExternalStorageDirectory(),filename); 

Sie müssen, um Ihnen die richtige Berechtigung App auf die SD-Karte zu schreiben, indem Sie diesen auf Ihr Manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Prost Dave, ich werde ihm geben, einen Pop –

6

Log4j oder slf4j kann auch als Logging-Frameworks in Android zusammen mit logcat verwendet werden. Sehen Sie das Projekt android-logging-log4j. Die Protokollierung auf eine (rotierende) Datei (en) zu konfigurieren ist sehr einfach.

static { 
    final LogConfigurator logConfigurator = new LogConfigurator(); 

    logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log"); 
    logConfigurator.setRootLevel(Level.DEBUG); 
    // Set log level of a specific logger 
    logConfigurator.setLevel("org.apache", Level.ERROR); 
    logConfigurator.configure(); 
} 
4

habe ich versucht, die beiden oben genannten Optionen (microlog4android & android-Logging-log4j) und sie waren ein Kampf, um zu versuchen zum Laufen zu bringen. Sobald sie gut kompiliert wurden, würde ich Runtime java.lang.NoClassDefFoundError bekommen.

Also dann stolperte ich über logback-android ... auch hier http://logback.qos.ch/ gefunden

Es hat viel bessere Anweisungen und ich habe es in ein paar Stunden zu arbeiten.

Dies scheint die beste Logging-Lösung für Android zu sein.

1

Basierend auf @ Greg B-Lösung und @JPM Frage im Kommentar, habe ich diese statische Methode in einer separaten Klasse und jedes Mal, wenn Sie einen neuen Thread instanziiert, nennen Sie es.

Paket com.stackoverflow.

import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 

import android.os.Environment; 

public class UnhandledExceptionHandler { 

    public static void setUndhandledException(Thread thread) { 
     if (thread.getUncaughtExceptionHandler() == null) { 
      Thread.currentThread().setUncaughtExceptionHandler(
        new Thread.UncaughtExceptionHandler() { 
         @Override 
         public void uncaughtException(Thread thread, 
           Throwable ex) { 

          PrintWriter pw; 
          try { 
           pw = new PrintWriter(new FileWriter(Environment 
             .getExternalStorageDirectory() 
             + "/rt-networkandgps" 
             + "/gpx/" 
             + thread.getId() + ".log", true)); 
           ex.printStackTrace(pw); 
           pw.flush(); 
           pw.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
     } 

    } 

} 

Anruf aus anythread wie diese,

  UnhandledExceptionHandler.setUndhandledException(Thread.currentThread()); 
4

Verwenden slf4-android lib von BrightInventions erstellt. Es ist eine einfache Implementierung von slf4j api mit Android java.util.logging. *.

Features:

  • loggt sich aus der Box
  • Protokollierung jedes andere Ziel-Datei von LoggerConfiguration.configuration().addHandlerToLogger
  • schütteln die Geräteprotokolle mit Screenshot
  • wirklich klein, per E-Mail zu senden, es tooks nur ~ 55kB

slf4android wird hauptsächlich von @miensol verwaltet.

Lesen Sie mehr über slf4android auf unserem Blog: