1. プロジェクトのルートだけを除外する
ルートの .gitignore に次のルールを置きます。logs/app.log とルートの logs 以下を除外しますが、packages/api/logs/app.log は追跡の対象にできます。先頭の / の基準は、この .gitignore があるディレクトリです。
/logs/ 2. 各階層の同名ディレクトリを除外する
logs という名前のディレクトリをすべて除外するには、こちらに置き換えます。末尾の / はディレクトリだけを指定します。logs だけなら同名のファイルにも一致します。
下位の .gitignore は自身の場所を基準にします。そこでの /logs/ はリポジトリのルートではなく、そのファイルの隣の logs です。packages/api/logs/ のように途中にスラッシュがあるパターンも .gitignore の場所を基準にします。
logs/ 3. 適用範囲を確認する
例の2つの未追跡ファイルを作成し、リポジトリのルートで定義元と一致ルールを確認します。
git check-ignore -v -- logs/app.log packages/api/logs/app.log/logs/ ならルートのパスだけ、logs/ なら両方に一致するはずです。他のルールが結果を変える場合もあります。追跡済みファイルは別途対処してください。無視されたディレクトリの中に例外を残す場合は、例外ルールの記事を参照してください。
正確な動作や詳細は、公式の資料を参照してください。 Git のドキュメント · git check-ignore の公式ドキュメント