comment diviser des fichiers à partir du fichier error.log de serveur apache en lisant la ligne de fichiers en ligne continue?
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
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.