결과를 바이너리 파일로 기록하기 위한 컬러 Printf 리디렉션

결과를 바이너리 파일로 기록하기 위한 컬러 Printf 리디렉션

나는 큰 대본을 작성했습니다. 스크립트는 잘 작동하는데, 제가 겪고 있는 문제는 리디렉션입니다. 로그 파일로 리디렉션하기 위해 다음 블록을 수행했습니다.

log_location=/home/admin
exec > >(tee -i $log_location/health-check.log)
exec 2>&1
echo -e "Output will be saved at $log_location/health-check.log\n"

스크립트에는 다음과 같은 색상이 있습니다.

G="\033[32m"
N="\033[0m"
R="\033[31m"
Y="\033[33m"

이 콘솔 출력은 필요한 문자를 컬러 형식으로 인쇄합니다. 그러나 .log 파일을 줄이면 결국 바이너리 파일이 되고, 보면 다음과 같은 내용이 표시됩니다.

ESC[33mGSANESC[0m Service Status is              |ESC[32mUPESC[0m
ESC[33mMCSESC[0m Service Status is               |ESC[32mUPESC[0m
ESC[33mTomcatESC[0m Service Status is    |ESC[32mUPESC[0m
ESC[33mSchedulerESC[0m Service Status is         |ESC[31mDOWNESC[0m
ESC[33mMaintenanceESC[0m Service Status is       |ESC[31mSUSPENDEDESC[0m

로그 파일에 색상이 지정되지 않은 출력이 있어도 괜찮습니다. 이 작업을 수행할 수 있는 방법이 있나요?

답변1

sed로그 파일 출력에서 ​​색상 코드를 제거 할 수 있습니다 . 이를 tee위해서는 stdout 및 파이프에서 출력을 가져와야 하므로 완전히 간단하지는 않습니다. 서브쉘 리디렉션 트릭보다 더 좋은 방법이 있을 수 있습니다. 이것은 Bash 및 GNU sed에서 작동하는 것으로 보이며 stdout은 빨간색으로 표시되고 error로그 파일에는 색상 코드가 없습니다.

#!/bin/bash
exec > >( (tee -a /dev/fd/7 | sed -Ee $'s/\033''\[[0-9][0-9]?m//g ' > logfile) 7>&1 )
N=$'\033[0m'
R=$'\033[31m'
echo "${R}error${N}: foo"

Linux에서 다시 열 때 영향을 방지하기 위한 셸의 또 다른 옵션은 다음과 같습니다./dev/fd/N

#!/bin/bash
exec > >(
        exec 7>logfile
        while IFS= read -r x ; do 
                echo "$x"
                x=${x//$'\033'\[[0-9]m}
                x=${x//$'\033'\[[0-9][0-9]m}
                echo "$x" >&7
        done    
)
N=$'\033[0m'
R=$'\033[31m'
echo "${R}error${N}: foo"

분명히 NUL 바이트 문제가 있지만 로그 출력에는 그러한 문제가 많지 않을 것입니다. 아마도 Perl 스크립트가 여기에서 가장 좋을 것입니다.

스크립트에서 인쇄된 메시지에만 관심이 있다면 표준 출력과 로그 파일에 메시지를 인쇄하고 후자에서 색상 코드를 제거하는 함수를 만들 수 있습니다. 그러나 이는 명령 출력을 동일한 로그 파일에 저장하는 데 도움이 되지 않습니다.

답변2

sed// ... 필터를 사용하여 awk파이프 리디렉션 기반 로그에서 색상 정의를 제거할 수 있습니다 tee(이전 답변에서 제안한 대로).

...또는 단순히 색상이 지정되지 않은 로그 출력을 생성하고 로그 시각화 도우미 자체에서 색상을 처리하도록 합니다.multitail좋은 후보 도구입니다.

관련 정보