2013-05-13 10 views
14

Pracuję nad aplikacją webservice opartą na Java SOAP, gdzie piszę stdout do pliku tekstowego jako log dla naszego odniesienia. Ten plik rośnie ogromnie, więc muszę sprawdzić rozmiar pliku ... Na przykład, jeśli rozmiar pliku przekracza 10 Mb, muszę utworzyć inny plik.Rolling log Pliki i usuwanie starych plików dziennika

W ten sposób muszę utworzyć 10 plików, obracając jeden po drugim, aż do dziesięciu plików. Po osiągnięciu 10 plików, muszę usunąć pliki startowe i rozpocząć tworzenie ponownie ...

Jak mogę usunąć pliki po nie. plików stanie się 10?

+3

spojrzenie na 'Log4j', to zrobi wszystko za Ciebie, po ustawieniu go„prawidłowo” – Bill

Odpowiedz

2

Większość szkieletów logowania zapewnia to, czego szukasz. W logback powinieneś być w stanie to osiągnąć poprzez odpowiednie skonfigurowanie RollingFileAppender:

RollingFileAppender rozciąga FileAppender z możliwością rolować plików dziennika. Na przykład RollingFileAppender może logować się do pliku o nazwie log.txt, a po spełnieniu określonego warunku zmień jego cel rejestrowania na inny.

i

RollingPolicy jest odpowiedzialny za procedurę dachowania, który obejmuje plik w ruchu i zmiany nazwy.

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

+0

mam usunąć plik po pliku dziennika nie z utworzonych biegu do 10 – user2377755

+0

i muszę napisać kod java dla tego ... jestem nowy dla webservices i java więc proszę pomóż mi – user2377755

16

używam logback to zrobić. Poniższy przykład dotyczy polityki toczącej się w czasie. W zależności od tego, ile danych zostanie wydrukowanych podczas twoich dzienników, może to działać tak jak jest.

Ponadto, jako plik bonusowy, mój plik konfiguracyjny przestawia dziennik na kod HTML, aby ułatwić przeglądanie dla typów zarządzania, którzy chcą przejrzeć plik dziennika.

odpowiedniej części pliku konfiguracyjnym:

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

odpowiednie zależnościami 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

Widzę wiele odpowiedzi informujący użyć Log4J, ale można użyć własnego rejestratora Javy to zrobić, po prostu tworząc FileHandler:

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

dziękuję wroga odpowiedź .... ale chcę usunąć starsze pliki .... po tym dochodząc do 10 plików ...... czy ten scenariusz może być zaaranżowany przez filehandler ..... proszę, odpowiedz mi ... wykonuję tę pracę od zeszłego tygodnia ... jeśli to możliwe, wyewoluuj z kodem – user2377755

+0

Nie próbowałem tego, ale moje zrozumienie dokumentacji FileHandler mówi, że "rotacyjny zbiór plików" oznacza, że ​​te same pliki są używane w kółko. Znaczenie: po osiągnięciu limitu rozmiaru MyService-9.log, program rejestrujący skraca i nadpisuje MyService-0.log (zakładając, że FileHandler został skonstruowany z liczbą 10). Pliki nie są usuwane jako takie, ale nigdy nie będzie więcej plików niż liczba określona w argumencie count. – VGR

+1

Tak, właśnie przetestowałem to, aby zobaczyć, że zastępuje starsze logi, dziękuję. – Anonsage

3

W log4j.xml można spróbować wykonać następujące czynności:

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

Wartość mówi log4j.xml, aby przechowywać tylko 10 obróconych plików dziennika.

Ewentualnie, jeśli używasz pliku właściwości (zamiast 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

Spakowałem MaxBackupIndex podczas pisania, ale otrzymałem "log4j: WARN Brak takiej właściwości [maxBackupIndex] w org.apache.log4j.rolling.RollingFileAppender." – Karussell

+0

ah, wygląda na to, że używam RollingFileAppender z dodatku log4j, który nie ma tego ... Zobacz http://stackoverflow.com/questions/23945373/log4j-extras-maxbackupindex-lub-sililar – Karussell

2

Jeśli używasz java.util.logging.Logger, można to zrobić z FileHandler.

Źródło: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

Czy możliwe jest zrobić to za pomocą pliku logging.properties? – Yogesh

Powiązane problemy