كيفية تقسيم الملفات من ملف error.log لخادم Apache أثناء قراءة سطر الملف على السطر بشكل مستمر؟
سؤال
لقد فعلت مثل هذا ولكني أواجه مشكلة مع Shellscript التي كتبتها. أشعر بالارتباك مع وظائف أمر الذيل وأيضًا عندما أرى إخراج الخطأ.
لقد كتبت مثل هذا من فضلك أرشدني كيف يمكنني حل مشكلتي. أرغب في قراءة هذا الخطأ. LOG LINE من سطر وخلال خطوط القراءة ، أريد تقسيم عدد الخطوط الثابتة إلى الملفات الصغيرة مع لاحقة IE LOG-AA ، LOG-AB ، ... لقد فعلت ذلك باستخدام الأمر المقسم. بعد الانقسام ، أرغب في تصفية الخطوط باستخدام Get أو نشر Word فيها باستخدام Regex وتخزين هذه الخطوط المصفاة في ملف جديد. بعد الانتهاء من هذا المتجر ، أحتاج إلى حذف كل ملفات السجل*.
لقد كتبت مثل هذا:
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
يحذف الرمز أدناه الملفات بعد قراءة الخطأ وتقسيمه ، لكن عندما أضع ملف tail -f $ ، فإنه يتوقف عن حذف الملفات التي أريد حذفها لملفات log-* بعد أن تصل إلى سطر الخطأ.
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-??
تجربة مع هذا. إذا كانت هذه الأوامر الثلاثة تفعل ما تتوقعه ، فيمكنك إضافة المزيد من الوظائف (على سبيل المثال باستخدام المسارات ، والتحقق من وجود error.log
) ، لكن لا تضيف رمزًا حتى يكون هذا الجزء يعمل.