読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

ログ加工ツールのテンプレートをつくってみた

Java

アプリケーションをメンテナンスする上でログの確認は重要な作業となりますが、そのログはアプリケーションごとに固有の形式となっていて、これを機械的に整形して表計算ツールで分析したりするにはひと手間必要・・・というようなケースがままあります。そこで例によってふと思い立ち、そうしたログ加工ツールのテンプレート的なものをつくってみました。

プロジェクトのリポジトリこちらです。コマンドライン引数を受け取り、各種チェックをおこなってバリュー・オブジェクトに詰め込む部分、そしてログファイルの一覧を取得して、CSV(TSV)出力APIへのアクセスとともに、本処理を行うモジュールへ引き渡す部分まではきっちり(?)実装されています。コマンドライン・オプションは以下のとおり:

$ java -jar logproc-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

usage: logproc(java -jar LogProc...jar) [-C <charset-name>] [-c
       <charset-name>] [-d <directory-path>] [-f <output-format>] [-H] [-n
       <filename-patterns>] [-N <filename>] [-s <directory-path>] -t
       <logfile-type>

available options:
 -C <charset-name>        処理結果のCSVファイルを作成するときのキャラクターセット.
                          指定しない場合はJVMのデフォルト・キャラクターセットと同じになる.
 -c <charset-name>        ログファイルを読み込むときのキャラクターセット.
                          指定しない場合はJVMのデフォルト・キャラクターセットと同じになる.
 -d <directory-path>      処理結果のCSVを出力するディレクトリ. 指定しない場合は"."に出力される.
 -f <output-format>       処理結果の出力形式. "csv"もしくは"tsv". 指定しない場合は"csv".
 -H,--no-head             処理結果のCSVファイルにヘッダ行を出力しない.
 -n <filename-patterns>   ログファイル名のパターン. 指定しない場合は"*.log".
                          カンマ区切りで複数指定することも可能.
 -N <filename>            処理結果のCSVのファイル名.
                          指定しない場合は"logproc-result-yyyyMMddhhmmss.csv".
 -s <directory-path>      ログファイルを検索するディレクトリ. 指定しない場合は"."が検索される.
 -t <logfile-type>        ログファイルのタイプを指定する. 指定可能なタイプの一覧については"available
                          logfile types"を参照のこと.

available logfile type:
 "sample"    サンプルのログファイル・タイプ.

ログをファイルごと・レコードごとに読み取りCSV(TSV)のレコードに変換する部分は、抽象クラスを実装するかたちで開発者が個別に実装することになります(サンプル実装としてSampleLogfileProcessor.javaが用意されています。このクラスはこれまたサンプルのログファイルsrc/test/resources/FOO100_BAR200_baz_20150401.logを処理するものです):

/**
 * ログファイルの読み取りとCSVの出力を担当するモジュール.
 * この抽象クラスを実装し{@link Service}アノテーションを付与されたクラスは、
 * {@link ProcessorService}に自動的に登録される.
 */
public abstract class Processor {
  ...
  /**
   * このモジュールがサポートするログファイル・タイプを返す.
   * @return ログファイル・タイプ
   */
  public abstract LogfileType getLogfileType();
  /**
   * このモジュールが出力するCSVのカラム一覧を返す.
   * @return カラム一覧
   */
  public abstract String[] getColumnList();
  /**
   * 引数で与えられたファイルをこのモジュールが処理対象とするかどうかを示す.
   * @param file ログファイル
   * @param context コンテキスト
   * @return {@code true}: 処理対象とする / {@code false}: 処理対象としない
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected boolean handleFile(final File file, final Context context) throws IOException, LogprocException {...}
  /**
   * 全体レベルの開始処理を行う.
   * このメソッドは一連のログファイルを処理する前に1回呼び出される.
   * @param context コンテキスト
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected abstract void handleStart(Context context) throws IOException, LogprocException;
  /**
   * 全体レベルの終了処理を行う.
   * このメソッドは一連のログファイルを処理した後に1回呼び出される.
   * @param context コンテキスト
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected abstract void handleEnd(Context context) throws IOException, LogprocException;
  /**
   * ファイル・レベルの開始処理を行う.
   * このメソッドは各ログファイルを処理する前に1回ずつ呼び出される.
   * @param file ログファイル
   * @param context コンテキスト
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected abstract void handleFileStart(File file, Context context) throws IOException, LogprocException;
  /**
   * ファイル・レベルの終了処理を行う.
   * このメソッドは各ログファイルを処理した後に1回ずつ呼び出される.
   * @param file ログファイル
   * @param context コンテキスト
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected abstract void handleFileEnd(File file, Context context) throws IOException, LogprocException;
  /**
   * 行レベルの処理を行う.
   * @param line 行(ログの1レコード)
   * @param context コンテキスト
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected abstract void handleLine(String line, Context context) throws IOException, LogprocException;
  /**
   * キャンセル時の後処理を行う.
   * このメソッドは他のメソッドから処理のキャンセルを示す例外がスローされたときに呼び出される.
   * @param file ログファイル
   * @param context コンテキスト
   * @param cancel すろーされた例外
   * @throws IOException 処理中にIOエラーが発生した場合
   * @throws LogprocException 処理中にその他のアプリケーション・エラーが発生した場合
   */
  protected void handleCancelled(final File file, final Context context, final CancelException cancel)
      throws IOException, LogprocException {...}
  /**
   * ログファイルの読み取りとCSV作成処理を行う.
   * @param logfileList ログファイルのリスト
   * @param context コンテキスト
   * @throws LogprocException 処理中にアプリケーション・エラーが発生した場合
   */
  public void process(final List<File> logfileList, final Context context) throws LogprocException {...}
}