diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index d30d87411d1f49ea397cf334c58c2d92e06ecc9c..9d6c19f1dd97e62f3747734e556d538e3e5f94b3 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -81,6 +81,21 @@ bool LLProcess::isRunning(void)
 	return (mProcessID != 0);
 }
 
+std::ostream& operator<<(std::ostream& out, const LLProcess::Params& params)
+{
+	std::string cwd(params.cwd);
+	if (! cwd.empty())
+	{
+		out << "cd '" << cwd << "': ";
+	}
+	out << '"' << std::string(params.executable) << '"';
+	BOOST_FOREACH(const std::string& arg, params.args)
+	{
+		out << " \"" << arg << '"';
+	}
+	return out;
+}
+
 /*****************************************************************************
 *   Windows specific
 *****************************************************************************/
diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h
index 9ea129baf28d8aabfa19bb7cdf80f9968d27f093..7dbdf23679e110280b82892cb65e1468f419ce3e 100644
--- a/indra/llcommon/llprocess.h
+++ b/indra/llcommon/llprocess.h
@@ -31,6 +31,7 @@
 #include "llsdparam.h"
 #include <boost/shared_ptr.hpp>
 #include <boost/noncopyable.hpp>
+#include <iosfwd>                   // std::ostream
 
 #if LL_WINDOWS
 #define WIN32_LEAN_AND_MEAN
@@ -124,4 +125,7 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 	bool mAutokill;
 };
 
+/// for logging
+LL_COMMON_API std::ostream& operator<<(std::ostream&, const LLProcess::Params&);
+
 #endif // LL_LLPROCESS_H
diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp
index 3dfebad958acf5183cf302d3b06d2d96586c9d53..0d3ed0ba3559de25979343e7ef7ce17c93243631 100644
--- a/indra/newview/llexternaleditor.cpp
+++ b/indra/newview/llexternaleditor.cpp
@@ -74,12 +74,7 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env
 		llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl;
 	}
 
-	llinfos << "Setting command [" << bin_path;
-	BOOST_FOREACH(const std::string& arg, mProcessParams.args)
-	{
-		llcont << " \"" << arg << "\"";
-	}
-	llcont << "]" << llendl;
+	llinfos << "Setting command [" << mProcessParams << "]" << llendl;
 
 	return EC_SUCCESS;
 }
@@ -108,12 +103,7 @@ LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
 	}
 
 	// Run the editor.
-	llinfos << "Running editor command [" << std::string(params.executable);
-	BOOST_FOREACH(const std::string& arg, params.args)
-	{
-		llcont << " \"" << arg << "\"";
-	}
-	llcont << "]" << llendl;
+	llinfos << "Running editor command [" << params << "]" << llendl;
 	// Prevent killing the process in destructor.
 	params.autokill = false;
 	return LLProcess::create(params) ? EC_SUCCESS : EC_FAILED_TO_RUN;