我从服务器获取数据流(二进制格式)。此数据使用Google协议缓冲区序列化。我正在尝试进行每日翻转(即如果第二天发生写入包含新日期的新文件,其中包含压缩数据)。
我试图通过log4j执行此操作,但是,log4j不考虑二进制文件(据我所知,我只能通过它获取文本)。当log4j写入文件时,它不会以二进制形式写入,而是以文本(人类可读)格式写入。
我讨论了这个问题,在log4j How to Create Binary Log File in Java using Log4J
中创建了一个自定义二进制appender但是,我几天前才开始使用log4j,我不太清楚如何做到这一点。
还有其他方法可以对二进制数据进行翻转吗?我甚至不确定log4j是否是最佳解决方案。我非常乐意尝试你能提出的任何解决方案!
我希望log4j以二进制而非文本形式写入数据。
有没有办法在java中对二进制文件进行每日翻转?
答案 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)
您可以将RotatingFileOutputStream
与rotating-fos Java库提供的DailyRotationPolicy
一起使用。