我正在尝试使用java.logging.util在文件上打印日志信息。此解决方案正在运行,但日志中的信息不会随回车一起显示。我的代码:
主要的
String url ="opc.tcp://DEV85:53530/OPCUA/SimulationServer";
MyFormatter formatter=new MyFormatter();
fh = new FileHandler("C:/tmp/MyLogFile.log",true);
logger.addHandler(fh);
fh.setFormatter(formatter);
doSomething else()
EndpointDescription[] endpoints = myClient.discoverEndpoints(url);
for(EndpointDescription e: endpoints) {
//System.out.println(e);
logger.info(e.toString());
}
格式化程序类
public class MyFormatter extends Formatter {
// Create a DateFormat to format the logger timestamp.
private static final DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");
@Override
public String format(LogRecord record) {
StringBuilder builder = new StringBuilder(1000);
builder.append(df.format(new Date(record.getMillis()))).append(" - ");
builder.append("[").append(record.getSourceClassName()).append(".");
builder.append(record.getSourceMethodName()).append("] - ");
builder.append("[").append(record.getLevel()).append("] - ");
builder.append(formatMessage(record));
builder.append(System.getProperty("line.separator", "\r\n"));
//builder.append("\n");
return builder.toString();
}
}
输出正好在一条线上。我在网上找到了一些解决方案,但什么都不管用。
1条答案
按热度按时间ni65a41a1#
简单地说,SimpleDataFormat不是线程安全的,因此您不知道如何将其存储为对象或静态引用。每次调用或使用java.time.format包创建一个新示例。修复此问题,使其不会导致任何幻象问题。
此解决方案正在运行,但日志中的信息不会随回车一起显示。
使用可以显示空白字符的文本编辑器打开文件。您的格式化程序代码看起来正确。您需要再次检查您使用的查看器是否只是错误地呈现了文本(记事本)。最坏的情况是使用fileinputstream并将原始字节读取为十六进制。应该能够看到行分隔符的十六进制值。您对格式化程序本身的单元测试应该能够验证行分隔符是否存在。
另一个问题是,您必须证明正在使用格式化程序。您正在打开要追加的文件,以便其他格式化程序可以在同一文件中插入数据。考虑重写GeHead和GeT尾以生成唯一ID,并将其放置在格式化程序中进行测试。这将显示格式化程序的开始和停止。
此外,java.util.logging.simpleformatter可以支持此格式,但它是一个全局设置,不能为每个对象自定义。