log4j2において、ルートロガーと個別のロガーに同じアペンダーを指定した場合どうなるのでしょうか。addbilityをfalseにしておけば二重にログが出力されることはないのでしょうか。心配しているのが、ルートロガーがWARNで個別のロガーがDEBUGの場合、WARNログ出力時に二重に出ないのかなと思っております。

1件の回答

回答を書く

1172838

2026-08-15 16:25

+ フォロー

ルートロガーと個別ロガーに同じアペンダーを付けていても、個別ロガー側で additivity=false にしておけば、その個別ロガーから出たログが同じアペンダーに二重出力されることはありません。

理由を順番に説明します。

・additivity の意味
additivity=true の場合
個別ロガーで出したログイベントは
1 個別ロガーに紐づくアペンダー
2 親ロガー(最終的にはルートロガー)に紐づくアペンダー
の両方に流れます。
このとき、同じアペンダーが個別ロガーとルートロガーの両方に設定されていると、そのアペンダーの append が二度呼ばれるので、ログが二重に出ます。

additivity=false の場合
個別ロガーで出したログイベントは、そのロガーに直接ぶら下がっているアペンダーだけに流れ、親ロガーには一切伝播しません。
したがって、ルートロガーにも同じアペンダーが付いていても、そのイベントについてはルート側からは呼ばれないため、同じログが二重に書かれることはありません。

・質問にある WARN のケースについて
「ルートロガーが WARN、個別ロガーが DEBUG、同じアペンダー、かつ個別ロガーの additivity=false」という前提で考えると

logger.debug(…) → 個別ロガーのレベルが DEBUG なので出力されるが、additivity=false のためルートには流れない
logger.warn(…) → レベル WARN なので個別ロガーのアペンダーに1回だけ出力され、やはりルートには流れない

という動きになり、WARN が二重に出ることはありません。
二重出力になるのは「additivity=true で、子と親の両方に同じアペンダーを付けている場合」です。

なお、ルートロガーを直接使って warn を出しているコードが別にあれば、それはまた別イベントなので当然その分は出力されますが、「1つの logger.warn 呼び出しが additivity のせいで二重に書かれる」ことは、additivity=false にしていれば防げます。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有