1
votes

plus 1 au nom du fichier

Ma tâche est la rotation du journal et je ne trouve aucune commande qui puisse trouver un numéro à partir du nom de fichier avec 1.

Par exemple, j'ai des fichiers avec le nom: wrapper.log.1 , wrapper.log.2 . Je dois renommer et déplacer ces fichiers vers un autre répertoire et obtenir wrapper_1.log , wrapper_2.log . Une fois le fichier déplacé, il doit être supprimé du répertoire d'origine.

Il est possible que dans un nouveau dossier, il y ait des fichiers avec le même nom. Donc, je devrais obtenir le dernier fichier et plus 1 à son nom de fichier comme wrapper_(2+1).log.

Pour toute ma tâche, j'ai trouvé quelque chose comme

XXX

Mais, bien sûr, cela ne fonctionne pas après la deuxième ligne.

Et, à l'avenir, il doit être en bash.

PS: Aussi, je pense, il est possible de créer simplement un nouveau fichier dans un nouveau dossier avec horodatage ou smth comme ça comme suffixe. Par exemple:

folder        file
01.01.19    wrapper_00_00_01
            wrapper_00_01_07
            wrapper_01_10_53
            wrapper_13_07_11

02.01.19
            wrapper_01_00_01
            wrapper_03_01_07
            wrapper_05_10_53
            wrapper_13_07_11


6 commentaires

Si vous créez un nouveau répertoire avec l'intention d'y placer les fichiers journaux, pourquoi craindre que le nom ne soit en conflit avec les fichiers existants?


Parce qu'il est possible que ce dossier puisse contenir des fichiers avec le nom exact que je devrais copier. Je veux dire, que les nouveaux dossiers créent une fois par jour, mais les fichiers journaux tournent du dossier d'origine dans la plage .... log.1 à .... log.10. Donc, si je vais simplement copier des fichiers dans un nouveau dossier, après un certain temps, cela efface le fichier wrapper.log.1 dans un nouveau dossier avec le nom wrapper_1.log, mais il devrait être wrapper_11.log


soit vous créez un NOUVEAU répertoire - mkdir $ (date '+% d.% m.% y') soit vous copiez des fichiers dans un répertoire déjà existant. Lequel est-ce?


Je dois créer un nouveau dossier tous les jours à 00h00, environ


juste par curiosité: pourquoi réinventer la roue et écrire votre propre rotation de journal au lieu d'utiliser logrotate ( github.com/logrotate/ logrotate ) qui devrait exister sur la plupart des systèmes Linux?


car il ne peut pas renommer mon nom de fichier à partir du dossier d'origine dépend du nom de fichier dans le nouveau dossier. Il suffit de supprimer / copier / déplacer le fichier d'un dossier à un autre


3 Réponses :


0
votes

Je ne comprends pas entièrement votre question mais je sais qu'en utilisant un signe dollar et des doubles crochets, vous pouvez exécuter un calcul:

Prompt>echo $((1+1))
2


1 commentaires

Mais je ne peux pas obtenir le premier chiffre à plus 1, pour obtenir un nouveau numéro pour mon nouveau nom de fichier.



2
votes

Pour trouver le plus grand nombre de fichiers journaux wrapper_:

trouver. -type f -name "* .log" -exec basename {} \; | ggrep -Po '(? <= wrapper _) [0-9]' | sort -rn | head -n 1

J'utilise le commutateur Pearl de grep pour faire un look-behind pour "wrapper_", puis j'inverse le tri des nombres trouvés et prend le premier. Si vous souhaitez générer un nouveau nom de fichier, j'utiliserais awk , par exemple:

trouver. -type f -name "* .log" -exec basename {} \; | ggrep -Po '(? <= wrapper _) [0-9]' | sort -rn | tête -n 1 | awk '{print "wrapper _" $ 1 + 1 ".log"}'

Cela produira un nom de fichier avec le numéro suivant dans la séquence.


4 commentaires

Merci. C'est presque la vérité. Mais j'ai changé un peu votre ligne pour ---- trouver. -type f -name "wrapper *" | grep -Po '[0-9] {1,3}' | sort -rn | head -n1 | awk '{print "servicemix _" $ 1 + 1 ".log"}' ---


Je ne comprends pas ce que signifie "(? <= Wrapper_)" dans votre codeline


@Dred c'est une regex lookahead


(?! pattern) ==> Une assertion d'anticipation négative de largeur nulle. (? <= pattern) ==> Une assertion de regard en arrière positive de largeur nulle.



0
votes

Enfin, j'ai trouvé deux solutions. Tout d'abord, c'est bash, comme ceci

log4j.logger.wrapper.log=DEBUG, wrapper
log4j.additivity.logger.wrapper.log=false
log4j.appender.wrapper=org.apache.log4j.rolling.RollingFileAppender  
log4j.appender.wrapper.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy  
#This setting should be used with commented line log4j.appender.wrapper.File=... if it needs to zip to target directory immediately
#log4j.appender.wrapper.rollingPolicy.FileNamePattern=/mnt/smxlog/${env:HOSTNAME}/wrapper.%d{HH:mm:ss}.log.gz
#Or it is possible to log and zip in the same folder, and after that with cron replace zipped files to required folder 
log4j.appender.wrapper.rollingPolicy.FileNamePattern=${karaf.data}/log/wrapper.%d{HH:mm:ss}.log.gz
log4j.appender.wrapper.File=${karaf.data}/log/wrapper.log
log4j.appender.wrapper.triggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy  
#Size in bytes
log4j.appender.wrapper.triggeringPolicy.MaxFileSize=1000000
log4j.appender.wrapper.layout=org.apache.log4j.PatternLayout  
log4j.appender.wrapper.layout.ConversionPattern=%d{dd-MM-yyyy_HH:mm:ss} %-5p [%t] - %m%n
log4j.appender.wrapper.Threshold=DEBUG
log4j.appender.wrapper.append=true

Et la deuxième variante utilise les propriétés de journalisation log4j, mais elle devrait être téléchargée dans le dossier système servicemix log4j-1.2.17_fragment.jar et apache- log4j-extras-1.2.17_fragment. Il est peut-être possible de les télécharger en tant que bundle, je n'ai pas essayé. Les deux jar utilisent une API différente. Il y a https://logging.apache.org/log4j/ 1.2 / apidocs / index.html? Overview-summary.html et http://logging.apache.org/log4j/ compagnons / apidocs / index.html? overview-summary.html Et les propriétés seront

#!/bin/bash

#DECLARE

FILENAME=$1
DATE=$(date '+%d.%m.%y')
SRC_DIR="/usr/local/apache-servicemix-6.1.0/data/log"
DEST_DIR="/mnt/smxlog/$HOSTNAME"

#START

mkdir -m 777 "$DEST_DIR/$DATE"

if [ -d "$DEST_DIR/$DATE" ]
then

for f in $(find "$SRC_DIR/" -name "$FILENAME.log.*") 

do

TIME=$(date '+%H_%M_%S.%3N')
NEW_FILENAME="$FILENAME-$TIME.log"
NEW_DEST_WITH_FILE="$DEST_DIR/$DATE/$NEW_FILENAME"

mv $f $NEW_DEST_WITH_FILE
gzip "$NEW_DEST_WITH_FILE"

done

else 
exit 1
fi

#END


0 commentaires