Java 使用协议缓冲区的FileOutputStream的每日滚动?

Java 使用协议缓冲区的FileOutputStream的每日滚动?,java,log4j,protocol-buffers,fileoutputstream,Java,Log4j,Protocol Buffers,Fileoutputstream,我正在从服务器获取数据流(二进制格式)。此数据使用Google协议缓冲区序列化。我正在尝试进行每日滚动(即,如果第二天发生,则写入包含新日期的新文件,其中包含压缩数据) 我试图通过log4j来实现这一点,然而,log4j并没有考虑二进制(据我所知,我只能通过它来获取文本)。当log4j写入文件时,它不会以二进制格式写入,而是以文本(人类可读)格式写入 我讨论了这个问题,在log4j中创建了一个定制的二进制追加器 然而,我几天前才开始使用log4j,我不太确定如何开始这样做 有没有其他方法可以实现

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

我试图通过log4j来实现这一点,然而,log4j并没有考虑二进制(据我所知,我只能通过它来获取文本)。当log4j写入文件时,它不会以二进制格式写入,而是以文本(人类可读)格式写入

我讨论了这个问题,在log4j中创建了一个定制的二进制追加器

然而,我几天前才开始使用log4j,我不太确定如何开始这样做

有没有其他方法可以实现二进制数据的滚动?我甚至不确定log4j是否是最好的解决方案。我非常乐意尝试你能想出的任何解决方案

我希望log4j以二进制而不是文本的形式写入数据


有没有办法在java中对二进制文件进行每日滚动更新?

我认为这里不需要log4j。如果您只需要文件滚动,小型流包装器就足够了


Jetty项目在其util类中实现了这样的FileOutStream,我认为这非常适合这里。

我认为这里不需要log4j。如果您只需要文件滚动,小型流包装器就足够了


Jetty项目在其util类中实现了这样的FileOutStream,我认为这非常适合这里。

我认为这里不需要log4j。如果您只需要文件滚动,小型流包装器就足够了


Jetty项目在其util类中实现了这样的FileOutStream,我认为这非常适合这里。

我认为这里不需要log4j。如果您只需要文件滚动,小型流包装器就足够了


Jetty项目在其util类中实现了这样的FileOutStream,我认为这非常适合这里。

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

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();
        }
    }
}

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

您可以扩展默认的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();
        }
    }
}

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

您可以扩展默认的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();
        }
    }
}

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

您可以扩展默认的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();
        }
    }
}


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

您可以使用Java库提供的
DailRotationPolicy
来使用
RotatingFileOutputStream

您可以使用
RotatingFileOutputStream
和Java库提供的
DailRotationPolicy
来使用
RotatingFileOutputStream
dailrotationpolicy
由Java library提供。

您可以将
旋转文件输出流
与Java library提供的
dailrotationpolicy
一起使用。

您为什么不自己打开文件?@talex您的意思是什么?只需打开文件输入流并编写您想要的内容即可。午夜时分,关闭它并打开另一个。您需要保存从服务器获取的数据做什么?只是为了备份?您需要将哪些元数据与来自服务器的数据一起存储?就在收到数据的时候?如果数据很重要,我可能希望将其存储在数据库中,并使用BLOB作为ProtoBuff数据。如果您确定一个文本日志文件足够了,我会将ProtoBuff数据编码为ASCII格式,例如Base64,这样当您使用文本编辑器查看日志文件时,它将是可读的。是否可以将原始protobuf文本转换为序列化的protobuf二进制?为什么不自己打开文件?@talex你的意思是什么?只需打开FileInputStream并编写所需内容。午夜时分,关闭它并打开另一个。您需要保存从服务器获取的数据做什么?只是为了备份?您需要将哪些元数据与来自服务器的数据一起存储?就在收到数据的时候?如果数据很重要,我可能希望将其存储在数据库中,并使用BLOB作为ProtoBuff数据。如果您确定一个文本日志文件足够了,我会将ProtoBuff数据编码为ASCII格式,例如Base64,这样当您使用文本编辑器查看日志文件时,它将是可读的。是否可以将原始protobuf文本转换为序列化的protobuf二进制?为什么不自己打开文件?@talex你的意思是什么?只需打开FileInputStream并编写所需内容。午夜时分,关闭它并打开另一个。您需要保存从服务器获取的数据做什么?只是为了备份?您需要将哪些元数据与来自服务器的数据一起存储?就在收到数据的时候?如果数据很重要,我可能希望将其存储在数据库中,并使用BLOB作为ProtoBuff数据。如果您确定一个文本日志文件足够了,我会将ProtoBuff数据编码为ASCII格式,例如Base64,这样当您使用文本编辑器查看日志文件时,它将是可读的。是否可以将原始protobuf文本转换为序列化的protobuf二进制?为什么不自己打开文件?@talex你的意思是什么?只需打开FileInputStream并编写所需内容。午夜时分,关闭它并打开另一个。您需要保存从服务器获取的数据做什么?只是为了备份?元数据做什么