私は、さまざまなホームブルーアプリケーション、いくつかのWeb API、いくつかのバックグラウンドデータ処理、複数のデータベース、そしてまだ見つからないものを実行する2つのLinuxシステムを持っています。このようなシステムは、何人かの人々が数ヶ月にわたって構築され、各サーバーがどのように使用されているかを実際に知っている人はいませんでした。これらのプロジェクトを開発した人々の中には、インターンや請負業者がいましたが、その後も進み続けました。だから私たちは何も整理する方法を知りません。
どのログファイルが記録されているか、特に奇妙な場所(つまり/ var / logではない)に記録されたファイルを特定しようとしています。また、回転していないすべてのログファイルを見つけようとしています。特にファイルが急速に増えている場合はさらにそうです。先週、ディスク制限を超えてプロセスが中断された2台のサーバーが見つかりました。私の目標は、合理的なロギングを実行し、最終的にすべてをELKスタックに送信するように各アプリケーションを再構成することですが、今は私が何を得たのかを理解するだけです。
だからまずログファイルですべてを見つけようとしました。システム全体にランダムに散在していると難しいです。一部は/home/someuserの下、一部は/rootの下、一部は/tmpの下、一部は/var/libの下にあります。
ログファイルを見つける最初のアイデアは、最近修正されたファイルを見つけることです。この回答をご覧ください。https://askubuntu.com/a/704163/139584
しかし、これは私に多くの騒音を引き起こします。データベースはコンテンツをディスクに保存してファイルに書き込み、システムアップデートはバイナリファイルを置き換えてコンテンツを変更し、ユーザーは自宅でコンテンツを変更します。
次に考えたのは名前で検索することでした。ほとんどのログファイルは.logで終わりますが、一部はそうではありません。たぶん、いくつかのパス名のどこかに「log」があるかもしれません。この回答をご覧ください。https://askubuntu.com/a/144703/139584
ログリストがある場合は、logrotateルールを検索して一致するものがあるかどうかを検索できます。 forとgrepを使うと簡単になります。
ロギングが解除されたLinuxシステムで失われたログファイルを列挙する方法についてもっと知っている人はいますか?
答え1
私は次の理由でこれが興味深い質問だと思います。
- 同様のシステムに直面する可能性があり、ファイル/ファイルシステムの増加に対処する必要があります。
- 「ローカル」ファイルシステムのリストを収集することは容易ではありません。
- 成長を決定するには、時間間隔を置いて数回確認する必要があります。
- 通常、「ユーザーホームディレクトリ」を除外するときは注意が必要です。
find
私は過去7日以内に高レベルで修正された実行不可能なファイルを見つけてから1分間スリープ状態に保ち、ファイルの42を超えたことを確認するためにファイルを再スキャンするスクリプトを思いつきました。バイト。
もちろん、任意の数字はスクリプトのコピーで自由に編集できます。
- 省電力時間(ログファイルが大きくなるまで待機)
- 注意すべき成長の程度
- ファイルが最近どのように変更されたか
以下を使用してローカルファイルシステムのリストを収集します。lsblk
、マウントポイントのみを持つ無題のリストを作成するように要求します。その出力には必ずしもマウントされていないブロックデバイス(ディスク全体、スワップ領域など)が含まれているため/
。
ホームディレクトリを除外するのは良い考えのようですが、すべてのホームディレクトリが下にあると仮定したくないので、次から/home
始めます。/etc/login.defs「一般」ユーザーの開始範囲としてawkを使用して、/ etc / passwdからそのユーザーのホームディレクトリを抽出します。これにより、これらのホームディレクトリがからコピーされますfind
。
ガイドライン
すべてのファイル名を安全にキャプチャするためにfind ... -print0
組み合わせを使用したいが、nullで区切られたreadarrayには最新のbashバージョン(4.4-alpha以降)が必要です。代わりに、改行文字を含む関連ファイル名にエラーが発生する可能性があるという警告で妥協してreadarray -t -d ''
使用しました。find ... -print
スクリプトは(単一の実行中に)見つかりません。新しく作られたログファイル:潜在的なログファイルの初期リストを収集し、同じリストに戻り、どのファイルが増えたかを確認します。新しく作成されたファイルは、後続の実行でのみキャプチャされます。
スクリプト
#!/bin/bash
# files that grow by more than this much are interesting; in bytes per second; also, the answer to Life, the Universe, and Everything
rate=42
# how long we'll wait to account for file growth
sleeptime=60
function gethomedirs() (
uidmin=$(awk '/^UID_MIN/ { print $2 }' < /etc/login.defs)
awk -F: -v umin="$uidmin" '$3 >= umin { print $6 }' < /etc/passwd | sort -u
)
function findlogfiles {
readarray -t homedirs < <(gethomedirs)
if [ ${#homedirs[@]} -eq 0 ]
then
excludes=()
elif [ ${#homedirs[@]} -eq 1 ]
then
excludes=("( -path ${homedirs[0]} ) -prune -o")
else
excludes=()
excludes+=("(")
excludes+=(" -path ${homedirs[0]}")
for((i=1; i < ${#homedirs[@]}; i++))
do
excludes+=(" -o -path ${homedirs[i]}")
done
excludes+=(") -prune -o ")
fi
find $(lsblk --list --noheadings --output MOUNTPOINT | grep /) \
-xdev \
${excludes[@]} \
-type f -mtime -7 ! -executable -print
}
readarray -t files < <(findlogfiles)
declare -A initialsize
for file in "${files[@]}"
do
initialsize["$file"]=$(stat -c %s "$file")
done
#echo Waiting $sleeptime seconds for log files to grow... >&2
sleep $sleeptime
for file in "${files[@]}"
do
# if the file went away, skip it
[ -f "$file" ] || continue
size2=$(stat -c %s "$file")
if (( size2 >= (${initialsize["$file"]} + rate * sleeptime) ))
then
printf "%s\n" "$file"
fi
done
答え2
だから私は完全に満足していないが、計画を立てた。
私はすでに持っているアイデアを使用しましたが、あまり一般的ではありませんでした。特定の場所のログファイルを探していますが、特定のサイズ(1M)より大きいログファイルのみを探しています。だから誰かが奇妙な場所にログを残しておけば、私が見つけることができません。 logrotateによってファイルが回転しないようにするには、まずログ回転を手動でトリガーします。これにより、検索を実行する前にファイルが切り捨てられます。また、ログファイルの名前が* .logであると仮定しているので、誰かが奇妙な名前のログを持っていると見つからず、最終的に問題が発生します。私たちのチームにELKスタックを使用するように教えて、近いうちにこの問題を解決したいと思います。
各コンピュータで実行するスクリプトは次のとおりです。
#!/bin/sh
sudo logrotate -vf /etc/logrotate.conf
sudo find /var/log -type f -mtime -2 -name "*log" -size +1M -exec sudo ls -l {} \;
sudo find /home -type f -mtime -2 -name "*log" -size +1M -exec sudo ls -l {} \;
sudo find /root -type f -mtime -2 -name "*log" -size +1M -exec sudo ls -l {} \;