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
3 Réponses :
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
Mais je ne peux pas obtenir le premier chiffre à plus 1, pour obtenir un nouveau numéro pour mon nouveau nom de fichier.
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.
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.
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
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