Apache FTPClientでのコマンドのトレース

Apache FTPClientを使って、JavaアプリケーションからFTP操作が可能となります。
この際、FTPクライアントとFTPサーバ間との通信内容をログに出力する方法を説明します。

概要

  • Apache FTPClientは、Apache Commons Netライブラリの一部です。
    commons-net(3.6版)のjavadocはこちらをご覧ください。
  • 動作確認や単体試験時では、開発環境のIDE(デバッグ機能)を使って、アプリとFTPサーバとの通信内容を検証できます。結合試験や本番環境等では、IDE等のツールは一般的に導入されていることは少なく、環境固有の問題が発生した場合は、問題の検証が難しくなります。
    このような事態に備えて、アプリとFTPサーバとの通信をトレースできるログを出力しておきます。こうすることで、動作確認や単体試験時のエビデンスとしても使用できます。
  • 私のこれまでの経験上、このレベルの設計や実装方針は細かすぎて開発者任せになることが多い。アプリ開発者からすると、製造や単体試験をやりきることに主眼が置かれ、今回のような後工程での事象に対して考慮するような考えは乏しいです。設計、開発ガイド、教育等で「後工程でのトラブル解決が容易になるような考慮」を盛り込むことをおすすめします。
  • 通常、このようなログは細かすぎて環境が変わると大量のログが出力される可能性があります。そのため、必要な場合だけログ出力するようTRACEレベルでログ出力することをお薦めします。(感覚的には、DEBUGは点で動作を把握、TRACEは面で動作を把握するイメージで使い分けています。)

サンプルプログラム

サンプルの説明

主にFTPClientクラスを使って、FTP操作を行います。
このFTPClientに対して、addProtocolCommandListenerメソッドでトレースするためのクラス(ProtocolCommandListener)を指定します。
ProtocolCommandListenerでは、FTPClientでコマンドを実行する際に呼び出されるprotocolCommandSentメソッド、FTPサーバからの応答があった場合に呼び出されるprotocolReplyReceivedメソッドが定義されています。目的に応じて、それぞれのメソッドでログを出力します。
なお、FTP操作部分のコードですが、サンプルのため簡易的な実装になっています。業務で使用する場合、FTPReply#isPositiveCompletion()等を使って、コマンド個別の正常性確認をお薦めします。

実行に必要なライブラリはcommons-netとなります。
ログ出力のために、slf4j、slf4j-simpleを追加しています。

参考ですが、今回の例ではログ出力ライブラリとしてslf4j-simpleを使用しています。このライブラリで、trace以上のログを出力するための設定を行っています。

実行結果例

FTPClientからFTPサーバへの要求は”>”、FTPサーバからFTPClientへの応答は”<“として、TRACEレベルでログを出力しています。