tail -f 최근 로그 파일

tail -f 최근 로그 파일

어떤 곳에서는 내가 작동하게 만들었어

ls -rt /path/to/log/file/ | tail -1 | xargs tail -f

하지만 왜 항상 작동하지 않는지 이해가 되지 않습니다.
(여기서 로그 롤링을 수정할 때까지 이는 빠른 수정입니다.)

답변1

정렬 명령과 THE최근 로그 파일

-r출력 끝 도달을 사용하는 대신 (역 정렬 순서)을 사용하는 이유는 무엇입니까 tail?

일반적인 정렬 순서를 사용하고 첫 번째 항목을 얻는 것이 더 빠릅니다!

tail -f `/bin/ls -1td /path/to/log/file/*| /usr/bin/head -n1`

또는

tail -f $(/bin/ls -1t /path/to/log/file/* | /bin/sed q)

잘 작동합니다.

sed참고: 이 명령이 에 있기 때문에 설치하기 /bin전에 사용하는 것을 선호합니다 /usr.

tail -f `/bin/ls -1tr /path/to/log/file/* | /bin/sed -ne '$p'`

작동하지만 이미 말했듯이: 마지막 항목만 사용하기 위해 전체 출력을 삭제하는 대신 정렬 순서를 반대로 하면 작동하지 않습니다.정말 좋은 생각이야;-)

경고하다, 마지막 디렉터리에서 *디렉터리와 일치해서는 안 됩니다. 그렇지 않으면 명령이 tail해당 디렉터리를 여는 방법을 알 수 없습니다.

동일하지만 find최신 파일을 검색하는 경우:

read -a file < <(
    find /tmp 2>/dev/null -type f -mmin +-1 -mmin -10 -printf "%Ts %p\n" |
    sort -rn)
tail -f ${file[1]}

노트:

  • -mmin +-1잘못된 타이밍 파일이 나열되지 않았는지 확인하세요 .미래에.
  • read내장되어 있으며 배열을 생성하고 사용을 차단합니다.head -n1| cut -d \ -f2
  • -mmin -10이를 변경하거나 억제할 수 있지만 이렇게 하면 정렬 프로세스가 길어지는 것을 방지할 수 있습니다.

그러나 tail은 여러 파일 보기를 지원합니다.

두 개의 셸 콘솔을 열고 다음을 시도해 보세요.

첫 번째 콘솔에서:

user@host[pts/1]:~$ touch /tmp/file_{1,2,3}
user@host[pts/1]:~$ tail -f /tmp/file_{1,2,3}
==> /tmp/file_1 <==

==> /tmp/file_2 <==

==> /tmp/file_3 <==

두 번째에서는 첫 번째 콘솔이 표시된 상태에서 여러 번 클릭합니다.

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
25285
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
16381
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
19766
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
3053

첫 번째 콘솔은 다음과 같습니다.

==> /tmp/file_2 <==
25285

==> /tmp/file_1 <==
16381
19766

==> /tmp/file_3 <==
3053

...

SO 질문의 아이디어이지만 시간 기반 다중 파일

find다음 명령을 사용하면 -mmin지난 몇 분 또는 며칠 동안 수정된 파일을 모니터링할 수 있습니다 -mtime.

find /path/to/logdir -type f -mmin -10 -exec tail -f {} +

지난 10분 동안의 수정 사항을 모니터링하는 데 사용되는 로그 파일입니다.

노트:

  • man tail, 약
    • -F장시간 시청 옵션
    • -q파일 이름을 인쇄하지 않는 옵션

멋진 형식

find /path/to/logdir -type f -mmin -10 -exec tail -f {} + |
    sed -une 's/^==> .path.to.logdir.\(.*\) <==$/\1             /;ta;bb;
               :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
               :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'

거기에서 더 적합한 길이로 수정 .path.to.logdir.하고 변경할 수 있습니다 .12

예를 들어, 두 개의 콘솔을 유지하고 첫 번째 콘솔은 중지하고 시도합니다.

user@host[pts/1]:~$ find /tmp/ -type f -mtime -1 -name 'file_?' -exec tail -f {} + |
    sed -une 's/^==> .tmp.\(.*\) <==$/\1             /;ta;bb;
        :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
        :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'
file_2      :  25285
file_1      :  16381
file_1      :  19766
file_3      :  3053

두 번째 콘솔보다 다시 일부를 클릭하십시오.

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM

답변2

이는 파일 이름만 제공하고 /path/to/log/file파일 을 찾을 수 없으므로 에 있지 않으면 작동하지 않습니다 . 끝에 하나를 추가 하면 전체 경로가 제공됩니다.lstail -f*ls

ls -rt /var/log/apache2/* | tail -1 | xargs tail -f

답변3

가장 간단한 해결책은 zsh를 사용하고 활용하는 것입니다.글로벌 예선 om수정 시간을 기준으로 정렬하고(가장 최근 항목부터) [1]첫 번째 일치 항목만 유지합니다.

tail -f /path/to/log/directory/*(om[1])

zsh가 없다면 zsh를 설치하세요. zsh를 정말로 설치하고 싶지 않은 경우에는 를 사용하는 것도 나쁘지 않습니다 ls. 파일 이름에 특수 문자가 포함되어 있지 않은 한 로그 파일에는 괜찮습니다(인쇄할 수 없는 문자는 문제를 일으킬 수 있습니다). 알아채다Paylo Almeida가 이미 말했듯이ls /path/to/log/directory에 대한 상대 경로를 표시하므로 출력을 사용할 수 없습니다 /path/to/log/directory. 먼저 이 디렉터리로 변경할 수 있습니다.

cd /path/to/log/directory
tail -f "$(ls -t | head -n 1)"

또는 다음 경로를 추가할 수 있습니다.

tail -f "/path/to/log/directory/$(ls -t /path/to/log/directory | head -n 1)"

또는 ls전체 경로를 인쇄할 수 있습니다.

tail -f "$(ls -t /path/to/log/directory/* | head -n 1)"

tail명령은 나중에 새로운 로그 파일이 생성되더라도 동일한 파일을 영원히 추적합니다. 자동으로 다른 파일로 전환하려면 새 파일을 감지하고 tail새 파일에서 새 인스턴스를 시작하는 보다 정교한 접근 방식이 필요합니다. Linux에서는 다음을 사용할 수 있습니다.inotify상호 작용.

while true; do
  tail -n +1 -f /path/to/log/directory/*(om[1])
  inotifywait -qq -e create /path/to/log/directory
  kill $!
done

답변4

이벤트 로그 디렉토리로 이동하여 다음을 제공하십시오.꼬리 -f*최근 로그를 모두 봅니다.

관련 정보