ファイルごとに継続的に読みながら、Apacheサーバーのerror.logファイルからファイルを分割する方法は?

StackOverflow https://stackoverflow.com/questions/4089275

質問

私はこのようにやったことがありますが、私が書いたShellscriptに問題があります。私はテールコマンドの機能と混同されており、ターミナルにerror.logの出力が表示されると、単語から削除された「e」が表示されます。

私はこのように書いたことがあります。私の問題を解決するにはどうすればよいですか。このerror.logファイルを行ごとに読みたいです。読み取り線中に、固定数の行数を接尾辞IE log-aa、log-ab、... splitコマンドを使用してこれを行いました。分割した後、regexを使用してget Wordを使用してラインをフィルタリングし、このフィルタリングされた行を新しいファイルに保存したいと思います。このストアが完了した後、これらすべてのログ*ファイルを削除する必要があります。

私はこのように書いた:

enter code here
processLine(){
  line="$@"
  echo $line
  $ tail -f $FILE
}
FILE="/var/log/apache2/error.log"
if [ "$1" == "/var/log/apache2/error.log" ]; then
   FILE="/dev/stdin"
else
   FILE="$1"
   if [ ! -f $FILE ]; then
   echo "$FILE : does not exists"
   exit 1
   elif [ ! -r $FILE ]; then
   echo "$FILE: can not read"
   exit 2
   fi
fi
#BAKIFS=$IFS
#IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$FILE"
#sed -e 's/\[debug\].*\(data\-HEAP\)\:\/-->/g' error.log > /var/log/apache2/error.log.1
while read -r line
do
 processLine $line
done
exec 0<&3
IFS=$BAKIFS
logfile="/var/log/apache2/error.log"
pattern="bytes"
# read each new line as it gets written
# to the log file
#tail -1 $logfile 
tail -fn0 $logfile | while read line ; do
# check each line against our pattern
echo "$line" | grep -i "$pattern" 
#sed -e 's/\[debug\].*\(data\-HEAP\)\:/-->/g' error.log >/var/log/apache2/error.log
split -l 1000 error.log log-  
FILE2="/var/log/apache2/log-*"
if [ "$1" == "/var/log/apache2/log-*" ]; then
   FILE2="/dev/stdin"
else
   FILE2="$1"
   if [ ! -f $FILE2 ]; then
   echo "$FILE : does not exists"
   exit 1
   elif [ ! -r $FILE2 ]; then
   echo "$FILE: can not read"
   exit 2
   fi
fi
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$FILE2"
while read -r line
do
 processLine $line
 echo $line >>/var/log/apache2/url.txt
done
exec 0<&3
IFS=$BAKIFS
find . -name "var/log/apache2/logs/log-*.*" -delete
done
exit 0

以下のコードは、error.logの読み取りと分割後にファイルを削除します。ただし、テール-f $ファイルを配置すると、ファイルの削除を停止します。

processLine(){
line="$@" 
echo $line
}
FILE=""
if [ "$1" == "" ]; then
FILE="/dev/stdin"
else
FILE="$1"
# make sure file exist and readable
if [ ! -f $FILE ]; then
echo "$FILE : does not exists"
exit 1
elif [ ! -r $FILE ]; then
echo "$FILE: can not read"
exit 2                                     
fi
fi
#BAKIFS=$IFS
#IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$FILE"
while read -r line
do
processLine $line
split -l 1000 error.log log-
cat log-?? | grep "GET\|POST" > storefile 
#tail -f $FILE
done 
rm log-??
exec 0<&3 
#IFS=$BAKIFS
exit 0
役に立ちましたか?

解決

あなたのコードは不必要に長く複雑であるように思われ、ロジックは不明です。正しく作業せずにこれを大きく成長させることを許可されるべきではありません。

このことを考慮:

split -l 1000 error.log log-
cat log-?? | grep "GET\|POST" > storefile
rm log-??

これを試してください。これらの3つのコマンドが期待していることを行う場合、より多くの機能を追加できます(例:パスを使用して、の存在をチェックすることができます error.log)、しかし、このパートが機能するまでコードを追加しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top