저는 다양한 홈브루 애플리케이션, 일부 웹 API, 일부 백그라운드 데이터 처리, 여러 데이터베이스 및 아직 찾지 못한 것들을 실행하는 두 개의 Linux 시스템을 가지고 있습니다. 이러한 시스템은 여러 사람이 몇 달에 걸쳐 구축했으며 각 서버가 어떻게 사용되는지 실제로 아는 사람은 아무도 없었습니다. 이러한 프로젝트를 개발한 사람들 중 일부는 인턴이나 계약자였지만 이후 계속 전진했습니다. 그래서 우리는 아무것도 구성하는 방법을 모릅니다.
어떤 로그 파일이 기록되고 있는지, 특히 이상한 위치(즉, /var/log가 아닌)에 기록된 파일을 파악하려고 합니다. 또한 회전되지 않은 모든 로그 파일을 찾으려고 노력하고 있습니다. 특히 파일이 빠르게 증가하는 경우 더욱 그렇습니다. 지난 주에 디스크 제한을 초과하고 프로세스가 중단된 서버 두 대를 발견했습니다. 내 목표는 합리적인 로깅을 수행하고 결국 모든 것을 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 {} \;