Come dividere i file da file error.log di apache server durante la lettura di file riga per riga in continuazione?

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

Domanda

Ho fatto come questo, ma sto avendo difficoltà con shellscript ho scritto. Sono confuso con funzionalità di comando coda e anche quando vedo uscita error.log sul morsetto si vede linee con 'e' eliminato dalle parole.

ho scritto come questo per favore mi guida come posso il mio problema risolto. Voglio leggere questo file riga per riga error.log e durante le linee di lettura che voglio dividere numero fisso di righe da piccoli file con suffisso cioè di log-aa, log-ab, ... ho fatto questo comando utilizzando scissione. Dopo la scissione Voglio linee di filtro con GET o POST parola in loro utilizzando espressioni regolari e memorizzare queste righe filtrati nel nuovo file. Dopo questo negozio si completa ho bisogno di cancellare tutti i file giornale di bordo *.

ho scritto in questo modo:

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

Il codice di seguito elimina i file dopo la lettura e la divisione error.log ma quando ho messo tail-f $ FILE smette di cancellazione di file che voglio eliminare i file log- * dopo aver raggiunto l'ultima riga del file error.log:     inserire il codice qui

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
È stato utile?

Soluzione

Il tuo codice sembra inutilmente lungo e complesso, e la logica non è chiaro. Non avrebbe dovuto essere permesso di crescere così grande senza lavorare correttamente.

Considerate questo:

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

Esperimento con questo. Se queste tre comandi fanno quello che ci si aspetta, è possibile aggiungere ulteriori funzionalità (ad esempio utilizzando percorsi, verificare l'esistenza di error.log), ma non aggiungere il codice fino a quando si dispone di questo lavoro parte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top