FileHandler语言 - java.logging.util no carriage return



我正试图使用java.loggin.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", "rn"));
//builder.append("n");
return builder.toString();
}
}

输出只是在线上。我在网上找到了一些解决方案,但对我来说什么都不管用。

SimpleDateFormat是线程不安全的,因此您不知道如何将其存储为对象或静态引用。每次调用都创建一个新实例,或者使用java.time.format包。修复这个问题,这样它就不会引起任何幻影问题。

此解决方案正在运行,但日志中的信息不会随回车一起显示。

使用可以显示空白字符的文本编辑器打开文件。您的格式化程序代码看起来是正确的。您需要仔细检查您使用的查看器是否只是错误地呈现了文本(记事本(。最坏的情况是使用FileInputStream并以十六进制读取原始字节。应该能够看到行分隔符的十六进制值。您仅对格式化程序本身进行的单元测试应该能够验证行分隔符是否存在。

另一个问题是,您必须证明您的格式化程序正在被使用。您正在打开文件进行追加,这样其他格式化程序就可以在同一文件中插入它们的数据。考虑重写getHead和getTail以生成一个唯一的id,并将其放在格式化程序中进行测试。这将显示格式化程序的启动和停止。

java.util.logging.SimpleFormatter也可以支持这种格式,但它是一个全局设置,不能为每个对象自定义。

最新更新