1818import java .io .BufferedReader ;
1919import java .io .IOException ;
2020import java .io .InputStreamReader ;
21+ import java .lang .invoke .MethodHandles ;
22+ import java .lang .invoke .MethodType ;
23+ import java .lang .reflect .Field ;
2124import java .nio .charset .StandardCharsets ;
25+ import java .util .Optional ;
2226
2327import static org .apache .commons .lang3 .StringUtils .isNotBlank ;
2428
@@ -48,7 +52,7 @@ public void run() {
4852 try {
4953 while (process .isAlive ()) {
5054 try {
51- logger . info (reader .readLine ());
55+ Optional . ofNullable (reader .readLine ()). ifPresent ( logger :: info );
5256 } catch (final IOException e ) {
5357 logger .error ("while reading output" , e );
5458 return ;
@@ -64,9 +68,23 @@ public void run() {
6468 }
6569
6670 static void logOutput (final Logger logger , final Process process , final String processName ) {
67- final String threadName = isNotBlank (processName ) ? processName + "@" + process . hashCode () : process . toString ( );
71+ final String threadName = ( isNotBlank (processName ) ? processName : "unknown" ) + ":" + processId ( process );
6872 final Thread t = new Thread (new ProcessOutputLogger (logger , process ));
6973 t .setName (threadName );
7074 t .start ();
7175 }
76+
77+ private static String processId (Process process ) {
78+ try { // java 9+
79+ return String .format ("pid(%s)" , MethodHandles .lookup ().findVirtual (Process .class , "pid" , MethodType .methodType (long .class )).invoke (process ));
80+ } catch (Throwable ignored ) {} // NOPMD since MethodHandles.invoke throws Throwable
81+
82+ try { // openjdk / oraclejdk 8
83+ final Field pid = process .getClass ().getDeclaredField ("pid" );
84+ pid .setAccessible (true );
85+ return String .format ("pid(%s)" , pid .getInt (process ));
86+ } catch (Exception ignored ) {} // NOPMD
87+
88+ return String .format ("id(%s)" , process .hashCode ());
89+ }
7290}
0 commit comments