어떤 곳에서는 내가 작동하게 만들었어
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
파일 을 찾을 수 없으므로 에 있지 않으면 작동하지 않습니다 . 끝에 하나를 추가 하면 전체 경로가 제공됩니다.ls
tail -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*최근 로그를 모두 봅니다.