クラス構成(概念的なもの)

Log4cppのクラス構成(概念的なもの)です。正確には若干違いますが、Log4cppを理解し、使用するためであれば、これで十分だと思います。
また、Log4cppには内部的なクラスがありますが、Log4cppを理解し、使用するためだけれあれば、それらは知る必要はありませんからここでは触れていません。

各クラスの概要

各クラスの関連についての説明

UMLについて補足

UML2.0をあまり知らない方のために、補足します。

関連(正確には関連端)は、属性とほぼ同じ意味です(関連端と属性を総称してプロパティと呼びます)。 例えば、

は、 と同じ意味ですので、関連って何?意味分からん!という人は頭で置き換えてください。
※注意:正確には関連端と属性は完全に同じものではありません。例えば、関連では双方向関連や限定子を表記できますが、属性ではできません。ですが、ここではそこまで意識しなくて良いです。

関連端名の近くにある数字、例えば「0..1」とか「0..*」は多重度です。ぶっちゃけ、何個持つかということです。「1」なら常に1。「0..*」なら0個以上です。
表記方法ですが角カッコ([])の中に数値が入っていて一般的なプログラミング言語(C言語など)の配列の表記法と似ていると思った方、賢いです。その意味で考えてOKです。

それから、objBの前にある「-」は可視性という物です(ちなみに、「-」はprivateです)。が、ここでは意識しなくて良いです。

Category(カテゴリ)

Categoryクラスから他のクラスへの関連の関連端を属性に直すと以下のようになります。

  • parent
    親です。クラス図に書いていないのですが、カテゴリはJavaのクラス名のように名前を持ちます。
    例えば、aaa::bbb::ccc::Dddクラスでログを出力する場合、そのカテゴリの名前をaaa.bbb.ccc.Dddとします。
    で、そのとき、親カテゴリの名前はaaa.bbb.cccとなります。
    で、aaaの親はrootカテゴリという特別なカテゴリとなります。
    rootカテゴリはトップであり、さらにその親は存在しないので、多重度が0..1となっています。

  • priority
    ログを出力する際、どこまでの優先度までのログを出力対象とするか? ちなみに、これをNOTSETとすると、親のpriorityの設定が使用されます(さらにその親のpriorityがNOTSETだとさらにその親のpriorityが使用される)。getChainedPriority()参照。
    え?rootカテゴリのpriorityがNOTSETだったらどうなるかって?それはできません(rootカテゴリのpriorityにはNOTSETは設定できない)。

  • appender
    ログの出力先です。出力先は1つのカテゴリで複数持てます。要するに例えば、log()メソッドを呼ぶと複数の出力先にログが出力されるということです。
    ちなみに、クラス図には書いていないのですが、カテゴリにはadditivityフラグという物があり、これがtrueだと、log()メソッドを呼んだときに、親カテゴリの持つappenderに対してもログ出力が行われます。

Appender(アペンダー)

Appenderクラスから他のクラスへの関連の関連端を属性に直すと以下のようになります。

すべての属性の多重度が「1」ではなく、「0..1」となっています。これはAppenderのサブクラスによっては0だったり1だったりするためです(定義上はそうですが、実際に0となることはあるのだろうか・・・?)。

  • threshold
    閾値(しきいち)です。どこまでの優先度までのログを出力するかというのはカテゴリでも制御できましたが、ここで、さらに絞り込めます。
    どういうことかというと、例えばログファイルには可能な限りログ出力するが、syslogにはエラーのみ出したいとかそういうことがあるためです。

  • filter
    任意の条件でログ出力する・しない、あるいは後続のfilterに判断させるということを行うためにあります。

  • layout
    出力フォーマット。フォーマットは出力先ごとに設定するということです。例えば、ログファイルには可能な限り出力するが、syslogには最低限のみとするとかといった設定が可能になっています。