cómo dividir los archivos de archivo error.log del servidor Apache al leer archivo línea por línea continua?

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

Pregunta

he hecho como este, pero estoy teniendo problemas con shellscript que he escrito. Estoy confundido con la funcionalidad del comando de la cola y también cuando veo salida del error.log en el terminal se nota líneas con 'e' borrado de palabras.

He escrito como este por favor me guía cómo puedo hacer que mi problema resuelto. Quiero leer este archivo línea por línea y error.log durante la lectura de las líneas quiero dividir número fijo de líneas a un pequeño archivo con el sufijo es decir log-aa, ab-registro, ... Hice esto con el comando de división. Después de separarse Quiero líneas de filtro con GET o POST en la palabra usando expresiones regulares y almacenar estas líneas filtrado en nuevo archivo. Después de esta tienda se completó tengo que borrar todos los archivos de log estas *.

He escrito así:

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

El código de abajo elimina los archivos después de leer y error.log división, pero cuando pongo tail-f $ ARCHIVO deja de borrar los archivos que desea eliminar los archivos log-* después de que llegue última línea del archivo error.log:     introduzca el código aquí

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
¿Fue útil?

Solución

Su código parece innecesariamente largo y complejo, y la lógica no está claro. No debería haber permitido que crezca tan grande sin trabajar correctamente.

Considere esto:

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

Experimento con esto. Si estos tres comandos hacen lo que se espera, se puede añadir más funcionalidad (por ejemplo, el uso de rutas, la comprobación de la existencia de error.log), pero no agregar código hasta que tenga esta parte de trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top