web-dev-qa-db-fra.com

Déplacement des fichiers journaux et suppression des anciens fichiers journaux

Je travaille sur une Java SOAP application webservice basée sur laquelle j'écris stdout dans un fichier texte comme journal pour notre référence. Ce fichier se développe énormément, donc Je dois vérifier la taille du fichier ... Par exemple, si la taille du fichier dépasse 10 Mo, je dois créer un autre fichier.

Comme ça, je dois créer 10 fichiers, en les faisant tourner l'un après l'autre jusqu'à dix fichiers. Après avoir atteint dix fichiers, je dois supprimer les fichiers de départ et recommencer la création ...

Comment puis-je supprimer des fichiers après le no. de fichiers deviendra 10?

19
user2377755

J'utilise logback pour ce faire. L'exemple ci-dessous est une politique de roulement basée sur le temps. Selon la quantité de données que vous produisez pendant vos journaux, cela peut fonctionner pour vous tel quel.

De plus, en bonus, mon fichier de configuration lance le journal en HTML pour le rendre facile à visualiser pour les types de gestion qui souhaitent consulter le fichier journal.

Partie pertinente du fichier de configuration:

 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs\logFile.html</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -- >
        <fileNamePattern>logs\logFile.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 10MB -- >
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <!-- keep 10 days' worth of history -- >
        <maxHistory>10</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <charset>UTF-8</charset>
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
        </layout>           
    </encoder>
</appender> 

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

dépendances Maven pertinentes:

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.0.12</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.12</version>
    </dependency>
22
Robert H

Je vois beaucoup de réponses vous disant d'utiliser Log4J, mais vous pouvez utiliser le propre enregistreur de Java pour ce faire en créant simplement un FileHandler :

Handler handler =
    new FileHandler("%h/MyService-%g.log", 10 * 1024 * 1024, 10);
handler.setLevel(Level.ALL);
Logger.getLogger("").addHandler(handler);
11
VGR

Dans log4j.xml, vous pouvez essayer ce qui suit:

<appender name="fileappender" class="org.Apache.log4j.RollingFileAppender">
      <param name="file" value="applog.log"/>
      <param name="Append" value="true" />
      <param name="MaxBackupIndex" value="10"/>

      <layout class="org.Apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
      </layout>
   </appender>

La valeur indique à log4j.xml de ne conserver que 10 fichiers journaux pivotés.

Alternativement, si vous utilisez un fichier de propriétés (au lieu du xml)

log4j.appender.File=org.Apache.log4j.RollingFileAppender
log4j.appender.File.File=applog.log
log4j.appender.File.Append=true
log4j.appender.File.layout=org.Apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c] %m%n
log4j.appender.[appenderName].MaxBackupIndex = 10
4
RAS

Si tu utilises Java.util.logging.Logger, vous pouvez le faire avec FileHandler.

Source: kodejava

package org.kodejava.example.logging;

import Java.util.logging.Logger;
import Java.util.logging.FileHandler;
import Java.util.logging.SimpleFormatter;
import Java.io.IOException;

public class RollingLogFile {
    //
    // Set a small log file size to demonstrate the rolling log files.
    //
    public static final int FILE_SIZE = 1024;

    public static void main(String[] args) {
        Logger logger = Logger.getLogger(RollingLogFile.class.getName());

        try {
            //
            // Creating an instance of FileHandler with 5 logging files
            // sequences.
            //
            FileHandler handler = new FileHandler("myapp.log", FILE_SIZE, 5, true);
            handler.setFormatter(new SimpleFormatter());
            logger.addHandler(handler);
            logger.setUseParentHandlers(false);
        } catch (IOException e) {
            logger.warning("Failed to initialize logger handler.");
        }

        logger.info("Logging information message.");
        logger.warning("Logging warning message.");
    }
}
2
EFernandes

Log4j peut le faire. Plus précisément, la classe RollingFileAppender .

2
tbsalling

La plupart des cadres de journalisation fournissent ce que vous recherchez. Lors de la déconnexion, vous devriez pouvoir y parvenir en configurant correctement un RollingFileAppender:

RollingFileAppender étend FileAppender avec la possibilité de survoler les fichiers journaux. Par exemple, RollingFileAppender peut se connecter à un fichier nommé fichier log.txt et, une fois qu'une certaine condition est remplie, modifier sa cible de journalisation dans un autre fichier.

et

RollingPolicy est responsable de la procédure de roulement qui implique le déplacement et le changement de nom de fichier.

http://logback.qos.ch/manual/appenders.html

2