2013-05-13 185 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