[bash] 로그 파일 및 콘솔에 출력 쓰기

유닉스 쉘에서 나는 (A ENV 파일이 ENV 파일은 파일, 데이터베이스 연결 정보 등을 기록하는 로그 파일의 이름과 경로, 리디렉션 출력 및 오류 등 사용자 스크립트를 실행하는 데 필요한 매개 변수를 정의합니다 () 모든 출력을 리디렉션하는 에코 메시지를 ) 및 다음 코드를 사용하여 실행 된 스크립트의 로그 파일에 오류가 있습니다.

exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}

env 파일은 각 스크립트의 시작 부분에서 실행됩니다. env 파일의 위 코드로 인해 사용자 출력 또는 오류 일 수있는 모든 콘솔 출력이 실제로 필요한 로그 파일에 직접 출력됩니다.

그러나 콘솔과 로그 파일 모두에 표시하려는 선택적 사용자 출력이 있습니다. 그러나 위의 코드 때문에 그렇게 할 수 없습니다.

위의 코드를 제거하면이 경우에 원하는 결과를 얻을 수 있지만 다른 모든 출력을 로그 파일에 수동으로 작성해야하는 것은 쉬운 일이 아닙니다.

위의 코드를 제거하지 않고 콘솔과 로그 파일 모두에서 출력을 얻는 방법이 있습니까?



답변

exec 3>&1 1>>${LOG_FILE} 2>&1

stdout 및 stderr 출력을 로그 파일로 보내지 만 fd 3이 콘솔에 연결된 상태로 두어도됩니다.

echo "Some console message" 1>&3

콘솔에만 메시지를 쓰거나

echo "Some console and log file message" | tee /dev/fd/3

콘솔 로그 파일 모두 에 메시지를 쓰려면 – 출력을 자체 fd 1 (여기서는 )과 작성하도록 지시 한 파일 (여기서는 fd 3, 즉 콘솔)로 보냅니다 .teeLOG_FILE

예:

exec 3>&1 1>>${LOG_FILE} 2>&1

echo "This is stdout"
echo "This is stderr" 1>&2
echo "This is the console (fd 3)" 1>&3
echo "This is both the log and the console" | tee /dev/fd/3

인쇄 할 것이다

This is the console (fd 3)
This is both the log and the console

콘솔에 넣고

This is stdout
This is stderr
This is both the log and the console

로그 파일에.


답변

예, 다음을 사용합니다 tee.

tee-표준 입력에서 읽고 표준 출력 및 파일에 쓰기

다음과 같이 명령을 tee에 파이프하고 파일을 인수로 전달하십시오.

exec 1 | tee ${LOG_FILE}
exec 2 | tee ${LOG_FILE}

이것은 둘 다 출력을 STDOUT에 인쇄하고 동일한 출력을 로그 파일에 기록합니다. 자세한 내용은를 참조하십시오 man tee.

이것은 로그 파일에 stderr를 쓰지 않으므로 두 스트림을 결합하려면 다음을 사용하십시오.

exec 1 2>&1 | tee ${LOG_FILE}


답변

나는 Joonty의 대답을 시도했지만

exec : 1 : 찾을 수 없음

오류. 이것은 나에게 가장 잘 작동하는 것입니다 ( zsh에서도 작동하도록 확인 되었습니다).

#!/bin/bash
LOG_FILE=/tmp/both.log
exec > >(tee ${LOG_FILE}) 2>&1
echo "this is stdout"
chmmm 77 /makeError

이후의 /tmp/both.log 파일에는

this is stdout
chmmm command not found 

tee에서 -a를 제거하지 않으면 /tmp/both.log가 추가됩니다.

힌트 : >(...)프로세스 대체입니다. 그것은을 할 exec받는 사람 tee이 파일 인 것처럼 명령.


답변

타임 스탬프와 함께 stdout 및 로그 파일에 로그를 표시하고 싶었습니다. 위의 답변 중 어느 것도 나를 위해 일하지 않았습니다. 내가 사용했다 공정 대체간부 명령을하고 다음 코드를 함께했다. 샘플 로그 :

2017-06-21 11:16:41+05:30 Fetching information about files in the directory...

스크립트 상단에 다음 줄을 추가합니다.

LOG_FILE=script.log
exec > >(while read -r line; do printf '%s %s\n' "$(date --rfc-3339=seconds)" "$line" | tee -a $LOG_FILE; done)
exec 2> >(while read -r line; do printf '%s %s\n' "$(date --rfc-3339=seconds)" "$line" | tee -a $LOG_FILE; done >&2)

이것이 누군가를 돕기를 바랍니다!


답변

로그 파일의 경우 날짜를 입력하여 텍스트 데이터를 입력 할 수 있습니다. 다음 코드가 도움이 될 수 있습니다.

# declaring variables

Logfile="logfile.txt"
MAIL_LOG="Message to print in log file"
Location="were is u want to store log file"

cd $Location
if [ -f $Logfile ]
then
echo "$MAIL_LOG " >> $Logfile

else

touch $Logfile
echo "$MAIL_LOG" >> $Logfile

fi  

출력 : 2. 로그 파일은 첫 번째 실행에서 생성되고 다음 실행에서 계속 업데이트됩니다. 향후 실행시 로그 파일이 누락 된 경우 스크립트는 새 로그 파일을 생성합니다.


답변

원하는 출력을 얻는 방법을 찾았습니다. 다소 비 정통적인 방법 일 수 있지만. 어쨌든 여기에 있습니다. redir.env 파일에는 다음 코드가 있습니다.

#####redir.env#####    
export LOG_FILE=log.txt

      exec 2>>${LOG_FILE}

    function log {
     echo "$1">>${LOG_FILE}
    }

    function message {
     echo "$1"
     echo "$1">>${LOG_FILE}
    }

그런 다음 실제 스크립트에는 다음 코드가 있습니다.

#!/bin/sh 
. redir.env
echo "Echoed to console only"
log "Written to log file only"
message "To console and log"
echo "This is stderr. Written to log file only" 1>&2

여기서 에코 오직 콘솔 출력 로그 만 로그 파일에 출력 메시지 로그 파일 및 본체 모두에 출력한다.

위의 스크립트 파일을 실행 한 후 다음과 같은 출력이 나타납니다.

콘솔에서

콘솔
에서 콘솔에만 반향 됨
콘솔 및 로그로

로그 파일의 경우

로그 파일
에서 로그 파일에만 기록됨
이것은 stderr입니다. 로그 파일에만 작성
콘솔 및 로그에

이 도움을 바랍니다.


답변

이것을 시도하면 작업이 수행됩니다.

log_file=$curr_dir/log_file.txt
exec > >(tee -a ${log_file} )
exec 2> >(tee -a ${log_file} >&2)