Handling auditLogs

Hello,

I have an error which appears everytime in open my application (Smart Client in which I coded some plugins) :

2025-01-31 15:23:01.681+01:00 [     1] DEBUG      - Debug: MyItemsManager ():Init terminated
2025-01-31 15:23:02.064+01:00 [     1] DEBUG      - Error: LogClient ():Duplicate LogMessageDictionary for MyApp
2025-01-31 15:23:02.065+01:00 [     1] DEBUG      - Error: LogClient ():Duplicate LogMessageDictionary for MyApp
2025-01-31 15:23:02.067+01:00 [     1] DEBUG      - Error: LogClient ():Duplicate LogMessageDictionary for MyApp
2025-01-31 15:23:02.067+01:00 [     1] DEBUG      - Error: LogClient ():Duplicate LogMessageDictionary for MyApp
2025-01-31 15:23:02.327+01:00 [    39] DEBUG      - Debug: ServerStaus ():Connected to the event server.
2025-01-31 15:23:02.478+01:00 [     1] DEBUG      - ......Exception:VMO60325: Could not retrieve information for the security namespace. The namespace does not exist.   Ã  VideoOS.Platform.Util.Security.SecurityClientXPCO.HasPermission(Guid kind, String objectId, String actionId)
   Ã  VideoOS.Platform.Util.Security.SecurityClientXPCOWrapper.CheckPermission(Guid kind, String objectId, String actionId)
   Ã  VideoOS.Platform.Util.SecurityAccess.CheckPermission(Item item, String actionId)
   Ã  VideoOS.Plugins.Common.Permission.RolePermissionProvider.IsAllowedTo(String actionId)
2025-01-31 15:23:02.479+01:00 [     1] DEBUG      - Error: IsAllowedTo (RolePermissionProvider):Error checking GENERIC_READ permission on 34992814-0e16-4724-9975-9d73933cdddf
2025-01-31 15:23:03.887+01:00 [     1] DEBUG      - Debug: AxisOptimizer ():Metadata call status monitoring started for 0 devices
2025-01-31 15:23:03.938+01:00 [     1] DEBUG      - Debug: AxisOptimizer ():Metadata call status monitoring stopped
 

It seems to be issued by my AuditLogs, here is the code of my class Managing audit logs :

namespace Partner.Util
{
    internal class AuditLogs
    {
        private const string _ChannelComponent = "MyChannel";
        private const string _idChannelUnassignmentMessage = "ChannelUnAssignment";
        private const string _idChannelAssignmentMessage = "ChannelAssignment";
        private const string _tokenCategory = "TOKEN";
 
        public static void RegisterAssignmentMessages()
        {
            Dictionary<string, LogMessage> messages = new Dictionary<string, LogMessage>
            {
                {
                    _idChannelAssignmentMessage,
                    BuildMessage(
                    id: _idChannelAssignmentMessage,
                    category: _tokenCategory,
                    message: Resources.LogMessageAssign,
                    relatedKind: Kind.Camera)
                },
                {
                    _idChannelUnassignmentMessage,
                    BuildMessage(
                    id: _idChannelUnassignmentMessage,
                    category: _tokenCategory,
                    message: Resources.LogMessageUnassign,
                    relatedKind: Kind.Camera)
                }
            };
 
            RegisterMyMessages(version: "1.4", _ChannelComponent, messages);
        }
 
        public static void LogAssignCameraToChannel(string channelName, Guid cameraId)
        {
            Item camera = Configuration.Instance.GetItemConfiguration(MyDefinition.MyPluginId, MyDefinition.MyCameraKind, cameraId);
            Dictionary<string, string> parms = new Dictionary<string, string>
            {
                ["camera"] = camera.Name,
                ["canal"] = channelName
            };
            LogClient.Instance.AuditEntry(Resources.ApplicationName, _ChannelComponent,
                _idChannelAssignmentMessage, camera, parms, PermissionState.Granted);
        }
        public static void LogUnassignCameraFromChannel(string channelName, Guid cameraId)
        {
            Item camera = Configuration.Instance.GetItemConfiguration(MyDefinition.MyPluginId, MyDefinition.MyCameraKind, cameraId);
            Dictionary<string, string> parms = new Dictionary<string, string>
            {
                ["camera"] = camera.Name,
                ["canal"] = channelName
            };
            LogClient.Instance.AuditEntry(Resources.ApplicationName, _ChannelComponent,
                _idChannelUnassignmentMessage, camera, parms, PermissionState.Granted);
        }
 
        private const string _PTZComponent = "MyPTZ";
        private const string _idPTZMessage = "PTZStart";
        private const string _PTZCategory = "PTZ";
 
        public static void RegisterPTZMessages()
        {
            Dictionary<string, LogMessage> messages = new Dictionary<string, LogMessage>
            {
                {
                    _idPTZMessage,
                    BuildMessage(
                        id: _idPTZMessage,
                        category: _PTZCategory,
                        message: Resources.LogPTZMessage,
                        relatedKind: Kind.Camera
                )
                }
            };
 
            RegisterMyMessages(version: "1.2", _PTZComponent, messages);
        }
 
        public static void LogPTZinitSession(MyChannelItem channel)
        {
            Item camera = Configuration.Instance.GetItemConfiguration(MyDefinition.MyPluginId, MyDefinition.MyCameraKind, channel.Camera.FQID.ObjectId);
            Dictionary<string, string> parms = new Dictionary<string, string>
            {
                ["canal"] = channel.Name,
                ["camera"] = camera.Name
            };
            LogClient.Instance.AuditEntry(Resources.ApplicationName, _PTZComponent, _idPTZMessage,
                camera, parms, PermissionState.Granted);
        }
 
        private static void RegisterMyMessages(string version, string component, Dictionary<string, LogMessage> dictionary)
        {
            LogMessageDictionary logMessageDictionary =
                new LogMessageDictionary(
                    Resources.LanguageFR,
                    version,
                    Resources.ApplicationName,
                    component,
                    dictionary,
                    Resources.AuditLogRessourceType);
            LogClient.Instance.RegisterDictionary(logMessageDictionary);
        }
 
        private static LogMessage BuildMessage(string id, string category, string message, Guid relatedKind)
        {
           return new LogMessage()
            {
                Id = id,
                Category = category,
                Message = message,
                Group = Group.Audit,
                Severity = Severity.Info,
                Status = Status.StatusQuo,
                RelatedObjectKind = relatedKind
            };
        }
    }
}

What I am doing wrong ?

Unfortunately you cannot use the LogClient in a plugin, it only works in standalone.

The same issue was discussd in this thread: https://developer.milestonesys.com/s/question/0D53X00006xcy6uSAA/adding-log-entry-to-log-server