comment diviser des fichiers à partir du fichier error.log de serveur apache en lisant la ligne de fichiers en ligne continue?

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

Question

je l'ai fait comme ça, mais j'avoir des ennuis avec shellscript je l'ai écrit. Je suis confus avec la fonctionnalité de commande arrière et aussi quand je vois sortie de error.log sur la borne, il montre les lignes avec « e » supprimé des mots.

J'ai écrit comme ça s'il vous plaît me guider comment puis-je mon problème résolu. Je veux lire cette ligne de fichier error.log par ligne et pendant la lecture des lignes que je veux diviser fixe nombre de lignes à petits fichiers avec le suffixe i.e. log-aa, ab-log, ... Je l'ai fait en utilisant la commande split. Après séparation, je veux des lignes de filtre avec GET ou POST mot à les utiliser regex et stocker ces lignes filtrées dans un nouveau fichier. Après ce magasin se rempli que je dois supprimer tous ces fichiers de log *.

Je l'ai écrit comme ceci:

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

Le ci-dessous le code supprime les fichiers après avoir lu et error.log de séparation, mais quand je mets la queue -f $ fichier, il arrête de supprimer des fichiers que je veux supprimer les fichiers logarithmiques de * après avoir atteint la dernière ligne de fichier error.log:     Entrez le code ici

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
Était-ce utile?

La solution

Votre code semble inutilement long et complexe, et la logique ne sait pas. Il ne devrait pas avoir été autorisé à se développer sans cette grande fonctionner correctement.

Considérez ceci:

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

Expérience avec cela. Si ces trois commandes font ce que vous attendez, vous pouvez ajouter plus de fonctionnalités (par exemple en utilisant des chemins, la vérification de l'existence de error.log), mais ne pas ajouter le code jusqu'à ce que vous avez ce travail partiel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top