filehandler-java.logging.util无回车

c3frrgcw  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(291)

我正在尝试使用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();
    }

}

输出正好在一条线上。我在网上找到了一些解决方案,但什么都不管用。

ni65a41a

ni65a41a1#

简单地说,SimpleDataFormat不是线程安全的,因此您不知道如何将其存储为对象或静态引用。每次调用或使用java.time.format包创建一个新示例。修复此问题,使其不会导致任何幻象问题。
此解决方案正在运行,但日志中的信息不会随回车一起显示。
使用可以显示空白字符的文本编辑器打开文件。您的格式化程序代码看起来正确。您需要再次检查您使用的查看器是否只是错误地呈现了文本(记事本)。最坏的情况是使用fileinputstream并将原始字节读取为十六进制。应该能够看到行分隔符的十六进制值。您对格式化程序本身的单元测试应该能够验证行分隔符是否存在。
另一个问题是,您必须证明正在使用格式化程序。您正在打开要追加的文件,以便其他格式化程序可以在同一文件中插入数据。考虑重写GeHead和GeT尾以生成唯一ID,并将其放置在格式化程序中进行测试。这将显示格式化程序的开始和停止。
此外,java.util.logging.simpleformatter可以支持此格式,但它是一个全局设置,不能为每个对象自定义。

相关问题