Index: core/src/main/java/hudson/slaves/SlaveComputer.java
===================================================================
--- core/src/main/java/hudson/slaves/SlaveComputer.java	(revision 29614)
+++ core/src/main/java/hudson/slaves/SlaveComputer.java	(working copy)
@@ -57,6 +57,7 @@
 import java.util.concurrent.Future;
 import java.security.Security;
 
+import org.apache.commons.io.IOUtils;
 import org.kohsuke.stapler.StaplerRequest;
 import org.kohsuke.stapler.StaplerResponse;
 import org.kohsuke.stapler.QueryParameter;
@@ -175,21 +176,25 @@
             public Object call() throws Exception {
                 // do this on another thread so that the lengthy launch operation
                 // (which is typical) won't block UI thread.
-                TaskListener listener = new StreamTaskListener(openLogFile());
+                OutputStream out = openLogFile();
                 try {
-                    launcher.launch(SlaveComputer.this, listener);
-                    return null;
-                } catch (AbortException e) {
-                    listener.error(e.getMessage());
-                    throw e;
-                } catch (IOException e) {
-                    Util.displayIOException(e,listener);
-                    e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError()));
-                    throw e;
-                } catch (InterruptedException e) {
-                    e.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch()));
-                    throw e;
+                    TaskListener listener = new StreamTaskListener(out);
+                    try {
+                        launcher.launch(SlaveComputer.this, listener);
+                        return null;
+                    } catch (AbortException e) {
+                        listener.error(e.getMessage());
+                        throw e;
+                    } catch (IOException e) {
+                        Util.displayIOException(e,listener);
+                        e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError()));
+                        throw e;
+                    } catch (InterruptedException e) {
+                        e.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch()));
+                        throw e;
+                    }
                 } finally {
+                    IOUtils.closeQuietly(out);
                     if (channel==null)
                         offlineCause = new OfflineCause.LaunchFailed();
                 }
@@ -385,10 +390,15 @@
             public void run() {
                 // do this on another thread so that any lengthy disconnect operation
                 // (which could be typical) won't block UI thread.
-                TaskListener listener = new StreamTaskListener(openLogFile());
-                launcher.beforeDisconnect(SlaveComputer.this, listener);
-                closeChannel();
-                launcher.afterDisconnect(SlaveComputer.this, listener);
+                OutputStream out = openLogFile();
+                try {
+                    TaskListener listener = new StreamTaskListener(out);
+                    launcher.beforeDisconnect(SlaveComputer.this, listener);
+                    closeChannel();
+                    launcher.afterDisconnect(SlaveComputer.this, listener);
+                } finally {
+                    IOUtils.closeQuietly(out);
+                }
             }
         });
     }