11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

eclipse:Logユーティリティを作成してLog出力の手間を減らす

Last updated at Posted at 2014-11-05

最初に

アプリケーションの開発環境を構築する上で最も大事なことは何か? プラグインの導入、命名規則の設定、おそらく色々あるとは思う。 だが開発環境を構築する上で最も大事、かつ最も忘れやすいことは「**Logユーティリティの構築**」であると私は考える。

Logユーティリティを構築する必要性

Logがどうして重要かは、おそらく多少の開発経験があればすぐにわかるだろう。 同時にLogを仕込むことがどれだけ**めんどくさい**ことかもわかるはずである。
  1. メソッドの最初と最後にLogをコピペで仕込み、
  2. 重要な値や参照範囲の広い変数は適宜出力し、
  3. デバッグ時にはとにかくたくさん出力して中身を見るものの、
  4. 制作物のリリースでは逆にログを出力しないよう制御しなければならない。

書くだけでもうっとうしい。正直こんな作業、工数を使うだけ無駄だし、モチベも下がる。
じゃぁやっぱり効率化した方が誰のためにもなるのである。

Logユーティリティ作成手順

上記のめんどくさい作業の中で、今回自動化を図るのは1と4である。 作成手順は以下の通り。なお、筆者はEclipseでAndroid開発をしているため、内容もEclipse,Android寄りではあるが、Java開発や他のIDEでも類似の機能で実現できるはずだ。
  1. Logユーティリティクラスの作成
  2. Javaコード・テンプレートの編集

基本はこれだけである。
なお、複数人での開発を行う場合は「テンプレートの共有」や「クラス・メソッド作成手順の共有」などがあるが、ここでは割愛する。

Logユーティリティクラスの作成

以下をまるっとコピペ。Androidの場合。
LogUtil.java

package com.example.util;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

public class LogUtil {
    
    private static final boolean IS_DEBUG = true;
    /* プロジェクト名を入れておくなどの使い方をすると、grepをかけるときに便利 */
    private static final String TAG = "[hogehoge]";
    
    public static void e(String tag, String msg) {
        if (IS_DEBUG) Log.e(TAG + tag, msg);
    }
    public static void w(String tag, String msg) {
        if (IS_DEBUG) Log.w(TAG + tag, msg);
    }
    public static void i(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg);
    }
    public static void d(String tag, String msg) {
        if (IS_DEBUG) Log.d(TAG + tag, msg);
    }
    public static void v(String tag, String msg) {
        if (IS_DEBUG) Log.v(TAG + tag, msg);
    }
    
    /* 後述のテンプレートで使用する */
    public static void methodStart(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg + " Start");
    }
    public static void methodEnd(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg + " End");
    }
    
    /* Android特有。Toast機能を使うと操作中に発生したLogが実機で見られるため、デバッグでも使える */
    public static void toast (Context context, String tag, String msg) {
        if (IS_DEBUG) Toast.makeText(context, tag + ":" + msg, Toast.LENGTH_LONG).show();
    }
}

デバッグ時はIS_DEBUGをtrueに、リリース時はfalseにするだけで、ログの出力を制御できる。
ただしリリース時の運用として忘れやすいので、もっといい方法があったら教えてほしい…。

Javaコード・テンプレートの編集

Eclipseでの編集は以下の通り。なお、筆者はMac使用。 Winでも入るメニューの名前が違うだけで、同様の機能は存在する。

"環境設定"->"Java"->"Code Style"->"Code Templates"

このメニュー内でコードテンプレートを設定できる。
特に設定しておきたいのは以下の通り。なお内容の一部に引用がある。

  • Class body

private static final String TAG = ${type_name}.class.getSimpleName();

Android開発向けの eclipse コードテンプレート設定より引用

  • Method body

// ${todo} Auto-generated method stub LogUtil.methodStart(TAG,${enclosing_method}); LogUtil.methodEnd(TAG,${enclosing_method}); ${body_statement}

こんな風にユーティリティクラスのメソッドをテンプレートに入れておくことで、
メソッドの最初と最後に自動的にログが挿入される。
(メソッド途中のreturnなどは自分でやるしかないかも。)

  • Constructor body

${body_statement} // ${todo} Auto-generated constructor stub LogUtil.methodStart(TAG,${enclosing_type}); LogUtil.methodEnd(TAG,${enclosing_type});

その他必要なら、ガンガンテンプレートを編集すること。

注意点

* 手書きでメソッドやクラスを作成してはならない。

当たり前だが手書きでバリバリとメソッドを作ってはテンプレートの意味が無い。
それどころか必要なところにログを挿入し忘れるなどのヒューマンエラーが発生する。
コードの挿入はできる限りIDEの機能に任せるように運用すること。プログラマはコードはできる限り書いちゃダメ。

  • Java,Android標準のLogクラスを使用しない

コードを見てわかる通り、実際に使用しているのはAndroid標準のLogクラスだ。
もちろん通常のコード内にLogクラスを書いてしまうことも可能だが、
DEBUGフラグの制御外になってしまうため、ユーティリティクラスを経由しないLogの出力は厳禁だ。
重要な値の出力を行うと、下手をするとアプリの脆弱性にもつながる。注意するべし。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?