2013-05-13 9 views
14

Sto lavorando a un'applicazione di servizi web basata su SOAP Java dove sto scrivendo stdout in un file di testo come registro per il nostro riferimento. Quel file sta crescendo enormemente, quindi ho bisogno di controllare la dimensione del file ... Ad esempio se le dimensioni del file superano 10 Mb, devo creare un altro file.Registro di registro File e rimozione di vecchi file di registro

In questo modo, devo creare 10 file, ruotando uno dopo l'altro fino a dieci file. Dopo aver raggiunto dieci file, devo cancellare i file di avvio e ricominciare a creare ...

Come posso cancellare i file dopo il n. dei file diventerà 10?

+3

un'occhiata a 'Log4j', che farà di tutto per voi, una volta che lo si imposta "correttamente" – Bill

risposta

2

La maggior parte dei framework di registrazione fornisce quello che stai cercando. In logback si dovrebbe essere in grado di realizzarlo configurando correttamente un RollingFileAppender:

RollingFileAppender estende FileAppender con la capacità di rollover file di log. Ad esempio, RollingFileAppender può accedere a un file denominato log.txt e, una volta soddisfatta una determinata condizione, modificare la destinazione di registrazione in un altro file.

e

RollingPolicy è responsabile della procedura di rollover che coinvolge il file in movimento e la ridenominazione.

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

+0

devo eliminare file dopo il no di raggiunge file di log creati a 10 – user2377755

+0

e devo scrivere codice java per questo ... sono nuovo a webservices e java quindi per favore aiutatemi – user2377755

16

Io uso logback per fare questo. L'esempio seguente è una politica di rotazione basata sul tempo. A seconda di quanti dati vengono emessi durante i log, questo potrebbe funzionare per te così com'è.

Inoltre, come bonus, il mio file di configurazione lancia il log in HTML per rendere più semplice la visualizzazione per i tipi di gestione che vogliono guardare attraverso il file di registro.

parte rilevante del file di configurazione:

<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> 

rilevanti dipendenze Maven:

<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> 
9

Vedo un sacco di risposte che ti dice di usare Log4J, ma è possibile utilizzare il proprio registratore di Java per fare questo semplicemente creando un FileHandler:

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

grazie per la risposta .... ma voglio cancellare i vecchi file .... dopo di esso raggiungendo 10 file ...... questo scenario può essere gestito da un gestore di file ..... per favore rispondimi indietro ... sto facendo questo lavoro da una settimana scorsa ... se possibile expalin con il codice – user2377755

+0

Non l'ho ancora provato, ma la mia conoscenza della documentazione di FileHandler è che "set di file rotanti" significa che gli stessi file vengono usati più e più volte. Significato, una volta che MyService-9.log ha raggiunto il limite di dimensioni, il logger tronca e sovrascrive MyService-0.log (assumendo che FileHandler sia stato costruito con un conteggio di 10). Quindi i file non vengono cancellati di per sé, ma non ci saranno mai più file del numero specificato nell'argomento count. – VGR

+1

Sì, ho appena provato questo per vedere che sostituisce i vecchi registri, grazie. – Anonsage

3

In log4j.xml si può provare il seguente:

<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> 

Il valore indica a log4j.xml di conservare solo 10 file di registro ruotati.

In alternativa, se si utilizza un file delle proprietà (al posto del 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 
+0

Ho speficato MaxBackupIndex come hai scritto, ma ho ottenuto "log4j: WARN Nessuna proprietà [maxBackupIndex] in org.apache.log4j.rolling.RollingFileAppender." – Karussell

+0

ah, sembra che sto usando il RollingFileAppender da log4j extra che non hanno questo ... Vedi http://stackoverflow.com/questions/23945373/log4j-extras-maxbackupindex-or-similar – Karussell

2

Se si utilizza java.util.logging.Logger, è possibile farlo con FileHandler.

Fonte: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."); 
    } 
} 
+0

E 'possibile lo fai usando il file logging.properties? – Yogesh