컨테이너의 도커 로그에서 문자열 찾기
도커 컨테이너의 로그에서 특정 문자열을 찾는 가장 좋은 방법은 무엇입니까?ip에서 "127"로 시작하는 "nginx" 도커 이미지에서 만들어진 모든 요청을 보고 싶다고 가정해 보겠습니다.
grep가 도커 로그 명령에서 예상대로 작동하지 않음:
docker logs nginx | grep "127."
모든 로그를 인쇄하지만 결과를 필터링하지는 않습니다!
컨테이너가 stderr에 로깅할 경우 발생할 수 있으며 파이프는 stdout에만 작동하므로 다음을 시도해 보십시오.
docker logs nginx 2>&1 | grep "127."
"2>&1"은 셸에 stderr을 stdout으로 리디렉션하고 파이프를 사용하여 grep에 출력을 제공하도록 지시합니다.
으로 저는 vim fan을 사용하는 합니다.less ./(또는)?)
docker logs nginx 2>&1 | less
vim 검색에 대한 자세한 내용은 여기를 참조하십시오.
docker logs <container_name> 2>&1 | grep <string>
익명 파이프를 사용할 수도 있습니다.
docker logs nginx 2> >(grep '127.')
또한 로그에서 검색 중인 일부 용어를 강조 표시하는 데 유용합니다.특히 많은 로그 출력이 생성되는 생산적인 설치 환경에서는 더욱 그렇습니다.내 경우에는 강조하고 싶습니다.COUNT(*)진술들.그러나 단순한 grep로는 SQL 문 전체를 볼 수 없습니다. 여러 줄로 된 문이기 때문입니다.이는 스위치와 일부 정규식에서 가능합니다.
를 들어,은 " " ", ", ", " 를 포함하는 합니다.COUNT(*)만 아니라count(*):
docker logs <containerName> -f | grep --line-buffered -i -E --color "select count\(\*\)|$"
몇 가지 설명:
docker logs -f도커에게 로그를 따라가라고 합니다. 그러면 필터는 다음을 사용하여 볼 때와 같은 새 항목에도 적용됩니다.tail -f- 그스렙.
--line-buffered라인의 . . 이는 다음과 같은 경우 실시간으로 grep해야 합니다.docker logs -f는 사용됩니다. -E일치하지 않는 결과도 반환할 수 있는 패턴을 적용하는 데 필요한 확장 정규식 패턴입니다.--color일치하는 부분을 강조 표시합니다(Ubuntu 16.04 LTS에서는 기본 동작으로 보이지만 다른 배포에서는 아닐 수 있으므로 안전을 위해 여기에 포함했습니다).*특수 글로벌 기능을 비활성화하기 위해 탈출합니다.(,그리고.)는 그으로정피위마하다해에 의해 됩니다.-E
컨테이너가 stderr에 기록되면 Edoardo가 이미 간단한 grep에 대해 기록한 것처럼 이를 파이프로 연결할 수 있습니다.
docker logs <containerName> -f 2>&1 | grep --line-buffered -i -E --color "select count\(\*\)|$"
그-f활성 grep가 필요 없는 경우 스위치를 생략할 수 있습니다. 모두 buth가
의견을 후속 조치하고 이 문제를 해결하는 다른 사용자를 위해 이 문제를 명확히 설명합니다.nginx 컨테이너 로그를 검색하는 가장 간단한 방법은 다음과 같습니다.
docker logs nginx > stdout.log 2>stderr.log
cat stdout.log | grep "127."
IMO는 잠재적으로 매우 큰 파일을 생성하고 삭제해야 하기 때문에 다소 지저분합니다.우리가 그것을 좀 더 편리하게 만들기 위해 도구를 좀 얻을 수 있기를 바랍니다.
다음을 사용할 수 있습니다.
- 모든 셸:
docker logs nginx 2>&1 | grep "127." - 최신 버전의 bash 작업에만 해당:
docker logs nginx | &> grep "127"
이 구문은 무엇입니까?
- 표준입력(
0) - 표준 출력(
1) - 표준 오차(
2)
그>연산자는 실제로 다음을 사용하도록 기본 설정됩니다.1파일 설명자 번호로 지정할 필요가 없습니다.1>표준 출력을 리디렉션하려면: (date 1> now.txt=date > now.txt)
모두 함께
여러 스트림을 한 번에 리디렉션할 수 있습니다!이 예에서는 표준 출력을 곤충이라는 파일로 리디렉션하여 두 개의 파일을 연결합니다.txt 및 표준 오류를 오류라는 파일로 리디렉션합니다.txt의
cat bees.txt ants.txt > insects.txt 2> error.txt
공상하기
표준 출력과 표준 오류를 모두 동일한 파일로 리디렉션하려면 다음과 같이 할 수 있습니다.ls docs > output.txt 2> output.txt
아니면 우리가 대신 사용할 수 있습니다.2>&1이것은 "표준 오류를 표준 출력과 동일한 위치로 이동"하는 멋진 구문입니다.
ls docs > output.txt 2>&1
점점 더 화려해지는
최신 버전의 bash는 표준 출력과 표준 오류를 동일한 파일로 리디렉션하기 위한 팬시어 구문도 지원합니다.&>표기법
ls docs &> output.txt
일반적으로 사용합니다.-f문제를 디버깅할 때도 옵션입니다.
docker logs -f nginx 2>&1 | grep "127."
우리가 기대하는 것을 실시간으로 보여줄 것입니다.
타임스탬프를 포함하려면 -t를 추가합니다.
docker logs -ft nginx 2>&1 | grep "127."
다음 명령을 실행하여 이미지 nginx의 컨테이너 이름을 추출합니다.
docker ps --filter ancestor=nginx
마지막 명령에서 컨테이너 ID를 복사한 다음 아래 명령을 통해 컨테이너의 로그 경로 추출
grep "127." `docker inspect --format={{.LogPath}} <ContainerName>`
먼저 다음 명령을 사용합니다(b1e3c456f07f는 컨테이너 ID입니다).
docker inspect --format='{{.LogPath}}' b1e3c456f07f
결과는 다음과 같습니다.
/var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log
둘째, 다음 명령을 사용합니다(원하는 경우 vim을 사용할 수 있습니다).
nano /var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log
최고 등급의 솔루션은 저에게 적합하지 않았습니다. Grep은 이 출력물을 인쇄했고, 저는 제가 찾고 있는 것을 제대로 찾을 수 없었습니다(저는 nginx가 아닌 맞춤형 도커 컨테이너로 시도하고 있습니다).
docker logs collector 2>&1 | grep "ERROR"
grep: (standard input): binary file matches
저의 해결책은 grep -a '패턴'을 사용하는 것이었습니다.
grep의 man 페이지에서:
-a, --text 이진 파일을 텍스트인 것처럼 처리합니다. 이는 --tfts-files=text 옵션과 동일합니다.
이 방법은 저에게 적합합니다.
docker logs collector | grep -a 'ERROR'
언급URL : https://stackoverflow.com/questions/34724980/finding-a-string-in-docker-logs-of-container
'programing' 카테고리의 다른 글
| 도커 브라우저가 리포지토리에서 최신 이미지를 사용하도록 하는 방법 (0) | 2023.09.02 |
|---|---|
| Spring Security 사용자 지정 인증 - 인증 공급자 대 사용자 세부 정보 서비스 (0) | 2023.09.02 |
| Python panda: Excel 파일을 읽을 때 데이터 유형을 지정하는 방법은 무엇입니까? (0) | 2023.09.02 |
| DIV가 전체 테이블 셀을 채우도록 합니다. (0) | 2023.09.02 |
| 크기 조정이 잘못됨; 제거할 수 없는 '최소 너비: 최소 내용'이 있는 것 같습니다. (0) | 2023.09.02 |
