2013-05-13 10 views
14

Ich arbeite an einer Java SOAP-basierten Webservice-Anwendung, in der ich stdout in eine Textdatei schreibe, als Protokoll für unsere Referenz. Diese Datei wächst enorm, also muss ich nach der Größe der Datei suchen ... Zum Beispiel, wenn die Dateigröße 10 MB überschreitet, muss ich eine andere Datei erstellen.Rollen von Protokolldateien und Entfernen von alten Protokolldateien

Dazu muss ich 10 Dateien erstellen, die nacheinander bis zehn Dateien rotieren. Nach dem Erreichen von zehn Dateien muss ich die Startdateien löschen und neu erstellen ...

Wie kann ich Dateien nach der Nr. Löschen. von Dateien wird 10?

+3

Blick auf 'Log4j', wird es alles für Sie tun, wenn Sie es einrichten„richtig“ – Bill

Antwort

2

Die meisten Logging-Frameworks bieten, was Sie suchen. In logback sollten Sie in der Lage sein, es zu erreichen, indem sie richtig ein RollingFileAppender konfigurieren:

RollingFileAppender erweitert FileAppender mit der Fähigkeit, Protokolldateien Rollover. Beispielsweise kann sich RollingFileAppender an einer Datei mit dem Namen log.txt-Datei anmelden. Wenn eine bestimmte Bedingung erfüllt ist, ändern Sie das Protokollierungsziel in eine andere Datei.

und

RollingPolicy ist für den Überrollvorgang verantwortlich, die Datei verschieben und umbenennen beinhaltet.

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

+0

i-Datei nach der Anzahl der Protokolldatei erstellt Lauf zu löschen, zu 10 – user2377755

+0

und ich muss Java-Code für diese schreiben ... ich bin neu zu Webservices und Java, also bitte helfen Sie mir – user2377755

16

Ich benutze logback dies zu tun. Das folgende Beispiel ist eine zeitbasierte Rolling-Richtlinie. Abhängig davon, wie viele Daten Sie während Ihrer Protokolle ausgeben, kann dies für Sie wie es ist funktionieren.

Auch, als Bonus, meine Config-Datei wirft das Protokoll in HTML, um es für Management-Typen, die durch die Protokolldatei schauen möchten, einfach zu sehen.

Relevante Teil der Konfigurationsdatei:

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

relevant Maven Abhängigkeiten:

<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

Ich sehe eine Menge Antworten, die Sie sagen, Log4J zu verwenden, aber Sie können eigene Logger verwenden Java, dies zu tun, indem Sie einfach die Schaffung eines FileHandler:

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

danke Feind die Antwort .... aber ich möchte die älteren Dateien löschen .... danach 10 Dateien erreichen ...... ist dieses Szenario kann von Filehandler behandelt werden ..... bitte antworte mir zurück .... Ich mache diese Arbeit von der vergangenen Woche ... wenn möglich Expalin mit Code – user2377755

+0

Ich habe es nicht ausprobiert, aber nach meinem Verständnis der Dokumentation von FileHandler bedeutet "rotierender Satz von Dateien", dass dieselben Dateien immer wieder verwendet werden. Das heißt, sobald MyService-9.log seine maximale Größe erreicht hat, schneidet der Logger MyService-0.log ab und überschreibt MyService-0.log (vorausgesetzt, der FileHandler wurde mit einer Zählung von 10 erstellt). Daher werden Dateien nicht per se gelöscht, aber es werden niemals mehr Dateien als die Zahl sein, die Sie im Argument count angegeben haben. – VGR

+1

Ja, ich habe das gerade getestet, um zu sehen, dass es die älteren Protokolle ersetzt, danke. – Anonsage

3

In log4j.xml Sie folgende versuchen:

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

Der Wert teilt log4j.xml mit, nur 10 rotierte Protokolldateien zu speichern.

Alternativ, wenn Sie eine Eigenschaftsdatei (anstelle des xml) verwenden

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

Ich habe MaxBackupIndex so geschrieben, wie Sie geschrieben haben, aber "log4j: WARN Keine solche Eigenschaft [maxBackupIndex] in org.apache.log4j.rolling.RollingFileAppender." – Karussell

+0

ah, es sieht so aus, als ob ich den RollingFileAppender von log4j-Extras verwende, der das nicht hat ... Siehe http://stackoverflow.com/questions/23945373/log4j-extras-maxbackupindex-or-similar – Karussell

2

Wenn Sie java.util.logging.Logger verwenden, können Sie es mit FileHandler tun.

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

Ist es möglich? tun Sie es mit der Datei logging.properties? – Yogesh

Verwandte Themen