実行ログを可視化する

アプリのデバッグ、端末をPCに繋いでいるときはLog.xで情報が見られるからいいのですが、例えば数日またがりの動作情報を見るときなど、端末をPCから外しているとLog.xが見られないため、細かい動きがわからなくて困ると思います。

ここでは、Log.xを可視化する方法ではなく(やり方わからないです)、独自の方法でやっていることを書いておこうと思います。

やり方は、

  1. メイン画面内にScrollViewを置いておく
  2. 動作情報を記録したいクラス内で、文章などをファイルに書き込む(以下のsaveTextメソッドを使う)
  3. MainActivityのonResume()などで、2番で生成したファイルを読み込み、1のScrollViewに出力する(以下のreadTextを使う)

です。以下の例では、情報の最大行数を1000行として、溢れた分は破棄して最新のログを一番上に持ってくる処理構造になります。

saveTextメソッドは、内部でreadTextメソッドを呼んでいるので、

  • ログを残したいクラスには、saveText、readTextメソッドの両方を
  • ログを表示したいクラスには、readTextメソッドのみ

をコピペするなりしてください。

メソッド:readText

protected String readText(String filename){

if(true){

String lineBuffer;

StringBuilder outBuffer = new StringBuilder();

try {

InputStream in = openFileInput(filename);

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

while( (lineBuffer = reader.readLine()) != null){

outBuffer.append(lineBuffer+"\n");

}

return outBuffer.toString();

}catch(IOException e){

e.printStackTrace();

return null;

}

}else{

return null;

}

}

メソッド:saveText

(コード中にmessageという、代入しているけど使っていないものがありますが、消してもらって構いません)

protected void saveText(String msg, String filename){

if(true){

String message = "";

// read text

String readData = readText(filename);

if(readData != null){

String[] strList = readData.split("\n");

if(strList.length > 1000){

StringBuilder strList2 = new StringBuilder();

for(int i=0; i<999; i++){

strList2.append(strList[i]+"\n");

}

readData = strList2.toString();

}

}

try {

FileOutputStream outStream = openFileOutput(filename, Context.MODE_PRIVATE);

OutputStreamWriter writer = new OutputStreamWriter(outStream);

if(readData==null){

Log.d("DBG", "read text is null");

writer.write(msg+"\n");

}else{

Log.d("DBG", "read text is OK");

writer.write(msg+"\n");

writer.write(readData);

}

writer.flush();

writer.close();

message = "File save success";

}catch(FileNotFoundException e){

message = e.getMessage();

e.printStackTrace();

}catch(IOException e){

message = e.getMessage();

e.printStackTrace();

}

}

}