52 votes

Comment faire pour rouler le fichier journal au démarrage dans la journalisation

Je voudrais configurer la consignation pour faire ce qui suit.

  • Se connecter à un fichier
  • Faites rouler le fichier quand il atteint 50 Mo
  • Ne gardez que 7 jours de bûches
  • Au démarrage, générez toujours un nouveau fichier (faites un rouleau)

Tout fonctionne sauf le dernier élément, le rouleau de démarrage. Est-ce que quelqu'un sait comment y parvenir? Voici la config ...

   <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg \(%file:%line\)%n</Pattern>
    </layout>

    <File>server.log</File>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>server.%d{yyyy-MM-dd}.log</FileNamePattern>
      <!-- keep 7 days' worth of history -->
      <MaxHistory>7</MaxHistory>

      <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>50MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>

    </rollingPolicy>
  </appender>
 

30voto

Dave Points 91

Aucun des autres suggestions qui était approprié pour ma situation. Je ne voulais pas utiliser un taille-et de temps-en fonction de la solution, car il nécessite la configuration d'un MaxFileSize, et nous sommes à l'aide d'un strictement basées sur le temps politique. Voici comment j'ai fait rouler le fichier au démarrage avec un TimeBasedRollingPolicy:

@NoAutoStart
public class StartupTimeBasedTriggeringPolicy<E> 
        extends DefaultTimeBasedFileNamingAndTriggeringPolicy<E> {

    @Override
    public void start() {
        super.start();
        nextCheck = 0L;
        isTriggeringEvent(null, null);
        try {
            tbrp.rollover();
        } catch (RolloverFailure e) {
            //Do nothing
        }
    }

}

Le truc est de mettre la nextCheck temps de 0L, de sorte que isTriggeringEvent() vous pensez qu'il est temps pour restaurer le fichier journal sur. Il va donc exécuter le code nécessaire pour calculer le nom de fichier, ainsi qu'idéalement la réinitialisation de la nextCheck de la valeur temps. L'appel suivant à annuler() provoque le fichier journal roulé. Puisque cela n'arrive qu'au démarrage, c'est une solution optimale que ceux qui effectuent une comparaison à l'intérieur de isTriggerEvent(). Cependant petit à cette comparaison, il encore se dégrade légèrement les performances lorsqu'il est exécuté sur chaque message de journal. Cette force également le survol de se produire immédiatement au démarrage, au lieu d'attendre pour le premier événement de journal.

Le @NoAutoStart annotation est important de prévenir Joran de l'exécution de la méthode start() avant tous les autres, l'initialisation est terminée. Sinon, vous obtenez une NullPointerException.

Voici la config:

  <!-- Daily rollover appender that also appends timestamp and rolls over on startup -->
  <appender name="startupDailyRolloverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_FILE}</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${LOG_FILE}.%d{yyyyMMdd}_%d{HHmmss,aux}</fileNamePattern>
      <TimeBasedFileNamingAndTriggeringPolicy class="my.package.StartupTimeBasedTriggeringPolicy" />
    </rollingPolicy>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender> 

Espérons que cette aide!

7voto

proactif Points 1796

Cela fonctionne pour moi, en utilisant la classe suivante comme timeBasedFileNamingAndTriggeringPolicy:

 import java.io.File;
import java.util.concurrent.atomic.AtomicBoolean;

import ch.qos.logback.core.joran.spi.NoAutoStart;
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;

@NoAutoStart
public class Trigger<E> extends SizeAndTimeBasedFNATP<E>
{
    private final AtomicBoolean trigger = new AtomicBoolean();

    public boolean isTriggeringEvent(final File activeFile, final E event) {
        if (trigger.compareAndSet(false, true) && activeFile.length() > 0) {
            String maxFileSize = getMaxFileSize();
            setMaxFileSize("1");
            super.isTriggeringEvent(activeFile, event);
            setMaxFileSize(maxFileSize);
            return true;
        }
        return super.isTriggeringEvent(activeFile, event);
    }
}
 

3voto

Ceki Points 8781

Remplacer la méthode isTriggeringEvent () dans ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP devrait fonctionner correctement. Il suffit de renvoyer 'true' la première fois que la méthode isTriggeringEvent () est appelée.

2voto

Joe Kearney Points 1723

Ceki la solution ne fonctionne pas pour moi, mais semble être à mi-chemin là au moins.

Il explose car il ne peut pas voir les rolling politique lors du démarrage de l' TimeBasedFileNamingAndTriggeringPolicyBase. Avec quelques hackery je l'ai eu à faire des coupes, et avec un peu plus je l'ai eu à observer le déclenchement, mais ensuite il s'est à nouveau parce qu'il ne pouvait pas résoudre un nom de fichier de propriétés... Le paquet est un logback alors j'ai pu obtenir quelques-uns des éléments internes, à reproduire la logique en SizeAndTimeBasedFNATP#isTriggeringEvent et appelez - computeCurrentPeriodsHighestCounterValue. Je pense que quelque chose le long de ces lignes pourrait fonctionner, juste pas trouvé la combinaison magique encore. J'espère vraiment que je suis en train de faire quelque chose de stupide, parce que sinon, je pense que ça va signifier l'ouverture de certains détails pour sous-classer, de les mettre directement dans logback comme une autre de roulement/déclenchement de la politique.

logback.xml: essayé différents ordres d' triggeringPolicy, TimeBasedFileNamingAndTriggeringPolicy à l'intérieur et à l'extérieur de l' rollingPolicy.

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_DIR}/${LOG_FILE_BASE}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_DIR}/${LOG_FILE_BASE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <MaxHistory>7</MaxHistory>

        <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.RollOnStartupPolicy" />
    </rollingPolicy>

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>

    <encoder>
        <pattern>%msg%n</pattern>
    </encoder>
</appender>

Le déclencheur de la politique:

package ch.qos.logback.core.rolling;
public class RollOnStartupPolicy<E> extends SizeAndTimeBasedFNATP<E> {
private final AtomicBoolean firstTime = new AtomicBoolean(true);

    @Override
    public boolean isTriggeringEvent(File activeFile, E event) {
        if (!firstTime.get()) { // fast path
            return false;
        }

        if (firstTime.getAndSet(false)) {
            return true;
        }
        return false;
    }
}

L'exception:

java.lang.NullPointerException
at  at ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicyBase.start(TimeBasedFileNamingAndTriggeringPolicyBase.java:46)
at  at ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP.start(SizeAndTimeBasedFNATP.java:36)
at  at ch.qos.logback.core.joran... [snip joran config]

1voto

Alexander Pogrebnyak Points 24964

Créez votre propre sous-classe de ch.qos.logback.core.rolling.TimeBasedRollingPolicy et remplacez ses start

 public class MyPolicy
    extends ch.qos.logback.core.rolling.TimeBasedRollingPolicy
{

    public void start ( )
    {
        super.start( );
        rollover( );
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X