Java 使用协议缓冲区的FileOutputStream的每日滚动?
我正在从服务器获取数据流(二进制格式)。此数据使用Google协议缓冲区序列化。我正在尝试进行每日滚动(即,如果第二天发生,则写入包含新日期的新文件,其中包含压缩数据) 我试图通过log4j来实现这一点,然而,log4j并没有考虑二进制(据我所知,我只能通过它来获取文本)。当log4j写入文件时,它不会以二进制格式写入,而是以文本(人类可读)格式写入 我讨论了这个问题,在log4j中创建了一个定制的二进制追加器 然而,我几天前才开始使用log4j,我不太确定如何开始这样做 有没有其他方法可以实现二进制数据的滚动?我甚至不确定log4j是否是最好的解决方案。我非常乐意尝试你能想出的任何解决方案 我希望log4j以二进制而不是文本的形式写入数据Java 使用协议缓冲区的FileOutputStream的每日滚动?,java,log4j,protocol-buffers,fileoutputstream,Java,Log4j,Protocol Buffers,Fileoutputstream,我正在从服务器获取数据流(二进制格式)。此数据使用Google协议缓冲区序列化。我正在尝试进行每日滚动(即,如果第二天发生,则写入包含新日期的新文件,其中包含压缩数据) 我试图通过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并编写所需内容。午夜时分,关闭它并打开另一个。您需要保存从服务器获取的数据做什么?只是为了备份?元数据做什么