Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp	(revision 39649)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDebugVM.cpp	(revision 39650)
@@ -150,4 +150,77 @@
     return RTEXITCODE_SUCCESS;
 }
+
+/**
+ * Handles the log sub-command.
+ *
+ * @returns Suitable exit code.
+ * @param   pArgs               The handler arguments.
+ * @param   pDebugger           Pointer to the debugger interface.
+ * @param   pszSubCmd           The sub command.
+ */
+static RTEXITCODE handleDebugVM_LogXXXX(HandlerArg *pArgs, IMachineDebugger *pDebugger, const char *pszSubCmd)
+{
+    /*
+     * Parse arguments.
+     */
+    bool                        fRelease = false;
+    com::Utf8Str                strSettings;
+
+    RTGETOPTSTATE               GetState;
+    RTGETOPTUNION               ValueUnion;
+    static const RTGETOPTDEF    s_aOptions[] =
+    {
+        { "--release",      'r', RTGETOPT_REQ_NOTHING },
+    };
+    int rc = RTGetOptInit(&GetState, pArgs->argc, pArgs->argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, 0 /*fFlags*/);
+    AssertRCReturn(rc, RTEXITCODE_FAILURE);
+
+    while ((rc = RTGetOpt(&GetState, &ValueUnion)) != 0)
+    {
+        switch (rc)
+        {
+            case 'r':
+                fRelease = true;
+                break;
+
+            case 'd':
+                fRelease = false;
+                break;
+
+            case VINF_GETOPT_NOT_OPTION:
+                if (strSettings.length() == 0)
+                    strSettings = ValueUnion.psz;
+                else
+                {
+                    strSettings.append(' ');
+                    strSettings.append(ValueUnion.psz);
+                }
+                break;
+
+            default:
+                return errorGetOpt(USAGE_DEBUGVM, rc, &ValueUnion);
+        }
+    }
+
+    if (fRelease)
+    {
+        com::Utf8Str strTmp(strSettings);
+        strSettings = "release: ";
+        strSettings.append(strTmp);
+    }
+
+    com::Bstr bstrSettings(strSettings);
+    if (!strcmp(pszSubCmd, "log"))
+        CHECK_ERROR2_RET(pDebugger, ModifyLogGroups(bstrSettings.raw()), RTEXITCODE_FAILURE);
+    else if (!strcmp(pszSubCmd, "logdest"))
+        CHECK_ERROR2_RET(pDebugger, ModifyLogDestinations(bstrSettings.raw()), RTEXITCODE_FAILURE);
+    else if (!strcmp(pszSubCmd, "logflags"))
+        CHECK_ERROR2_RET(pDebugger, ModifyLogFlags(bstrSettings.raw()), RTEXITCODE_FAILURE);
+    else
+        AssertFailedReturn(RTEXITCODE_FAILURE);
+
+    return RTEXITCODE_SUCCESS;
+}
+
 
 /**
@@ -442,4 +515,10 @@
             else if (!strcmp(pszSubCmd, "injectnmi"))
                 rcExit = handleDebugVM_InjectNMI(pArgs, ptrDebugger);
+            else if (!strcmp(pszSubCmd, "log"))
+                rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd);
+            else if (!strcmp(pszSubCmd, "logdest"))
+                rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd);
+            else if (!strcmp(pszSubCmd, "logflags"))
+                rcExit = handleDebugVM_LogXXXX(pArgs, ptrDebugger, pszSubCmd);
             else if (!strcmp(pszSubCmd, "osdetect"))
                 rcExit = handleDebugVM_OSDetect(pArgs, ptrDebugger);
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 39649)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp	(revision 39650)
@@ -645,4 +645,7 @@
                      "                            info <item> [args] |\n"
                      "                            injectnmi |\n"
+                     "                            log [--release|--debug] <settings> ...|\n"
+                     "                            logdest [--release|--debug] <settings> ...|\n"
+                     "                            logflags [--release|--debug] <settings> ...|\n"
                      "                            osdetect |\n"
                      "                            osinfo |\n"
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 39649)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 39650)
@@ -9158,5 +9158,5 @@
         Retrieves status, exit code and the exit reason of a formerly started
         guest process. If a guest process exited or got terminated this function
-        returns its final status and removes this process from the list of 
+        returns its final status and removes this process from the list of
         known guest processes for further retrieval.
 
@@ -13257,11 +13257,11 @@
     <method name="modifyLogGroups">
       <desc>
-        Modifies the group settings of the debug logger.
-
-        This feature is not implemented in the 4.0.0 release but may show up
-        in a dot release.
+        Modifies the group settings of the debug or release logger.
       </desc>
       <param name="settings" type="wstring" dir="in">
-        <desc>The group settings string. See iprt/log.h for details.</desc>
+        <desc>
+          The group settings string. See iprt/log.h for details. To target the
+          release logger, prefix the string with "release:".
+        </desc>
       </param>
     </method>
@@ -13269,11 +13269,11 @@
     <method name="modifyLogFlags">
       <desc>
-        Modifies the debug logger flags.
-
-        This feature is not implemented in the 4.0.0 release but may show up
-        in a dot release.
+        Modifies the debug or release logger flags.
       </desc>
       <param name="settings" type="wstring" dir="in">
-        <desc>The flags settings string. See iprt/log.h for details.</desc>
+        <desc>
+          The flags settings string. See iprt/log.h for details. To target the
+          release logger, prefix the string with "release:".
+        </desc>
       </param>
     </method>
@@ -13281,11 +13281,11 @@
     <method name="modifyLogDestinations">
       <desc>
-        Modifies the debug logger destinations.
-
-        This feature is not implemented in the 4.0.0 release but may show up
-        in a dot release.
+        Modifies the debug or release logger destinations.
       </desc>
       <param name="settings" type="wstring" dir="in">
-        <desc>The destination settings string. See iprt/log.h for details.</desc>
+        <desc>
+          The destination settings string. See iprt/log.h for details. To target the
+          release logger, prefix the string with "release:".
+        </desc>
       </param>
     </method>
Index: /trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp	(revision 39649)
+++ /trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp	(revision 39650)
@@ -963,15 +963,75 @@
 STDMETHODIMP MachineDebugger::ModifyLogFlags(IN_BSTR a_bstrSettings)
 {
-    ReturnComNotImplemented();
+    CheckComArgStrNotEmptyOrNull(a_bstrSettings);
+    Utf8Str strSettings(a_bstrSettings);
+
+    LogFlowThisFunc(("a_bstrSettings=%s\n", strSettings.c_str()));
+    AutoCaller autoCaller(this);
+    HRESULT hrc = autoCaller.rc();
+    if (SUCCEEDED(hrc))
+    {
+        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+        Console::SafeVMPtr ptrVM(mParent);
+        hrc = ptrVM.rc();
+        if (SUCCEEDED(hrc))
+        {
+            int vrc = DBGFR3LogModifyFlags(ptrVM, strSettings.c_str());
+            if (RT_SUCCESS(vrc))
+                hrc = S_OK;
+            else
+                hrc = setError(E_FAIL, tr("DBGFR3LogModifyFlags failed with %Rrc"), vrc);
+        }
+    }
+    return hrc;
 }
 
 STDMETHODIMP MachineDebugger::ModifyLogGroups(IN_BSTR a_bstrSettings)
 {
-    ReturnComNotImplemented();
+    CheckComArgStrNotEmptyOrNull(a_bstrSettings);
+    Utf8Str strSettings(a_bstrSettings);
+
+    LogFlowThisFunc(("a_bstrSettings=%s\n", strSettings.c_str()));
+    AutoCaller autoCaller(this);
+    HRESULT hrc = autoCaller.rc();
+    if (SUCCEEDED(hrc))
+    {
+        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+        Console::SafeVMPtr ptrVM(mParent);
+        hrc = ptrVM.rc();
+        if (SUCCEEDED(hrc))
+        {
+            int vrc = DBGFR3LogModifyGroups(ptrVM, strSettings.c_str());
+            if (RT_SUCCESS(vrc))
+                hrc = S_OK;
+            else
+                hrc = setError(E_FAIL, tr("DBGFR3LogModifyGroups failed with %Rrc"), vrc);
+        }
+    }
+    return hrc;
 }
 
 STDMETHODIMP MachineDebugger::ModifyLogDestinations(IN_BSTR a_bstrSettings)
 {
-    ReturnComNotImplemented();
+    CheckComArgStrNotEmptyOrNull(a_bstrSettings);
+    Utf8Str strSettings(a_bstrSettings);
+
+    LogFlowThisFunc(("a_bstrSettings=%s\n", strSettings.c_str()));
+    AutoCaller autoCaller(this);
+    HRESULT hrc = autoCaller.rc();
+    if (SUCCEEDED(hrc))
+    {
+        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+        Console::SafeVMPtr ptrVM(mParent);
+        hrc = ptrVM.rc();
+        if (SUCCEEDED(hrc))
+        {
+            int vrc = DBGFR3LogModifyDestinations(ptrVM, strSettings.c_str());
+            if (RT_SUCCESS(vrc))
+                hrc = S_OK;
+            else
+                hrc = setError(E_FAIL, tr("DBGFR3LogModifyDestinations failed with %Rrc"), vrc);
+        }
+    }
+    return hrc;
 }
 
Index: /trunk/src/VBox/VMM/VMMR3/DBGFLog.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/DBGFLog.cpp	(revision 39649)
+++ /trunk/src/VBox/VMM/VMMR3/DBGFLog.cpp	(revision 39650)
@@ -26,4 +26,5 @@
 #include <VBox/err.h>
 #include <iprt/assert.h>
+#include <iprt/string.h>
 
 
@@ -37,4 +38,29 @@
 
 /**
+ * Checkes for logger prefixes and selects the right logger.
+ *
+ * @returns Target logger.
+ * @param   ppsz                Pointer to the string pointer.
+ */
+static PRTLOGGER dbgfR3LogResolvedLogger(const char **ppsz)
+{
+    PRTLOGGER   pLogger;
+    const char *psz = *ppsz;
+    if (!strncmp(psz, "release:", sizeof("release:") - 1))
+    {
+        *ppsz += sizeof("release:") - 1;
+        pLogger = RTLogRelDefaultInstance();
+    }
+    else
+    {
+        if (!strncmp(psz, "debug:", sizeof("debug:") - 1))
+            *ppsz += sizeof("debug:") - 1;
+        pLogger = RTLogDefaultInstance();
+    }
+    return pLogger;
+}
+
+
+/**
  * Changes the logger group settings.
  *
@@ -42,4 +68,8 @@
  * @param   pVM                 The VM handle.
  * @param   pszGroupSettings    The group settings string. (VBOX_LOG)
+ *                              By prefixing the string with \"release:\" the
+ *                              changes will be applied to the release log
+ *                              instead of the debug log.  The prefix \"debug:\"
+ *                              is also recognized.
  */
 VMMR3DECL(int) DBGFR3LogModifyGroups(PVM pVM, const char *pszGroupSettings)
@@ -61,5 +91,9 @@
 static DECLCALLBACK(int) dbgfR3LogModifyGroups(PVM pVM, const char *pszGroupSettings)
 {
-    int rc = RTLogGroupSettings(NULL, pszGroupSettings);
+    PRTLOGGER pLogger = dbgfR3LogResolvedLogger(&pszGroupSettings);
+    if (!pLogger)
+        return VINF_SUCCESS;
+
+    int rc = RTLogGroupSettings(pLogger, pszGroupSettings);
     if (RT_SUCCESS(rc))
         rc = VMMR3UpdateLoggers(pVM);
@@ -74,4 +108,8 @@
  * @param   pVM                 The VM handle.
  * @param   pszFlagSettings     The group settings string. (VBOX_LOG_FLAGS)
+ *                              By prefixing the string with \"release:\" the
+ *                              changes will be applied to the release log
+ *                              instead of the debug log.  The prefix \"debug:\"
+ *                              is also recognized.
  */
 VMMR3DECL(int) DBGFR3LogModifyFlags(PVM pVM, const char *pszFlagSettings)
@@ -93,5 +131,9 @@
 static DECLCALLBACK(int) dbgfR3LogModifyFlags(PVM pVM, const char *pszFlagSettings)
 {
-    int rc = RTLogFlags(NULL, pszFlagSettings);
+    PRTLOGGER pLogger = dbgfR3LogResolvedLogger(&pszFlagSettings);
+    if (!pLogger)
+        return VINF_SUCCESS;
+
+    int rc = RTLogFlags(pLogger, pszFlagSettings);
     if (RT_SUCCESS(rc))
         rc = VMMR3UpdateLoggers(pVM);
@@ -106,4 +148,8 @@
  * @param   pVM                 The VM handle.
  * @param   pszDestSettings     The destination settings string. (VBOX_LOG_DEST)
+ *                              By prefixing the string with \"release:\" the
+ *                              changes will be applied to the release log
+ *                              instead of the debug log.  The prefix \"debug:\"
+ *                              is also recognized.
  */
 VMMR3DECL(int) DBGFR3LogModifyDestinations(PVM pVM, const char *pszDestSettings)
@@ -125,4 +171,8 @@
 static DECLCALLBACK(int) dbgfR3LogModifyDestinations(PVM pVM, const char *pszDestSettings)
 {
+    PRTLOGGER pLogger = dbgfR3LogResolvedLogger(&pszDestSettings);
+    if (!pLogger)
+        return VINF_SUCCESS;
+
     int rc = RTLogDestinations(NULL, pszDestSettings);
     if (RT_SUCCESS(rc))
