DATE : 2006/04/13 (Thu)
(前回の記事)
ログ出力のレベル
Logging では、以下の種類に分けてログを出力できます。
上にあるレベルほどログの重要度が高く、下にあるレベルほどログの重要度は低くなります。
- fatal
- 致命的で、プログラムを強制終了させるほどの状態になった場合。
- error
- エラーが発生した場合や、予期しない状態になった場合。
- warn
- API の使用方法が間違えている場合や、好ましくない状況になった場合。また、軽微なエラーなど。
- info
- 実行時に発生する重要なイベントを報告する場合。
- debug
- システムの流れなどをデバッグ用途に出力する場合。
- trace
- debug よりもさらに細かい情報を出力する場合。
標準では、info 以上のログレベル(info, warn, error, fatal)がログに出力されます。
(つづきます)
DATE : 2006/04/11 (Tue)
(前回の記事)
ログ出力機構を選ぶ
ログ出力機構を指定するには、 org.apache.commons.logging.Log (以下、Log)の実装を指定します。標準で指定できる実装で主なものを挙げます。
- org.apache.commons.logging.impl.Log4JLogger
- Log4j を使用する実装。
- org.apache.commons.logging.impl.Jdk14Logger
- ロギング API を使用する実装。
- org.apache.commons.logging.impl.SimpleLog
- System.err を使用する実装。
- org.apache.commons.logging.impl.NoOpLog
- ログを出力しない場合の実装。
( ・∀・)もちろん、Log を自前で実装すれば、 Logging で使えるログ出力機構を独自に作成、もしくは指定できます
ログ出力機構を指定する方法には、何種類かあります。
- システムプロパティに org.apache.commons.logging.Log の値を設定する。
- JAR ファイルに、サービスプロバイダとして org.apache.commons.logging.Log の実装を指定する。
- クラスパスに commons-logging.properties を配置し、 org.apache.commons.logging.Log プロパティを設定する。
今回は、 commons-logging.properties をクラスパスに配置する方法でログ出力機構を選択します。
commons-logging.properties の中身は、次の1行です。
org.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog
Log として、 org.apache.commons.logging.impl.SimpleLog を指定しています。
(つづきます)
DATE : 2006/04/10 (Mon)
(前回の記事)
なぜ Logging を使うのか
実は、Java SE にはバージョン 1.4 から ロギング API が用意されています。また、それが搭載される前から Log4j というライブラリもあります。前者は Java SE 標準のものですし、後者はログを様々な媒体(コンソール、ファイル、ネットワークなど)に出力できます。
ログ出力機構がいろいろとある中で、なぜあえて Logging を選ぶのでしょうか。
それは、Logging が、ロギング API や Log4j との橋渡しを行ってくれるからです。つまり、ログ出力機構が何であろうと、Logging を通せばみな同じように使えるというわけです。
ちなみに、 Logging には SimpleLog という、単純に System.err へ出力するログ出力機構が付属しています。
今回は簡単な使い方のメモなので、 SimpleLog を使って話を進めていこうと思います。
( ・∀・)もちろん、後で高機能なログ出力機構に変えることもできます。他のログ出力機構に変えたとしても、プログラムを書いたソースコードを変更する必要はありません。もっとも、設定ファイルはログ出力機構に合わせて用意しなければいけませんが。
(つづきます)
DATE : 2006/04/08 (Sat)
私用コンソールアプリケーションを Java で作っています。
そこで、デバッグ用のメッセージや通常のエラーメッセージを表示しようと思っています。通常であれば、
System.err.println("メッセージ");
とします。
しかし、完成したアプリケーションでは、通常のエラーメッセージのみを表示したいものです。
まず始めに思いつくのは、デバッグ用のメッセージをリリース時にコメントアウトすることです。しかしそうしてしまうと、通常の利用時に何か不具合が出た場合、デバック用のメッセージが表示できません。
そこで、「Apache Jakarta Commons-Logging」(以下、Logging)を使ってみました。Logging を使うと、デバッグ用やエラー用などの用途に分けてログを出力できます。
とりあえず、インストール後、使えるようになるところまでをメモしておきたいと思います。
(つづきます)
DATE : 2006/04/03 (Mon)
「ArrayList と LinkedList の使い分け」では、ランダムアクセスという言葉が出てきました。
リストの要素にアクセスする際には、ランダムアクセスとシーケンシャルアクセス(順次アクセス)の2通りがあります。
ランダムアクセスとは、適当な位置の要素に直接アクセスすることを言い、シーケンシャルアクセスとは、先頭の要素から順番にアクセスすることを言います。(参考文献:ランダムアクセス・順次アクセス(IT 用語辞典 e-Words))
ここでは、リストへランダムアクセスする方法とシーケンシャルアクセスする方法をメモしておきます。
簡単な見分け方
簡単に言うと、java.util.List#get(int) などで要素番号を指定して要素にアクセスするとランダムアクセス、java.util.List#iterate() などから java.util.Iterator を取得して要素にアクセスするとシーケンシャルアクセスになります。
コード例
以下のコードは、List へシーケンシャルアクセスを行った(つもり)の例です。
List list = new ArrayList();
// get メソッドでアクセス
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
// obj を処理
}
// Iterator でアクセス
for (Iterator i = list.iterator(); i.hasNext(); ) {
Object obj = i.next();
// obj を処理
}
しかし、 get メソッドでアクセスする方法は、実はランダムアクセスとなります。
人間から見れば get メソッドでアクセスする方法も Iterator でアクセスする方法も、シーケンシャルアクセスしているように見えます。
しかし、処理されている List 側から見れば、get メソッドでアクセスする方法はランダムアクセスなのです。
と言うのも、get メソッドでアクセスする場合、List の内部は次にアクセスされるであろう要素を知りません。ただ単に i という要素番号が外部から渡されてくるだけです。
それに対し Iterator は、次にアクセスされる要素の番号を内部に持っています。
なので、要素番号を使ってアクセスするとランダムアクセス、Iterator を使ってアクセスするとシーケンシャルアクセスになるというわけです。
LinkedList はランダムアクセスに弱いので、Iterator を使ってアクセスした方が良いと言えそうです。
For-Each ループ
ところで、Iterator を使った処理はちょっと見づらくありませんか?
List list = new ArrayList();
for (Iterator i = list.iterator(); i.hasNext(); ) {
Object obj = i.next();
// obj を処理
}
そこで Java SE 5 からは、「For-Each ループ」が導入されました。
上のコードは、以下のように書き直せます。
List list = new ArrayList();
for (Object obj : list) {
// obj を処理
}