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プロセスによって1行ずつ読み取られ、クライアントからデータをプッシュするか、クライアントからデータを取得します。次のようになります。

...
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)
...

だから私のクリーンアッププロセスはこれを読み、最初の3つのフィールドを見ます。これは、各クライアントのデフォルトパスを組み合わせるために使用されます。

/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

これはログを「消去」するための要件を満たします。

関連情報