로그 파일 및 콘솔에 출력 쓰기
유닉스 셸에는 다음 코드를 사용하여 실행된 스크립트에서 모든 출력(에코 메시지) 및 오류를 로그 파일로 리디렉션하는 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
콘솔과 로그 파일 모두에 메시지 쓰기 -tee
서 fd1은 "fd1"(fd1은 "fd1")로 출력을 합니다.LOG_FILE
및 및 기록하라고 지시한 파일(여기에는 fd3, 즉 콘솔).
예:
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
로그 파일에 저장합니다.
나는 준티의 대답을 시도했지만, 나는 또한 그것을 받았습니다.
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
티에서 -a를 제거하지 않으면 /tmp/both.log가 추가됩니다.
힌트:>(...)
프로세스 대체입니다.그것은 그것을exec
에▁tee
파일인 것처럼 명령합니다.
은 사, 는려경우를 .tee
:
tee - 표준 입력에서 읽고 표준 출력 및 파일에 쓰기
명령어를 티에 연결하고 다음과 같이 파일을 인수로 전달합니다.
exec 1 | tee ${LOG_FILE}
exec 2 | tee ${LOG_FILE}
이렇게 하면 출력이 STDOUT로 인쇄되고 로그 파일에 동일한 출력이 기록됩니다.» man tee
자세한 정보는.
이렇게 하면 로그 파일에 stderr이 기록되지 않으므로 두 스트림을 결합하려면 다음을 사용합니다.
exec 1 2>&1 | tee ${LOG_FILE}
stdout의 로그와 로그 파일을 타임스탬프와 함께 표시하고 싶었습니다.위의 답변 중 하나도 저에게 효과가 없었습니다.프로세스 치환과 exec 명령을 사용하여 다음 코드를 만들었습니다.샘플 로그:
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.로그 파일은 처음 실행할 때 생성되고 다음 실행부터는 계속 업데이트됩니다.나중에 실행할 때 로그 파일이 없는 경우 스크립트는 새 로그 파일을 만듭니다.
이것을 사용해 보십시오. 효과가 있을 것입니다.
log_file=$curr_dir/log_file.txt
exec > >(tee -a ${log_file} )
exec 2> >(tee -a ${log_file} >&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
여기서 에코 출력은 콘솔에만, 로그 출력은 로그 파일에만, 메시지 출력은 로그 파일과 콘솔 모두에 출력됩니다.
위 스크립트 파일을 실행한 후 다음과 같은 출력이 나타납니다.
콘솔에서
에만
및 에 기록하기
로그 파일의 경우
In Log File 로그 파일에만 기록
여기는 stderr입니다.
및 에 기록하기
도움이 되길 바랍니다.
#
#------------------------------------------------------------------------------
# echo pass params and print them to a log file and terminal
# with timestamp and $host_name and $0 PID
# usage:
# doLog "INFO some info message"
# doLog "DEBUG some debug message"
# doLog "WARN some warning message"
# doLog "ERROR some really ERROR message"
# doLog "FATAL some really fatal message"
#------------------------------------------------------------------------------
doLog(){
type_of_msg=$(echo $*|cut -d" " -f1)
msg=$(echo "$*"|cut -d" " -f2-)
[[ $type_of_msg == DEBUG ]] && [[ $do_print_debug_msgs -ne 1 ]] && return
[[ $type_of_msg == INFO ]] && type_of_msg="INFO " # one space for aligning
[[ $type_of_msg == WARN ]] && type_of_msg="WARN " # as well
# print to the terminal if we have one
test -t 1 && echo " [$type_of_msg] `date "+%Y.%m.%d-%H:%M:%S %Z"` [$run_unit][@$host_name] [$$] ""$msg"
# define default log file none specified in cnf file
test -z $log_file && \
mkdir -p $product_instance_dir/dat/log/bash && \
log_file="$product_instance_dir/dat/log/bash/$run_unit.`date "+%Y%m"`.log"
echo " [$type_of_msg] `date "+%Y.%m.%d-%H:%M:%S %Z"` [$run_unit][@$host_name] [$$] ""$msg" >> $log_file
}
#eof func doLog
로그 파일에 stdout과 stderr를 모두 추가하는 것이 매우 유용하다고 생각합니다.저는 알퐁스에 의한 해결책을 볼 수 있어서 기뻤습니다.exec > >(tee -a)
어떻게 하면 이를 달성할 수 있을지 궁금했기 때문입니다.exec
구문과 here-doc 구문을 사용하는 인 솔루션을 했습니다..
: https://unix.stackexchange.com/questions/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell-script
zsh에서 here-doc 솔루션은 "multios" 구조를 사용하여 stdout/stderr과 로그 파일 모두에 출력을 복사하도록 수정할 수 있다는 것을 발견했습니다.
#!/bin/zsh
LOG=$0.log
# 8 is an arbitrary number;
# multiple redirects for the same file descriptor
# triggers "multios"
. 8<<\EOF /dev/fd/8 2>&2 >&1 2>>$LOG >>$LOG
# some commands
date >&2
set -x
echo hi
echo bye
EOF
echo not logged
그것은 그것만큼 읽을 수 없습니다.exec
솔루션은 스크립트의 일부만 기록할 수 있다는 장점이 있습니다.물론 EOF를 생략하면 전체 스크립트가 로깅으로 실행됩니다.어떻게 하는지 잘 모르겠습니다zsh
가 구보를현지적다오은가보다 을 수 .tee
불행히도 멀티오를 사용할 수 없는 것 같습니다.exec
.
언급URL : https://stackoverflow.com/questions/18460186/writing-outputs-to-log-file-and-console
'programing' 카테고리의 다른 글
다른 테이블에 없는 ID의 레코드를 찾기 위한 SQL 쿼리 (0) | 2023.05.03 |
---|---|
AngularJS에서 컨트롤러 간에 통신하는 올바른 방법은 무엇입니까? (0) | 2023.05.03 |
iOS 10에서 UITextView 상단의 공백 (0) | 2023.05.03 |
WPF Scroll Viewer에서 스크롤 막대 너비를 높이는 방법은 무엇입니까? (0) | 2023.05.03 |
특정 커밋에서 분기점을 만들려면 어떻게 해야 합니까? (0) | 2023.05.03 |