2013-05-13 295 views
14

我正在研究一個基於Java SOAP的web服務應用程序,我將stdout寫入文本文件作爲日誌供我們參考。該文件正在大幅增長,所以我需要檢查文件的大小......例如,如果文件大小超過10 Mb,我必須創建另一個文件。滾動日誌文件和刪除舊的日誌文件

像這樣,我必須創建10個文件,一個接一個地旋轉,直到10個文件。達到10個文件後,我必須刪除開始文件並重新開始創建...

如何刪除文件後的否。的文件將成爲10?

+3

看看'Log4j',它會爲你做的一切,一旦你設置它「正確」 – Bill 2013-05-13 12:44:08

回答

2

大多數日誌記錄框架都提供了您要查找的內容。 在的logback你應該能夠通過適當配置RollingFileAppender進行實現它:

RollingFileAppender進行擴展FileAppender有能力側翻日誌文件。例如,RollingFileAppender可以登錄到名爲log.txt文件的文件,並且一旦滿足某個條件,就將其日誌目標更改爲另一個文件。

RollingPolicy負責涉及文件移動和重命名的翻車過程。

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

+0

我有沒有日誌文件中創建河段後刪除文件到10 – user2377755 2013-05-13 13:14:45

+0

,我必須爲此編寫java代碼...我是新的webservices和java所以請幫助我 – user2377755 2013-05-13 13:15:25

16

我用logback做到這一點。以下示例是基於時間的滾動策略。根據您在日誌中輸出的數據量多少,這可能適用於您。

另外,作爲獎勵,我的配置文件將日誌轉換爲HTML,以便查看想要查看日誌文件的管理類型。配置文件的

相關部分:

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

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

我看到了很多的答案告訴你使用Log4J的,但你可以通過簡單地創建使用Java自身的記錄器做這FileHandler

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

感謝敵人的答案....但我想刪除舊的文件....後達到10個文件......這種情況可以由文件處理程序處理.....請回復我....我從過去一週做這項工作...如果可能expalin與代碼 – user2377755 2013-05-15 09:35:46

+0

我還沒有嘗試過,但是我對FileHandler文檔的理解是「旋轉文件集」意味着一遍又一遍地使用相同的文件。意思是,一旦MyService-9.log達到其大小限制,記錄器會截斷並覆蓋MyService-0.log(假設FileHandler的構造計數爲10)。因此,文件本身並不會被刪除,但永遠不會有比count參數中指定的數量更多的文件。 – VGR 2013-05-15 10:58:10

+1

是的,我只是測試了一下,看看它確實取代了舊的日誌,謝謝。 – Anonsage 2016-07-03 02:20:16

3

在的log4j.xml你可以嘗試以下方法:

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

該值告訴log4j.xml只保留10個循環的日誌文件。

或者,如果你正在使用(而不是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

我按照你寫的那樣加上了MaxBackupIndex,但在org.apache.log4j.rolling.RollingFileAppender中得到了「log4j:WARN沒有這樣的屬性[maxBackupIndex]」。 – Karussell 2015-09-11 18:54:09

+0

啊,它看起來像我使用RollingFileAppender從log4j演員中沒有這...看到http://stackoverflow.com/questions/23945373/log4j-extras-maxbackupindex-or-similar – Karussell 2015-09-11 19:07:59

2

的屬性文件,如果使用java.util.logging.Logger,你可以用FileHandler做到這一點。

來源: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

是否有可能使用logging.properties文件做到這一點? – Yogesh 2018-02-22 05:02:46