当我想编写用于将文本写入文件的 Java 代码时,它通常看起来像这样:
File logFile = new File("/home/someUser/app.log");
FileWriter writer;
try {
writer = new FileWriter(logFile, true);
writer.write("Some text.");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
我现在正在编写一个Logger
将被内部报告工具广泛使用的内容。由于此问题上下文之外的原因,我不能使用传统的日志记录框架之一(SLF4J、Log4j、Logback、JUL、JCL 等)。所以我必须做一些本土的东西。
这个日志系统将很简单,不可配置,但必须能够处理大容量(可能每秒数百个日志操作,或更多)。
所以我问:如何优化我上面的普通文件 I/O 模板,以处理高吞吐量日志记录?我可以在这里利用什么“ Java File I/O 的隐藏宝石”?几乎任何事情都会发生,除了,就像我说的,使用其他日志框架。基本Logger
API 需要类似于:
public class Logger {
private File logFile;
public Logger(File logFile) {
super();
setFile(logFile);
}
public void log(String message) {
???
}
}
提前致谢!
更新:如果我Logger
使用 aByteOutputStream
而不是 a FileWriter
,那么如何正确同步我的log(String) : void
方法?
public class Logger {
private File logFile;
// Constructor, getters/setters, etc.
public void synchronized log(String message) {
FileOutputStream foutStream = new FileOutputStream(logFile);
ByteOutputStream boutStream = new BytesOutputStream(foutStream);
boutStream.write(message.getBytes(Charset.forName("utf-8")));
// etc.
}
}