ルートロガーと個別ロガーに同じアペンダーを付けていても、個別ロガー側で 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 にしていれば防げます。