wie Sie Dateien von error.log-Datei von Apache-Server zu verteilen, während kontinuierlich Datei Zeile für Zeile zu lesen?

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

Frage

Ich habe so gemacht, aber Ich habe Probleme mit Shell habe ich geschrieben. Ich bin mit Schwanz Befehl Funktionalität verwirrt und auch wenn ich Ausgang von error.log auf Terminal sehen, es zeigt Linien mit ‚e‘ aus Wörter gestrichen.

Ich habe so geschrieben mir bitte leite wie kann ich mein Problem gelöst bekommen. Ich möchte diese error.log Datei Zeile für Zeile lesen und während des Lesens Linien I festgelegte Anzahl von Zeilen auf kleine Dateien mit der Endung d.h log-aa, log-ab, teilen wollen ... Ich tat dies mit Split-Befehl. Nach dem Spalten möchte ich Filterlinien mit GET oder POST-Wort in ihnen regex und speichere diese gefilterten Zeilen in neue Datei. Nach diesem Speicher wird abgeschlossen Ich brauche alle diese Log- * Dateien zu löschen.

Ich habe wie folgt geschrieben:

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

Der Code unten löscht Dateien nach dem Lesen und Spalten error.log aber wenn ich Schwanz setzen -f $ FILE stoppt er das Löschen von Dateien I Log- * Dateien löschen möchten, nachdem es letzte Zeile der Datei error.log erreicht:     Code eingeben hier

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
War es hilfreich?

Lösung

scheint Ihr Code unnötig lang und komplex, und die Logik ist unklar. Es soll diese groß zu wachsen, ohne arbeiten richtig nicht erlaubt worden war.

Bedenken Sie:

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

Experiment mit diesem. Wenn diese drei Befehle zu tun, was Sie erwarten, können Sie weitere Funktionen hinzufügen (zum Beispiel Pfade benutzen, für die Existenz von error.log Überprüfung), aber nicht hinzufügen Code, bis Sie diesen Teil Arbeits haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top