在调试失败的 SSL 握手时,如何在文件中捕获 Java 控制台的输出?

问题描述 投票:0回答:4

我想通过查看 Java 调试输出来调试

java.io.EOFException: SSL peer shut down incorrectly
。运行应用程序时我看不到 Java 控制台,因此我想将 SSL 调试日志存储在文件中:

        System.setProperty("javax.net.ssl.trustStore", "client_truststore.ks");
        System.setProperty("javax.net.ssl.trustStorePassword", "myPass");
        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
        System.setProperty("javax.net.debug", "ssl:handshake");
        
        PrintStream out = new PrintStream(new FileOutputStream("./ssl.txt"));
        System.setOut(out);

        URL url = new URL("https://myURL:8080/myService?wsdl");
        QName qname = new QName("http://mynamespace.com", "MyImplService");
        MyServiceagent service = new MyServiceagent(url, qname);
        MyPort port = service.getMyPortPort();

但是,ssl.txt 中没有写入任何内容。输出去了哪里以及为什么不写入文件?

编辑:我切换到绝对文件路径,可以看到正在创建文件,但仍然没有内容。

javax.net.debug
不会出现输出或错误日志。

java ssl
4个回答
0
投票

错误输出可能在错误流上,而不是输出流上。你可以试试

System.setErr(out);

0
投票

我建议尝试通过文件输出流写入它或尝试序列化的另一种方法..就像如果您期待任何异常,请将其放在 try 块下。然后在catch块中获取异常消息并将其写入文件。 (文件输出流)..如果您不知道文件输出流,序列化请谷歌一次。

此外,通常所有企业都有一定的配置来捕获日志。像log.error一样捕获错误日志。同样,您可以将配置更新为调试级别以捕获调试日志,例如 log.debug


0
投票

解决方案是在初始化服务器之前设置这些系统属性,而不是在创建服务器之后但在客户端之前进行设置。


0
投票

或者您可以在调用 JVM 时使用重定向: java -Djavax.net.debug=all -jar >> 输出.log 2>&1

© www.soinside.com 2019 - 2024. All rights reserved.