Androidアプリケーションへのログイン

Androidプラットフォームのアプリケーションのすべての開発者は、さまざまなイベントをログに記録できるLogクラスに精通していると確信しています。 さまざまな理由により、各プロジェクトのログ形式は「AAA」、「111111」、「I was here」から「habrahabr.ruへのHTTP接続を開く」まで多岐にわたります。 カットの下に、ログのクリーンアップに役立つ関数の例があります。

このトピックは、独創性と汎用性を主張するものではありません。 したがって、プロジェクトにイベントログの特定の標準が既にある場合は、お気軽にご連絡ください。このトピックは、開発者を対象としたものである可能性が高くなります。



原則として、顧客がログをメールで送信し、5分後に修正を送信するように依頼することで、ログの価値を理解し始めます。 また、ログが不明瞭なメッセージで構成されている場合、少なくともこのログの解析には、必要以上に時間がかかります。



物を整理しようとしています



ログは、開発者が何が、どこで、いつ発生したかを理解できるようにするために存在します。 「いつ起こったのか」という質問に対する答えを見つけるのは非常に簡単です。ログには、Androydがイベントの時間を記録します。 「何が起こったのか」という質問に対する答えを見つけても、ログ内のメッセージが意味を込めて書かれている場合、「ファイルを開いています...」などの大きな問題は発生しません。 「どこでそれが起こったのか」という質問が最も難しいことがわかりました。 プロジェクトが大きい場合は、ログが意味を持って書かれていても、コード内の適切な場所を見つけるのに時間を費やす必要があります。



たとえば、メソッドpublic static int d (String tag, String msg, Throwable tr)



、イベントがThrowable(通常は例外)でログに記録される場合、ログの場所をすばやく特定するのに役立つスタックがメッセージコンソールに表示されます。 しかし、特別な不名誉を必要とせずにこのメソッドを使用すると、不要な情報でログが過負荷になります。



ロギングが単なるテキストである場合、ロギング時にコールの場所を明示的に示すことができます。 例:

 Log.v("My Project", "[ImageLoader:loadFile]: Opening file...");
      
      





しかし、毎回これを書くことは退屈で感謝のない仕事です。



以下は、これを自動的に行うLog



クラスの例です。

 public final class Log { ... public static void v(String msg) { android.util.Log.v(TAG, getLocation() + msg); } private static String getLocation() { final String className = Log.class.getName(); final StackTraceElement[] traces = Thread.currentThread().getStackTrace(); boolean found = false; for (int i = 0; i < traces.length; i++) { StackTraceElement trace = traces[i]; try { if (found) { if (!trace.getClassName().startsWith(className)) { Class<?> clazz = Class.forName(trace.getClassName()); return "[" + getClassName(clazz) + ":" + trace.getMethodName() + ":" + trace.getLineNumber() + "]: "; } } else if (trace.getClassName().startsWith(className)) { found = true; continue; } } catch (ClassNotFoundException e) { } } return "[]: "; } private static String getClassName(Class<?> clazz) { if (clazz != null) { if (!TextUtils.isEmpty(clazz.getSimpleName())) { return clazz.getSimpleName(); } return getClassName(clazz.getEnclosingClass()); } return ""; } }
      
      







クラスの使用は非常に簡単です。

 Log.v("Opening file...");
      
      







この方法でログを記録した結果は、およそ次の行になります。

 03-28 22:51:23.239: VERBOSE/TestApp(16390): [MainActivity:onResume:124]: Opening file... 03-28 22:51:23.341: VERBOSE/TestApp(16390): [MainActivity:run:198]: Closing file...
      
      







注:

明らかな理由から、このメソッドは難読化プログラムを「通過」するアプリケーションにはあまり適していません。



一般に、それですべてです。

この記事がHabrにとって些細すぎると思われる場合は謝罪します。



All Articles