使用Protocol Buffers进行FileOutputStream的每日翻转?

时间:2014-09-26 12:29:26

标签: java log4j protocol-buffers fileoutputstream

我从服务器获取数据流(二进制格式)。此数据使用Google协议缓冲区序列化。我正在尝试进行每日翻转(即如果第二天发生写入包含新日期的新文件,其中包含压缩数据)。

我试图通过log4j执行此操作,但是,log4j不考虑二进制文件(据我所知,我只能通过它获取文本)。当log4j写入文件时,它不会以二进制形式写入,而是以文本(人类可读)格式写入。

我讨论了这个问题,在log4j How to Create Binary Log File in Java using Log4J

中创建了一个自定义二进制appender

但是,我几天前才开始使用log4j,我不太清楚如何做到这一点。

还有其他方法可以对二进制数据进行翻转吗?我甚至不确定log4j是否是最佳解决方案。我非常乐意尝试你能提出的任何解决方案!

我希望log4j以二进制而非文本形式写入数据。

有没有办法在java中对二进制文件进行每日翻转?

3 个答案:

答案 0 :(得分:2)

我认为这里不需要log4j。如果你只需要文件翻转,那么小流包装就足够了。

Jetty项目在它的util类RolloverFileRotator中实现了这样的FileOuputStream,我认为这完全符合这里。

答案 1 :(得分:1)

您可以扩展默认的log4j DailyRollingFileAppender并将其包含在类路径中

package test.com;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.spi.LoggingEvent;

public class BinaryRollingFileAppender extends DailyRollingFileAppender {

    FileOutputStream fout;

    public BinaryRollingFileAppender(){
    }

    @Override
    public void setFile(String file) {
        super.setFile(file);
        try {
            fout = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void append(LoggingEvent le) {
        try {
            fout.write((byte[])le.getMessage());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public boolean requiresLayout() {
        return false;
    }

    @Override
    public void close() {
        try {
            fout.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

然后通过log4j属性文件配置appender

log4j.appender.app=test.com.BinaryRollingFileAppender
log4j.appender.app.File=/tmp/binary.bin
log4j.appender.app.DatePattern='.'yyyy-MM-dd
log4j.logger.app.com=DEBUG, app

并测试它

package test.com;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.log4j.Logger;

public class TestBinary {

    private static final Logger LOGGER = Logger.getLogger(TestBinary.class);

    public static void main(String[] args) {
        Path path = Paths.get("c://tmp/binary-example-file.bin");
        try {
            LOGGER.debug(Files.readAllBytes(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我不知道这是否是你想要的,但这是一个很好的起点,希望这对你有帮助。

答案 2 :(得分:0)

您可以将RotatingFileOutputStreamrotating-fos Java库提供的DailyRotationPolicy一起使用。