web-dev-qa-db-ja.com

ログファイルのローリングと古いログファイルの削除

Java SOAPベースのWebサービスアプリケーションに取り組んでいます。ここでは、参照用にログとしてstdoutをテキストファイルに書き込んでいます。そのファイルは非常に大きくなっているので、ファイルのサイズを確認する必要があります...たとえば、ファイルサイズが10 MBを超える場合は、別のファイルを作成する必要があります。

このように、10個のファイルを作成し、10個のファイルになるまで順番にローテーションします。 10個のファイルに達したら、開始ファイルを削除して、もう一度作成を開始する必要があります...

いいえ後にファイルを削除するにはどうすればよいですか?のファイルは10になりますか?

19
user2377755

これを行うには 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>
22
Robert H

Log4Jを使用するように指示する多くの回答が表示されますが、 FileHandler を作成するだけで、Java独自のロガーを使用してこれを実行できます。

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

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

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.");
    }
}
2
EFernandes

Log4j はこれを行うことができます。具体的には RollingFileAppender クラスです。

2
tbsalling

ほとんどのロギングフレームワークは、探しているものを提供します。ログバックでは、RollingFileAppenderを適切に構成することでそれを実現できるはずです。

RollingFileAppenderはFileAppenderを拡張して、ログファイルをロールオーバーする機能を備えています。たとえば、RollingFileAppenderは、log.txtファイルという名前のファイルにログを記録し、特定の条件が満たされると、そのロギングターゲットを別のファイルに変更できます。

そして

RollingPolicyは、ファイルの移動と名前の変更を伴うロールオーバー手順を担当します。

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