stderr를 파일로 리디렉션하고 각 줄 앞에 문자열을 추가합니다.

stderr를 파일로 리디렉션하고 각 줄 앞에 문자열을 추가합니다.

문자열 앞에 stderr 명령을 파일로 리디렉션하고 싶습니다.

exec >&2 "$log_file"
command

예상 로그 파일:

2021-07-13 09:34:03+07:00 [stderr] error lines ...
...

타임스탬프는 단지 예시일 뿐입니다. 다른 스크립트에 다른 것을 사용할 수도 있습니다.

나는 이것을 사용하고 싶습니다 :

command | xargs -n1 printf '[%s] %s\n' "`date --rfc-3339=s`" 2>> "$log_file"

그러나 이는 파이프된 명령의 종료 상태를 무시합니다. 그리고 매우 느립니다.

bash(또는 다른 쉘 ) 에서 exec 2>> "$log_file".exec

답변1

Bash에서는 매우 간단합니다.

exec 2> >(perl -MDate::Format -pe 's/^/time2str("%Y-%m-%d %H:%M:%S%z [stderr] ",time)/e' > /var/log/some.log)

Perl 한 줄짜리 스크립트를 독립형 스크립트로 변환할 수 있습니다.

#!/usr/bin/perl
use Date::Format;
while(<>) {
  s/^/time2str("%Y-%m-%d %H:%M:%S%z [stderr] ",time)/e;
  print;
}

마찬가지로 다른 이름으로 저장 /usr/local/bin/timestamp-text하고 실행 가능하게 만드세요 chmod +x /usr/local/bin/timestamp-text. 그런 다음 다음과 같이 작성할 수 있습니다 exec.

exec 2> >(/usr/local/bin/timestamp-text > /var/log/some.log)

Bourne과 같은 다른 쉘에서는 프로세스로 리디렉션 교체를 사용할 수 없으며 execfifo를 사용해야 합니다. 동일한 답변을 다시 작성하고 싶지 않으므로 비슷한 질문에 대해 제가 작성한 다른 답변을 알려드리겠습니다.https://unix.stackexchange.com/a/644862/7696

그런데 timestamp-text스크립트(또는 한 줄 버전)는 날짜 형식 지정 기능이 좋은 한(대부분의 언어에서 가능) 원하는 언어로 작성할 수 있습니다. 처음 실행된 시간뿐만 아니라 수정하는 모든 입력 행의 현재 시간을 쿼리해야 합니다. 그렇지 않으면 다음을 /bin/date사용할 수 있습니다.

알아채다:날짜 형식libtimedate-perl모듈은 데비안 패키지에 있습니다 . 패키지에는 및 Date::Parse모듈 도 포함되어 있습니다 . 또한 대부분의 다른 배포판에 대한 패키지로도 사용할 수 있어야 합니다 . 그렇지 않으면 .Date::LanguageTime::Zonecpan


고쳐 쓰다

나는 이런 종류의 타임스탬프를 수행하도록 특별히 설계된 이라는 프로그램이 있다는 것만 기억합니다. ts따라서 자신만의 Perl이나 스크립트를 작성할 필요가 없습니다. 그것은에있을 수 있습니다더 많은 유틸리티팩.

exec 2> >(ts "%Y-%m-%d %H:%M:%S%z [stderr]" > /var/log/some.log)

그러나 이는 perl그 자체로 스크립트이므로 다음이 필요합니다.Getopt::긴설치할 모듈 및 (사용하는 명령줄 옵션에 따라) 필요할 수도 있습니다 Date::Parse.시간::기간,그리고/또는시간::고해상도. Time::Hires는 Perl에 포함되어야 하는 핵심 Perl 라이브러리 모듈입니다.

관련 정보