우리 모두 알고 있듯이 다음 명령을 사용하여 오류를 특정 파일로 리디렉션할 수 있습니다.
./some_script 2>error_log
여러 스크립트를 실행 중인데 해당 스크립트의 오류를 오류 파일에 넣기를 원합니다.
각 오류 인스턴스 앞에 스크립트 이름과 같은 정보를 추가할 수 있는 방법이 있습니까? 이렇게 하면 오류 로그에 오류를 게시한 스크립트 이름 등을 기록할 수 있습니다.
답변1
스크립트에 대한 오류 로깅 기능을 만듭니다. 그것은 다음과 같습니다:
logerr () {
printf '%s - %s - %s\n' \
"$(date '+%F:%T')" \
"$(basename "$0")" \
"$*" >&2
}
그런 다음 스크립트에서 이를 호출할 수 있습니다. 예를 들면 다음과 같습니다.
if false; then
: something for pass
else
logerr failed to be false
fi
그리고 2>error_log
사용할 때마다 보장됩니다. 추가를 error_log
사용해야 합니다 2>>error_log
.
다른 명령에서 오류를 잡아서 기록하려면 다음과 같은 코드를 조합하면 됩니다.
#!/bin/bash
logerr () {
local message=$*
if [[ ! -t 0 ]]; then
message=$(</dev/stdin)
fi
if [[ -n "$message" ]]; then
printf '%s - %s - %s\n' \
"$(date '+%F:%T')" \
"$(basename "$0")" \
"$*" >&2
fi
}
ls -lts /fake/path 2>&1 >/dev/tty | logerr
표준 출력을 필요한 해당 위치로 리디렉션하십시오.
이렇게 하면 logerr
스크립트가 표준 입력(열려 있는 경우)에서 읽을 수 있습니다(프로그램을 logerr로 파이프할 수 있음). 문제는 프로그램이 stderr에 오류 메시지를 보내고 stdin과 별도로 유지되기를 원한다는 것입니다.
답변2
./thescript.sh 2>&1 1>/dev/null | sed '1 s/^/error_message_starts:\n/' >> error_log;
여기의 토론과 다음 내용을 바탕으로:
https://stackoverflow.com/questions/2342826/how-to-pipe-stderr-and-not-stdout
우리가 원하는 것을 추가합니다. 오류 스트림(fd2)을 파이프할 수 있어야 합니다. 파이프로 연결할 수 있는 유일한 출력은 fd1입니다. 따라서 fd2는 fd1로 리디렉션되어야 합니다. 또한 방해가 되지 않도록 fd1을 제거해야 합니다.
- ./script.sh
- 2>&1 오류 스트림(fd2), fd1이 가는 곳으로 이동합니다.
- 1>/dev/null. Fd1이 방금 절벽에서 떨어졌습니다. 이제 오류 로그(fd2)만 파이프됩니다.
- | sed.. sed에서 파이프 작업을 수행하려면 이 내용을 앞에 추가하세요.
- >> error_log는 스트림을 오류 로그에 추가합니다.