stdout 및 stderr을 여러 로그 파일로 보내는 가장 좋은 방법은 무엇입니까?

stdout 및 stderr을 여러 로그 파일로 보내는 가장 좋은 방법은 무엇입니까?

정리 프로세스를 실행 중이며 사용 중인 명령은 다음과 같습니다.

find $sentPurgerFolder -mtime +7 -print -delete >> $sentPurgeLogFile 2>&1

이 코드는 지울 여러 데이터 폴더가 있는 클라이언트를 반복하는 while 루프 안에 있습니다. 목적은 해당 클라이언트의 폴더 수에 관계없이 모든 정리 정보를 해당 클라이언트의 단일 로그 파일로 보내는 것입니다. 이 부분은 잘 되는 것 같습니다.

제가 연결을 끊은 것은 동일한 출력을 기본 로그 파일로 보내고 싶지만 제가 본 "티" 예제 때문에 잠시 멈추게 되었다는 것입니다. 로그 데이터를 두 배로 늘리지 않고 이 명령을 내 코드에 통합하는 방법을 모르겠습니다.

누구든지 통찰력을 제공하거나 제안할 수 있습니까?

답변1

find ... 2>&1각각을 에 파이프합니다 tee -a "$sentPurgeLogFile". 이렇게 하면 명령의 출력이 findvalue 에 지정된 파일에 추가되지만 $sentPurgeLogFile동일한 출력이 루프의 표준 출력으로 전송됩니다 while.

루프의 출력을 while"마스터" 로그 파일로 리디렉션합니다.

while ...; do

    # find commands here, e.g.
    find "$sentPurgerFolder" -mtime +7 -print -delete 2>&1 | tee -a "$sentPurgeLogFile"

done >master.log

이렇게 하면 각 클라이언트의 출력을 자체 로그 파일에 저장하는 동시에 모든 출력을 master.log.

while루프가 단일 루프를 실행하는지 , 아니면 여러 루프를 실행하는지 확실하지 않습니다 find. Single 을 실행하는 경우 명령이 실행될 때마다 해당 클라이언트에 대한 새 로그 파일을 생성하는 옵션을 find제거하십시오 . 여러 명령을 실행하는 경우 첫 번째 명령에만 이 작업을 수행할 수 있습니다 . 분명히, 스크립트에 대한 모든 호출의 누적 로그를 저장하려는 경우가 아니라면(이 경우 루프 대신 사용할 수도 있습니다 ).-ateefindtee>>master.log>master.log

답변2

알았어, 물어볼게. 내가 상상하는 것을 고려하면 당신이 달성하려고 노력하고 있습니다. 이것이 내가 사용해 볼 수 있는 것입니다.

내 가설:

  • 결과를 메인 로그에 덤프(추가)
  • 디렉토리에는 하위 디렉토리가 있을 수 있습니다.
#!/bin/sh -

masterlog="/some/place/some.file"

dirlist="
/one/place
/two/place
/three/place
"
for d in $dirlist
do
    cd $d
for f in `find . -mtime +7 -maxdepth 1 -type f`
do
    cat $f >>$masterlog
    echo ''>$f
done
done

exit

테스트되지 않은

당신이 하려는 일은 모든 개별 로그의 내용을 에 수집한 $masterlog다음 해당 개별 로그의 내용을 비우는 것이라고 생각합니다.

내가 옳다면. 그러면 끝났습니다. :)

화타이

답변3

나는 이 기사를 완전히 부정하는 또 다른 방법을 찾았지만, 내가 한 일을 설명하려고 노력할 것입니다...

그래서 "%"로 구분된 클라이언트 구성 파일이 있습니다. 이는 sftp 프로세스에 의해 한 줄씩 읽혀지며 클라이언트에서 데이터를 푸시하거나 클라이언트에서 데이터를 가져옵니다. 다음과 같습니다.

...
client_1%FileContent_1%xml%...(client connection info)
client_1%FileContent_2%txt%...(client connection info)
client_1%FileContent_3%pdf%...(client connection info)
client_2%FileContent_1%xml%...(client connection info)
client_2%FileContent_2%pdf%...(client connection info)
...

그래서 내 정리 프로세스는 이것을 읽고 처음 세 필드를 살펴봅니다. 이는 각 클라이언트의 기본 경로를 조합하는 데 사용됩니다.

/xmit/client/outbound

이제 위의 폴더에는 각각 "Sent" 또는 "Received" 및 "Log" 폴더가 있습니다.

/xmit/client/outbound/sent
/xmit/client/outbound/log

이 sftp 프로세스는 이러한 클라이언트에 대한 파일을 보내고 받으며 각 파일이 처리될 때 해당 파일을 /sent 및 /received 폴더에 넣고 해당 파일의 보내기/수신에 대한 전체 추적을 /log 폴더에 넣습니다.

따라서 제가 작성 중인 제거 프로세스는 제거할 폴더를 찾기 위해 동일한 구성 파일을 읽지만 각 클라이언트에 대한 제거 로그 파일을 병합하고 싶습니다.

#
# Inits....
#
basepath=/xmit
workingdir=$basepath/bin/Purge
purgeProcessLogFile=$workingdir/outboundPurge.log
#
cnfgFl=/xmit/bin/OutBoundScripts/clientsftpconfigoutbound.txt
# Config File Ref
#
declare -i cnfgFlNbrOfLns=`wc -l "$cnfgFl" | cut -d ' ' -f 1`
# Count lines in config file...
#
# Set beginning line and work from beginning line to ending line...
# 
firstpass=1
declare -i cnfgFlStrtLn="53"
declare -i currentLnNbr=$cnfgFlStrtLn
lastClient='0'
#
#  Begin while loop...
#
while [ "$currentLnNbr" -le "$cnfgFlNbrOfLns" ]
do
  # 
  #  Set what line to read from and read the data in...
  #
  option="$currentLnNbr"p
  cnfgFlLn=`sed -n $option $cnfgFl`
  #
  # Increment counter for the next loop, you've allredy got the data...
  #
  declare -i currentLnNbr=`expr $currentLnNbr + 1`
  #
  #  Check if very first character in config line is not a "#" and proceed.
  #
  fld=`echo $cnfgFlLn | cut -c1-1`
  #
  if [ "$fld" != \# ]
  then
    #
    #  Get file content... (ex: '7501' )
    #
    cntnt=`echo $cnfgFlLn | cut -d "%" -f 2`
    #
    #  Extract account from 
    #
    currClient=`echo $cnfgFlLn | cut -d "%" -f 1`
    #
    if [ $currClient != \# ] 
    then
      #
      #  Check if on new account. If new account, set 'lastClient' to current account 
      #  and reset log files...
      #
      if [ "$lastClient" != "$currClient" ]
      then
        #
        lastClient=$currClient
        #
        #  Set current date and time stamp...
        #
        dt=`date +%Y%m%d``date +%H%M%S`
        #
        #  Set sent purge log...
        #
        sentPurgeFolder=$basepath/$currClient/outbound/sent
        sentPurgeLogFile=$sentPurgeFolder/SentPurgeLogFile\_$dt.log
        #
        #  Set sent log purge log...
        #
        sentLogPurgeFolder=$basepath/$currClient/outbound/logs
        sentLogPurgeLogFile=$sentLogPurgeFolder/SentLogPurgeLogFile\_$dt.log
        #
        #  Prime new logfiles...
        #
        cat /dev/null > $sentPurgeLogFile
        cat /dev/null > $sentLogPurgeLogFile
      fi
      #
      #  See if there are any files to purge...
      #
      declare -i cntntFilesToPurge=`find $sentPurgeFolder -mtime +7 -print | wc -l`
      if [ "$cntntFilesToPurge" -gt "0" ]
      then
        #
        # 'cd' to sent folder, purge and upate logfile...
        #
        cd $sentPurgeFolder
        dt1=`date +%Y%m%d``date +%H%M%S`
        echo $dt1 - Purging "$cntntFilesToPurge" "'"$cntnt"'" data files that are 7 days or older from $sentPurgeFolder >> $purgeProcessLogFile
        find $sentPurgeFolder -mtime +7 -print -delete >> $sentPurgeLogFile 2>&1
      else
        dt1=`date +%Y%m%d``date +%H%M%S`
        echo $dt1" - No ""'"$cntnt"'" data files that are 7 days or older to purge from $sentPurgeFolder >> $purgeProcessLogFile
      fi
      #
      # See if there are any logs to purge...
      #
      declare -i logFilesToPurge=`find $sentLogPurgeFolder -mtime +7 -print | wc -l`
      if [ "$logFilesToPurge" -gt "0" ]
      then
        #
        # 'cd' to logs folder, purge and upate logfile...
        #
        cd $sentLogPurgeFolder
        dt1=`date +%Y%m%d``date +%H%M%S`
        echo $dt1 - Purging "'"$cntnt"'" 'purge log' data are 7 days or older from $sentPurgeFolder >> $purgeProcessLogFile
        find $sentLogPurgeFolder -mtime +1 -print -delete >> $sentLogPurgeLogFile 2>&1
      else
        dt1=`date +%Y%m%d``date +%H%M%S`
        echo $dt1" - No logfiles for ""'"$cntnt"'" data that are 7 days or older to purge from $sentPurgeFolder >> $purgeProcessLogFile
      fi
    fi
  fi
done
#
#  E N D   O F   F I L E
#

이 부분:

  declare -i cntntFilesToPurge=`find $sentPurgeFolder -mtime +7 -print | wc -l`
  if [ "$cntntFilesToPurge" -gt "0" ]
  then
    cd $sentPurgeFolder
    dt1=`date +%Y%m%d``date +%H%M%S`
    echo $dt1 - Purging "$cntntFilesToPurge" "'"$cntnt"'" data files that are 7 days or older from $sentPurgeFolder >> $purgeProcessLogFile
    find $sentPurgeFolder -mtime +7 -print -delete >> $sentPurgeLogFile 2>&1
  else
    dt1=`date +%Y%m%d``date +%H%M%S`
    echo $dt1" - No ""'"$cntnt"'" data files that are 7 days or older to purge from $sentPurgeFolder >> $purgeProcessLogFile
  fi
  #
  # 'cd' to logs folder, purge and upate logfile...
  #
  declare -i logFilesToPurge=`find $sentLogPurgeFolder -mtime +7 -print | wc -l`
  if [ "$logFilesToPurge" -gt "0" ]
  then
    cd $sentLogPurgeFolder
    dt1=`date +%Y%m%d``date +%H%M%S`
    echo $dt1 - Purging "'"$cntnt"'" 'purge log' data are 7 days or older from $sentPurgeFolder >> $purgeProcessLogFile
    find $sentLogPurgeFolder -mtime +1 -print -delete >> $sentLogPurgeLogFile 2>&1
  else
    dt1=`date +%Y%m%d``date +%H%M%S`
    echo $dt1" - No logfiles for ""'"$cntnt"'" data that are 7 days or older to purge from $sentPurgeFolder >> $purgeProcessLogFile
  fi

이전에는:

  #
  # 'cd' to sent folder, purge and upate logfile...
  #
  cd $sentPurgeFolder
  dt1=`date +%Y%m%d``date +%H%M%S`
  find $sentPurgeFolder -mtime +7 -print -delete >> $sentPurgeLogFile 2>&1
  #
  # 'cd' to logs folder, purge and upate logfile...
  #
  cd $sentLogPurgeFolder
  dt1=`date +%Y%m%d``date +%H%M%S`
  find $sentLogPurgeFolder -mtime +1 -print -delete >> $sentLogPurgeLogFile 2>&1

이는 로그를 "지우기" 위한 요구 사항을 충족시킵니다.

관련 정보