user_auth_token_logs をクリーンアップしますか?

私たちのフォーラムでは、user_auth_token_logs に 6100 万行 (増加中) があります。

user_auth_tokens は 25,000 しかありません。

6100 万行のうち、5400 万行はもはや存在しない user_auth_token を参照しています (つまり、データベースの整合性の問題です)。また、6100 万行のうち、約 5800 万行は 2 か月以上前のものです (つまり、明らかに不要ですか?)。

質問:

  • これをさらに整合性の問題を引き起こすリスクなしにクリーンアップできますか?
  • これを自動的にクリーンアップするジョブを設けるのはどうでしょうか?
db=# select count(*) from user_auth_tokens;
 count
-------
 25648

db=# select count(*) from user_auth_token_logs;
  count
----------
 61415352

db=# select count(*) from user_auth_token_logs where user_auth_token_id not in (select id from user_auth_tokens);
  count
----------
 54558442

db=# select count(*) from user_auth_token_logs where created_at < '2024-07-13';
  count
----------
 58565943

「いいね!」 4

はい、user_auth_token_logs はデバッグ目的でのみ存在します。すべての行を空にしても、デバッグ用のログがなくなるという結果になるだけです。

これは以下でカバーされるはずです。

https://github.com/discourse/discourse/blob/main/app/jobs/scheduled/weekly.rb#L13

「いいね!」 2

それをありがとうございます。私はそれがそこにあることに気づきませんでした。

したがって、verbose_auth_token_loggingtrue(このインスタンスではそうではありません)の場合にのみ、クリーンアップが実行される のですか?

しかし、非冗長ログは設定に関係なく常に発生します :scream:

8fb823c による

これを Bug に移動します :slight_smile:

「いいね!」 4

ああ、よく気がつきましたね。lines 214 to 217 も修正が必要なようです。

一定期間経過後に全体的なクリーンアップを行うことに抵抗はありません。@osama(上記のコミットの作成者であるあなた)、これらのログをすべて一定期間後にクリーンアップすることは可能でしょうか(可能であれば、どのくらいの期間後でしょうか)? 不審なログインを検出するために、いくつか保持する必要があるようです。

「いいね!」 4

なぜ修正が必要なのですか? :thinking: そのコードはログレコードに関するものではなく、ローテーションされた UserAuthToken をクリーンアップするためのものではありませんか?

更新:SiteSetting.verbose_auth_token_logging を有効にし、週次ジョブを実行して VACUUM FULL user_auth_token_logs を実行した後、テーブルは 16GB から 687MB になりました :+1:

今日は木を節約しました :deciduous_tree:

「いいね!」 3

はい、ほとんどのログはクリーンアップできると思いますが、いくつか残す必要があります。具体的には、suspiciousgenerate、またはrotateをアクションとするレコードは、不審なログインの検出やレポートの生成に使用されるため、保持する必要があると思います。

「いいね!」 3

フォーラムでこのバグが修正されていないのを見かけました :eyes:
不審なログインレポートはスタッフメンバーにのみ適用されるようですが、管理者以外のログを保持する必要がある理由は何ですか?
レポートが機能するためには、アカウントの履歴の最初からのデータが必要ですか?ログを過去6か月などに短縮できますか?
現在、クリーンアップは一切行われておらず、プライバシーに関する懸念があります。

「いいね!」 2

上記の議論も理解できません。

バグは非常に単純です。モードが冗長でない場合、UserAuthTokenLog のクリーンアップはまったく実行されません。if を削除する必要があります。

元の実装では、SiteSetting.verbose_auth_token_logging が true の場合にのみログが記録されていました。これは、無効にした後でも、最も最近残っているログはそのまま残るという問題がありましたが、それは些細なことです。

しかし、この変更 により、ログ記録は無条件になりました(「* generaterotatesuspicious の認証トークンログは、verbose_auth_token_logging 設定に関係なく常にログに記録されるようになりました*」)。

TLDR; その変更では、削除も無条件にすることを忘れていました。

「いいね!」 3

かしこまりました。今後数週間で解決いたします。お急ぎの場合は、プルリクエスト(テスト済みで期待どおりに動作することを確認したもの)をお送りください。

「いいね!」 1

PRを作成しました Sign in to GitHub · GitHub

そして、先を越されたようです :slight_smile:

「いいね!」 2

はい、そのPRは@Osamaのおかげでマージされました。user_auth_token_logsのほとんどのタイプに対応していますが、すべてではありません。近日中にgenerateエントリの修正を行う予定です。(詳細については、上記のPRリンクでの議論を参照してください)。

フォローアップに対応している間、このトピックは開いたままにしておきます。

「いいね!」 4