I've been using the logging function for some time and recently discovered the "global" logging option. For historical purposes, I log all of the output from SSH sessions for personal use.
I've also started recently using PowerShell to more quickly and dynamically refresh and update the datasources.
What I'm seeing is that when I apply the Global Logging policy on MacOS and specify $NAME$.log for the filename, it creates a folder then a file underneath. I cannot leave the value blank via GUI, on windows or macOS though it complains about LogPath instead of log file name as if it does not honor the value of global. Additionally, if I populate the value for FileName on the MacOS side, it generates a fault trying to create a file that already exists (even though append is selected).
The appears like a GUI bug since generating the Session via powershell, I can leave the filename blank and it successfully logs using the global log path and automatically uses the $NAME$.log as the file name. I can also specify the Custom Path with custom logging then change to Global with the filename as blank and will continue to work.
IOException - IO_FileExists_Name, /Users/<username>/<folder>/<folder>/<folder>/<name>.log
at System.IO.FileSystem.CreateDirectory(String fullPath, UnixFileMode unixCreateMode)
at System.IO.Directory.CreateDirectory(String path)
at Devolutions.RemoteDesktopManager.Managers.DevolutionsTerminalManager.GetLogFileName(Connection connection)
at Devolutions.RemoteDesktopManager.Managers.DevolutionsTerminalManager.SetupTerminalControl(Xterm terminalControl, Connection entry, TerminalConnection terminalConnection)
at Devolutions.RemoteDesktopManager.Managers.DevolutionsTerminalManager.SetupSshTerminal(XtermSsh terminal, Connection entry)
at Devolutions.RemoteDesktopManager.Business.Connectors.EmbeddedSshTerminalConnector.SetTerminal(XtermSsh terminal, Connection connection)
at Devolutions.RemoteDesktopManager.EmbeddedSshTerminalViewController.Setup(Connection connection, OpenConnectionMode openConnectionMode)
at Devolutions.RemoteDesktopManager.Managers.EmbeddedViewManager.OpenInternal(IEmbeddedView frame, Connection connection, Boolean isConnected, Boolean showFooter, OpenConnectionMode openConnectionMode, Image image, Boolean undocked, Boolean isEmbeddedConnection)
at Devolutions.RemoteDesktopManager.Managers.EmbeddedViewManager.Open(Connection connection, IEmbeddedView frame, Boolean isConnected, OpenConnectionMode openConnectionMode, Boolean undocked, Image image, Boolean isEmbeddedConnection, UndockedContainerWindowController undockedWindow)
at Devolutions.RemoteDesktopManager.Business.Connectors.EmbeddedConnector.Connect(Connection connection, OpenConnectionMode openConnectionMode, IForm undockedWindow)
at Devolutions.RemoteDesktopManager.Managers.ConnectionManager.OpenConnection(Connection connection, OpenConnectionParameter parameter, IForm undockedWindow)
at Devolutions.RemoteDesktopManager.Managers.ConnectionManager.OpenConnections(Connection[] connectionList, OpenConnectionParameter parameter)
at Devolutions.RemoteDesktopManager.Managers.ActionManager.DoOpenConnection(Connection[] currentConnections, OpenConnectionMode openConnectionMode, IConnectionSource source, Dictionary`2 openingAttributes)
at Devolutions.RemoteDesktopManager.Managers.ActionManager.OpenConnections(Connection[] currentConnections, OpenConnectionMode openConnectionMode, IConnectionSource source, Boolean checkOpenedConnection)
at Devolutions.RemoteDesktopManager.ConnectionTreeViewController.OpenConnection(Connection[] currentConnections, OpenConnectionMode openConnectionMode)
at Devolutions.RemoteDesktopManager.ConnectionTreeViewController.ovConnections_DoubleClick(Object sender, EventArgs e)
------------------------ extended stack ------------------------
at Devolutions.RemoteDesktopManager.Managers.LogManager.ExtendedStackTrace(Exception ex)
at Devolutions.RemoteDesktopManager.Managers.ErrorManager.BuildErrorDetails(Exception exception, String extraMessage)
at Devolutions.RemoteDesktopManager.ErrorWindowController.AwakeFromNib()
at InvokeStub_ErrorWindowController.AwakeFromNib(Object, Object, IntPtr*)
at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ObjCRuntime.Runtime.InvokeMethod(MethodBase method, Object instance, IntPtr native_parameters)
at ObjCRuntime.Runtime.InvokeMethod(MonoObject* methodobj, MonoObject* instanceobj, IntPtr native_parameters)
at ObjCRuntime.Runtime.bridge_runtime_invoke_method(MonoObject* method, MonoObject* instance, IntPtr parameters, IntPtr* exception_gchandle)
at ObjCRuntime.Messaging.NativeHandle_objc_msgSendSuper(IntPtr receiver, IntPtr selector)
at ObjCRuntime.Messaging.NativeHandle_objc_msgSendSuper(IntPtr receiver, IntPtr selector)
at AppKit.NSWindowController.get_Window()
at Devolutions.RemoteDesktopManager.ErrorWindowController.get_Window()
at Devolutions.RemoteDesktopManager.Managers.UIManager.<>c__DisplayClass139_0.<ShowErrorDetailMessage>b__0()
at Devolutions.RemoteDesktopManager.Managers.ThreadManager.Invoke(Action action, Boolean force, Boolean propagateException)
at Devolutions.RemoteDesktopManager.Managers.UIManager.ShowErrorDetailMessage(Exception exception)
at Devolutions.RemoteDesktopManager.Services.UIService.ShowErrorDetailMessage(Exception exception)
at Devolutions.RemoteDesktopManager.Managers.LogManager.HandleException(Exception exception)
at Devolutions.RemoteDesktopManager.ConnectionTreeViewController.ovConnections_DoubleClick(Object sender, EventArgs e)
at InvokeStub_ActionDispatcher.OnActivated2(Object, Object, IntPtr*)
at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ObjCRuntime.Runtime.InvokeMethod(MethodBase method, Object instance, IntPtr native_parameters)
at ObjCRuntime.Runtime.InvokeMethod(MonoObject* methodobj, MonoObject* instanceobj, IntPtr native_parameters)
at ObjCRuntime.Runtime.bridge_runtime_invoke_method(MonoObject* method, MonoObject* instance, IntPtr parameters, IntPtr* exception_gchandle)
at ObjCRuntime.Messaging.void_objc_msgSendSuper_NativeHandle(IntPtr receiver, IntPtr selector, NativeHandle arg1)
at ObjCRuntime.Messaging.void_objc_msgSendSuper_NativeHandle(IntPtr receiver, IntPtr selector, NativeHandle arg1)
at AppKit.NSWindow.SendEvent(NSEvent theEvent)
at Client.BaseWindow.SendEvent(NSEvent theEvent)
at InvokeStub_MainWindow.SendEvent(Object, Object, IntPtr*)
at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ObjCRuntime.Runtime.InvokeMethod(MethodBase method, Object instance, IntPtr native_parameters)
at ObjCRuntime.Runtime.InvokeMethod(MonoObject* methodobj, MonoObject* instanceobj, IntPtr native_parameters)
at ObjCRuntime.Runtime.bridge_runtime_invoke_method(MonoObject* method, MonoObject* instance, IntPtr parameters, IntPtr* exception_gchandle)
at AppKit.NSApplication.NSApplicationMain(Int32 argc, IntPtr argv)
at AppKit.NSApplication.NSApplicationMain(Int32 argc, IntPtr argv)
at AppKit.NSApplication.Main(String[] args)
at Client.BaseMacClient.Run()
at Client.BaseMacClient.Startup()
at Client.BaseMacClient.Startup[T]()
at Client.BaseMacClient.Startup[T](String[] clientArgs)
at RemoteDesktopManager.Client.Main(String[] args)
Hello,
thank you for the report, we have opened a ticket for the issue
and we will keep you posted on the developments.
Don't hesitate to communicate with us if there's anything.
Best regards,
Michel Lambert
Hello David,
I just wanted to make sure we understand what you are requesting. You want RDM to allow you to leave the filename empty in "Global" mode without any error, in which case it should use the session name as filename. So, if you have an ssh session named "ssh" and you set the log to "Global" and leave the file name empty, it should create a "ssh.log" in your global path with the log of that session, is that correct ?
Best regards,
Maxim Buisson
My inquiry is to try to resolve the logging difference between MacOS and Windows. The behavior on windows is that you must provide a file name, global or custom. This results in the file either being created or appended when opening the connection.
/users/<username>/.rdm/logging/<connection name>.log
When using the Global option in macOS with the global setting, I have to set the name for the output, but if I set the name it tells me the file already exists. If I leave the name blank (only possible via powershell settings), it will create or append the file appropriately.
I only recently discovered the Global Logging Option and would like to be able to use it across platforms in similar datasources enabling customization on each system but so far what I'm seeing it that I can't and if I try to edit the connection which it working, it tells me I have a missing attribute to populate. From what I'm seeing, this appears to be a bug.
Is there a better way to provide the details you are looking for?
-David
Hello,
I believe we may have found the issue. I think there was some confusion about the log paths, since the custom and the global paths don't work the same way. Let me try to clarify this for you.
When using "Custom" log path type, you must provide the full path + the name of the file, for example /Users/<user>/Documents/testlog.log
This will create/append to the file "testlog.log" in the folder /Users/<user>/Documents/
When using the "Global" log path type, you must provide in the settings the directory where you want to store the global logs. 
Then, in your entries, you only have to provide the name of the file. For example, in the settings have "/Users/<user>/Documents/" and in your entry have "testlog.log".
This will also create/append to the file "testlog.log" in the folder /Users/<user>/Documents/
If you type in the global log path /testlog.log at the end, it will try to write to /Users/<user>/Documents/testlog.log/testlog.log and attempt to create a folder with that name and since a log file with that name already exists, it will create an error. We will try to make it more obvious what's wrong when that happens in the future, but for now, hopefully my instructions can get the global logs to work for you. If not, please provide screenshots of your connection log settings and global settings so I can try to replicate the problem.
Global path is useful, because now you don't have to type the whole path for each entry, only the filename. We will also look into making it so if the filename is left empty, it automatically uses the name of the connection, as I believe you suggested. We will let you know when we have updates about that.
Please let me know if that works for you and if there's anything else don't hesitate to contact us.
Best regards,
Maxim Buisson
Screenshot 2024-04-29 at 2.09.50 PM.png
Screenshot 2024-04-29 at 2.12.00 PM.png
Screenshot 2024-04-29 at 2.05.33 PM.png