كيفية تقسيم الملفات من ملف error.log لخادم Apache أثناء قراءة سطر الملف على السطر بشكل مستمر؟

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

سؤال

لقد فعلت مثل هذا ولكني أواجه مشكلة مع 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) ، لكن لا تضيف رمزًا حتى يكون هذا الجزء يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top