[options = "header"]
|=======================
|Event Type (Title / Id / Description) |Attribute (Title / Id) |Attribute Description
.7+|*Application Starting* +
[small]#__(application.starting)__#

The application is starting and has passed basic initialization, including profile selection. |User home directory{nbsp} [small]#__(user_home)__# |The "home" directory of the user running the application.
|User system id{nbsp} [small]#__(user_name)__# |The technical/system name of the user running the application.
|Profile location{nbsp} [small]#__(profile_location)__# |The file system location of the profile that the application is using.
|Working directory{nbsp} [small]#__(work_dir)__# |The selected "working directory" when starting the application.
|RCE version id{nbsp} [small]#__(rce_version)__# |The full RCE version string.
|OS name and version{nbsp} [small]#__(os_name)__# |The name of the underlying operating system, as reported by the JRE.
|JVM version{nbsp} [small]#__(jvm_version)__# |The Java version, as reported by the JRE.
.2+|*Application Shutdown Requested* +
[small]#__(application.shutdown.requested)__#

A user or technical process has requested this instance to shut down, e.g. via GUI, console command, or system shell command. If available, information about the cause should be logged as "Shutdown trigger"/"method". |Shutdown trigger{nbsp} [small]#__(method)__# |The kind of event that initiated/requested the shutdown. Currently not strictly specified, for informational use only. Current examples are "console command", "CLI/network signal", and null (unspecified) +
[small]#__(optional)__#
|Part of a restart{nbsp} [small]#__(is_restart)__# |"yes" if the shutdown request is part of a restart request, i.e., a new application session will start after shutdown. +
Possible values: __yes__, __no__
.1+|*Application Terminating* +
[small]#__(application.terminating)__#

A marker event logged at the latest possible time during a regular shutdown of the application. |- __(no attributes)__ |
.3+|*Server Port Opened* +
[small]#__(serverport.opened)__#

A network server port (typically TCP) was opened by the application. |Port type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the server port. +
Possible values: __localnet__, __ssh/uplink__
|IP port number{nbsp} [small]#__(port)__# |The IP port number. +
Possible values: __Integer (1-65535)__
|IP bind address{nbsp} [small]#__(bind_ip)__# |The IP address the port is bound to, which affects from which network interfaces it can be accessed.
.3+|*Server Port Closed* +
[small]#__(serverport.closed)__#

A network server port (typically TCP) was closed by the application. |Port type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the server port. +
Possible values: __localnet__, __ssh/uplink__
|IP port number{nbsp} [small]#__(port)__# |The IP port number. +
Possible values: __Integer (1-65535)__
|IP bind address{nbsp} [small]#__(bind_ip)__# |The IP address the port was bound to.
.9+|*Incoming Connection Accepted* +
[small]#__(connection.incoming.accepted)__#

An incoming connection has been successfully established. This should be logged as late as reasonably possible to avoid "accepted" events where the connection is immediately closed again due to a validation or version mismatch error. Mutually exclusive with the "connection.incoming.refused" event, but may be reached after one or more "connection.incoming.auth.failed" events if the server allows multiple login attempts. |Connection type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the connection. Usually equal to the server port's type. +
Possible values: __localnet__, __ssh/uplink__
|Connection id{nbsp} [small]#__(connection_id)__# |An association id for this connection. The only assumptions that should be made about its content is that it is a string of "reasonable" length, not empty, suitable for log output, and unique within the application's session.
|Remote node id{nbsp} [small]#__(remote_node_id)__# |The id of the remote RCE node, if available from the protocol type's connection process. This id can by any of the four supported id types, but will typically be an "instance session id". +
[small]#__(optional)__#
|Login/user name{nbsp} [small]#__(login_name)__# |The user/login/account identifier successfully used for authentication/authorization, if applicable. +
[small]#__(optional)__#
|Authentication method{nbsp} [small]#__(auth_method)__# |The kind of authentication/authorization (e.g. passphrase or private key) that was successfully used, if applicable. +
[small]#__(optional)__#
|Failure count{nbsp} [small]#__(auth_failure_count)__# |The number of failed authentication/authorization attempts for this connection, if applicable. +
[small]#__(optional)__#
|Remote IP address{nbsp} [small]#__(remote_ip)__# |The remote IP address of the incoming connection.
|Remote IP port{nbsp} [small]#__(remote_port)__# |The remote IP port number of the incoming connection.
|Server IP port{nbsp} [small]#__(server_port)__# |The local server IP port number that the incoming connection is connected to.
.9+|*Incoming Connection Failed To Authenticate* +
[small]#__(connection.incoming.auth.failed)__#

As part of establishing an incoming connection, an authentication/authorization attempt was made but failed. Whether this failure is fatal for the overall connection attempt or not is implementation-specific. If this is ultimately followed up by a successful authentication/authorization attempt (in case another attempt was allowed in the first place), this event should be succeeded by a "connection.incoming.accepted" event. Otherwise, this should always be succeeded by a "connection.incoming.refused" event. |Connection type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the connection. Usually equal to the server port's type. +
Possible values: __localnet__, __ssh/uplink__
|Connection id{nbsp} [small]#__(connection_id)__# |An association id for this connection. The only assumptions that should be made about its content is that it is a string of "reasonable" length, not empty, suitable for log output, and unique within the application's session.
|Login/user name{nbsp} [small]#__(login_name)__# |The user/login/account identifier used for the failed authentication/authorization attempt.
|Authentication method{nbsp} [small]#__(auth_method)__# |The kind of authentication/authorization (e.g. passphrase or private key) that was attempted.
|Failure reason{nbsp} [small]#__(auth_failure_reason)__# |The reason why authentication/authorization failed (e.g., wrong password or unknown user).
|Failure count{nbsp} [small]#__(auth_failure_count)__# |The number of failed authentication/authorization attempts for this connection.
|Remote IP address{nbsp} [small]#__(remote_ip)__# |The remote IP address of the incoming connection.
|Remote IP port{nbsp} [small]#__(remote_port)__# |The remote IP port number of the incoming connection.
|Server IP port{nbsp} [small]#__(server_port)__# |The local server IP port number that the incoming connection is connected to.
.11+|*Incoming Connection Refused* +
[small]#__(connection.incoming.refused)__#

An incoming connection has failed to complete its login process or has been refused for some other reason. Mutually exclusive with the "connection.incoming.accepted" and "connection.incoming.closed" events. Both incorrect authentication attempts as well as authentication timeouts (e.g. when an SSH client makes no authentication attempt at all) are both represented by this event. These sub-types can be distinguished by the "last_auth_failure_reason" attribute. |Connection type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the connection. Usually equal to the server port's type. +
Possible values: __localnet__, __ssh/uplink__
|Connection id{nbsp} [small]#__(connection_id)__# |An association id for this connection. The only assumptions that should be made about its content is that it is a string of "reasonable" length, not empty, suitable for log output, and unique within the application's session.
|Reason{nbsp} [small]#__(close_reason)__# |The human-readable reason why this connection was refused.
|Last login/user name{nbsp} [small]#__(last_login_name)__# |The user/login/account identifier used for the last failed authentication/authorization attempt, if applicable. +
[small]#__(optional)__#
|Last auth. failure{nbsp} [small]#__(last_auth_failure_reason)__# |The last reason why authentication/authorization failed (e.g., wrong password or unknown user), if applicable. +
[small]#__(optional)__#
|Last auth. method{nbsp} [small]#__(last_auth_method)__# |The last kind of authentication/authorization (e.g. passphrase or private key) that was attempted, if applicable. +
[small]#__(optional)__#
|Auth. failure count{nbsp} [small]#__(auth_failure_count)__# |The number of failed authentication/authorization attempts for this connection, if applicable. +
[small]#__(optional)__#
|Remote IP address{nbsp} [small]#__(remote_ip)__# |The remote IP address of the incoming connection.
|Remote IP port{nbsp} [small]#__(remote_port)__# |The remote IP port number of the incoming connection.
|Server IP port{nbsp} [small]#__(server_port)__# |The local server IP port number that the incoming connection is connected to.
|Duration{nbsp} [small]#__(duration)__# |The duration (in msec) that this connection was open/established for. The precise start and end times for this calculation are implementation- and type-dependent.
.8+|*Incoming Connection Closed* +
[small]#__(connection.incoming.closed)__#

An incoming connection has been closed, either by the client, the server, or a network event. This event is always preceded by a "connection.incoming.accepted" event. Mutually exclusive with the "connection.incoming.refused" event. |Connection type{nbsp} [small]#__(type)__# |The technical type and/or protocol of the connection. Usually equal to the server port's type. +
Possible values: __localnet__, __ssh/uplink__
|Connection id{nbsp} [small]#__(connection_id)__# |An association id for this connection. The only assumptions that should be made about its content is that it is a string of "reasonable" length, not empty, suitable for log output, and unique within the application's session.
|Remote node id{nbsp} [small]#__(remote_node_id)__# |The id of the remote RCE node, if available from the protocol type's connection process. This id can by any of the four supported id types, but will typically be an "instance session id". +
[small]#__(optional)__#
|Reason{nbsp} [small]#__(close_reason)__# |The human-readable reason why this connection was closed.
|Remote IP address{nbsp} [small]#__(remote_ip)__# |The remote IP address of the incoming connection.
|Remote IP port{nbsp} [small]#__(remote_port)__# |The remote IP port number of the incoming connection.
|Server IP port{nbsp} [small]#__(server_port)__# |The local server IP port number that the incoming connection is connected to.
|Duration{nbsp} [small]#__(duration)__# |The duration (in msec) that this connection was open/established for. The precise start and end times for this calculation are implementation- and type-dependent.
.9+|*Incoming Uplink Connection Accepted* +
[small]#__(uplink.incoming.accepted)__#

After the login credentials for an incoming SSH connection were accepted, this subsequent event indicates successful completion of the Uplink protocol handshake, too. This includes protocol compatibility validation and the successful assignment of an unused Uplink namespace. |Uplink session id{nbsp} [small]#__(session_id)__# |The Uplink-specific session id.
|SSH connection id{nbsp} [small]#__(connection_id)__# |The SSH connection id for correlation with "connection.incoming.*" events.
|Client software id{nbsp} [small]#__(client_version)__# |The software version of the Uplink client; includes information about the client software used (e.g., "rce/...").
|Protocol version{nbsp} [small]#__(protocol_version)__# |The Uplink protocol version being used for the connection/session, based on the initial client-server handshake.
|Effective login name{nbsp} [small]#__(login_name)__# |The final/effective login name used. Due to namespace mapping constraints, this may be different from the original login name; see "original_login_name".
|Original login name{nbsp} [small]#__(original_login_name)__# |The login name requested by the client, before any modifications by the server. Omitted if equal to the effective login name (see "login_name"). +
[small]#__(optional)__#
|Effective client id{nbsp} [small]#__(client_id)__# |The final/effective client id used. Due to namespace mapping constraints, this may be different from the original client id; see "original_client_id".
|Original client id{nbsp} [small]#__(original_client_id)__# |The client id requested by the client, before any modifications by the server. Omitted if equal to the effective client id (see "client_id"). +
[small]#__(optional)__#
|Assigned namespace{nbsp} [small]#__(namespace)__# |The namespace assigned to this client for Uplink destination address mapping. Typically related to the session id.
.7+|*Incoming Uplink Connection Refused* +
[small]#__(uplink.incoming.refused)__#

After the login credentials for an incoming SSH connection were accepted, this subsequent event indicates failure of the Uplink protocol handshake. This may be due to a version incompatibility or the desired namespace already being used. The next event logged after this should be "connection.incoming.closed", as the SSH connection was already "accepted". Mutually exclusive with "uplink.incoming.accepted" and "uplink.incoming.closed". |Uplink session id{nbsp} [small]#__(session_id)__# |The Uplink-specific session id.
|SSH connection id{nbsp} [small]#__(connection_id)__# |The SSH connection id for correlation with "connection.incoming.*" events.
|Client software id{nbsp} [small]#__(client_version)__# |The software version of the Uplink client; includes information about the client software used (e.g., "rce/...").
|Protocol version{nbsp} [small]#__(protocol_version)__# |The protocol version requested by the client. May or may not be a version that this server supports.
|Original login name{nbsp} [small]#__(login_name)__# |The login name used by the client, without any mapping modification that would have been made on success.
|Original client id{nbsp} [small]#__(client_id)__# |The client id sent by the client, without any mapping modification that would have been made on success.
|Reason{nbsp} [small]#__(reason)__# |The human-readable reason for refusing the Uplink session.
.3+|*Incoming Uplink Connection Closed* +
[small]#__(uplink.incoming.closed)__#

After a previous "uplink.incoming.accepted" event, this indicates the end of the application-level Uplink session. This event should be logged for any kind of connection termination, from graceful disconnect to low-level connection errors. Mutually exclusive with "uplink.incoming.refused". |Uplink session id{nbsp} [small]#__(session_id)__# |The Uplink-specific session id.
|SSH connection id{nbsp} [small]#__(connection_id)__# |The SSH connection id for correlation with "connection.incoming.*" events.
|Final connection state{nbsp} [small]#__(final_state)__# |The final (technical) state of the Uplink connection; indicates the reason for terminating the session.
.5+|*Network Node Discovered/Named* +
[small]#__(network.node.named)__#

Either a new node in the logical RCE network has been discovered, or an existing node has changed its title. Relevant for determining which technical node was behind a given display name at a certain time. Besides general logging, this is also a basic security trail for potential node "impersonation" attempts. |Persistent instance id{nbsp} [small]#__(instance_id)__# |The persistent part (the "instance node id") of the logical RCE-specific network address.
|Instance session id{nbsp} [small]#__(session_id)__# |The per-session suffix of the of the logical RCE-specific network address. Used to distinguish runs of the same instance, i.e., the session id always changes on an instance's restart.
|Logical sub-node id{nbsp} [small]#__(logical_sub_node_id)__# |The logical "sub-node" selector within the logical RCE-specific network address. If absent, then this event represents a change of the "root" name of an instance/node. If present, then a logical "sub-node" has changed its specific name, while the "root" name was unchanged. +
[small]#__(optional)__#
|Announced name{nbsp} [small]#__(name)__# |The title/name of the RCE instance, as defined by its user or administrator.
|Is local/own node{nbsp} [small]#__(is_local_node)__# |\"yes\" if the observed node is the local node. This is a convenience property to simplify event filtering. +
Possible values: __yes__, __no__ +
[small]#__(optional, derived)__#
.6+|*Workflow Request Initiated (Request Sent)* +
[small]#__(workflow.request.initiated)__#

A workflow run was initiated from the local node. The designated workflow controller may be either the local or a remote node. |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Workflow controller node{nbsp} [small]#__(workflow_controller_node)__# |The logical node id of the node designated to run the workflow controller.
|Controller is local{nbsp} [small]#__(workflow_controller_is_local_node)__# |A convenience attribute designating whether the workflow controller node is the local node. +
Possible values: __yes__, __no__ +
[small]#__(derived)__#
|Workflow file path{nbsp} [small]#__(local_workflow_file)__# |The path of the local workflow file that was submitted for execution, if applicable; OTHERWISE absent. +
[small]#__(optional)__#
|Workflow metadata (WIP){nbsp} [small]#__(workflow_metadata)__# |TODO specify contents; structured data
|success{nbsp} [small]#__(success)__# |Whether the workflow was successfully initiated, i.e., whether the request was made and accepted by the designated execution node. +
Possible values: __yes__, __no__
.6+|*Workflow Execution Requested (Request Received)* +
[small]#__(workflow.execution.requested)__#

A workflow run was requested, and an attempt was made to initialize its workflow controller on the local node. If controller initialization fails, this event MUST still be logged to make the request visible, as the ".initiated" event may have been logged be on a remote node. |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Start timestamp{nbsp} [small]#__(start_ts)__# |On success, the canonical start time of the workflow, which will usually be close, but not necessarily equal to the timestamp of this event; OTHERWISE absent. (TODO specify format) +
[small]#__(optional)__#
|Initiator node{nbsp} [small]#__(initiator_node)__# |The logical session node id of the node that initiated this workflow run. Note that in RCE 10.x and earlier, this value is NOT strongly verified, and should be considered informational only.
|Initiator is local{nbsp} [small]#__(initiator_is_local_node)__# |A convenience attribute designating whether the node that initiated this workflow run is the local node. Note that in RCE 10.x and earlier, this value is NOT strongly verified, and should be considered informational only. +
Possible values: __yes__, __no__ +
[small]#__(derived)__#
|Workflow metadata (WIP){nbsp} [small]#__(workflow_metadata)__# |TODO specify contents; structured data
|success{nbsp} [small]#__(success)__# |Whether the workflow was successfully initialized. +
Possible values: __yes__, __no__
.4+|*Workflow Execution Completed* +
[small]#__(workflow.execution.completed)__#

The end of a local workflow controller's execution. (TODO clarify whether this may be logged on a failed ".requested" event or not.). |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|End timestamp{nbsp} [small]#__(end_ts)__# |The canonical end time of the workflow, which will usually be close, but not necessarily equal to the timestamp of this event. (TODO specify format)
|Duration{nbsp} [small]#__(duration)__# |A convenience attribute specifying the duration of this workflow run. (TODO specify format) +
[small]#__(derived)__#
|Final workflow state{nbsp} [small]#__(final_state)__# |The final state of the workflow, as defined by the workflow engine. +
Possible values: __FINISHED__, __CANCELLED__, __FAILED__, __RESULTS_REJECTED__
.2+|*Workflow Request Completed* +
[small]#__(workflow.request.completed)__#

The final event of a workflow run that was initiated by the local node. (TODO clarify whether this may be logged on a failed ".initiate" event or not.). |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Final workflow state{nbsp} [small]#__(final_state)__# |The final state of the workflow, as defined by the workflow engine. +
Possible values: __FINISHED__, __CANCELLED__, __FAILED__, __RESULTS_REJECTED__
.4+|*Component/Tool Execution Initiated (Request Sent)* +
[small]#__(component.request.initiated)__#

A workflow component run was initiated from the local node, which is always the workflow controller. The node controlling the component's execution may be the local or a remote one. |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Component run id{nbsp} [small]#__(component_run_id)__# |The id string assigned to this component run. Unique within the scope of the associated workflow.
|Executing node{nbsp} [small]#__(execution_controller_node)__# |The logical session node id of the node designated to be this component run's execution controller.
|Executing node is local{nbsp} [small]#__(execution_controller_is_local_node)__# |A convenience attribute designating whether this component's run execution controller node is the local node. +
Possible values: __yes__, __no__ +
[small]#__(derived)__#
.5+|*Component/Tool Execution Requested* +
[small]#__(component.execution.requested)__#

A workflow component run was requested, and an attempt was made to initialize its controller on the local node. If controller initialization fails, this event MUST still be logged to make the request visible, as the ".initiated" event may have been logged be on a remote workflow controller node. |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Component run id{nbsp} [small]#__(component_run_id)__# |The id string assigned to this component run. Unique within the scope of the associated workflow.
|Workflow controller node{nbsp} [small]#__(workflow_controller_node)__# |The logical session node id of the node running the workflow controller. Note that in RCE 10.x and earlier, this value is NOT strongly verified, and should be considered informational only.
|Workflow contr. is local{nbsp} [small]#__(workflow_controller_is_local_node)__# |A convenience attribute designating whether the workflow controller node is the local node. Note that in RCE 10.x and earlier, this value is NOT strongly verified, and should be considered informational only.
|Start timestamp{nbsp} [small]#__(start_ts)__# |On success, the canonical start time of the component run, which will usually be close, but not necessarily equal to the timestamp of this event; OTHERWISE absent. (TODO specify format) +
[small]#__(optional)__#
.5+|*Component/Tool Execution Completed* +
[small]#__(component.execution.completed)__#

The end of a local workflow controller's execution. (TODO clarify whether this may be logged on a failed ".requested" event or not.). |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Component run id{nbsp} [small]#__(component_run_id)__# |The id string assigned to this component run. Unique within the scope of the associated workflow.
|End timestamp{nbsp} [small]#__(end_ts)__# |The canonical end time of the component run, which will usually be close, but not necessarily equal to the timestamp of this event. (TODO specify format)
|Duration{nbsp} [small]#__(duration)__# |A convenience attribute specifying the wall-clock duration of this component run. (TODO specify format) +
[small]#__(derived)__#
|Final component state{nbsp} [small]#__(final_state)__# |The final state of the component, as defined by the workflow engine. +
Possible values: __FINISHED__, __CANCELLED__, __FAILED__, __RESULTS_REJECTED__
.5+|*Component/Tool Execution Request Completed* +
[small]#__(component.request.completed)__#

The final event of a component run that was initiated by a workflow controller running on the local node. (TODO clarify whether this may be logged on a failed ".initiate" event or not.). |Workflow run id{nbsp} [small]#__(workflow_run_id)__# |The id string assigned to this workflow run. Can be considered globally unique for all practical purposes.
|Component run id{nbsp} [small]#__(component_run_id)__# |The id string assigned to this component run. Unique within the scope of the associated workflow.
|End timestamp{nbsp} [small]#__(end_ts)__# |The canonical end time of the component run, which will usually be close, but not necessarily equal to the timestamp of this event. (TODO specify format)
|Duration{nbsp} [small]#__(duration)__# |A convenience attribute specifying the wall-clock duration of this component run. (TODO specify format) +
[small]#__(derived)__#
|Final component state{nbsp} [small]#__(final_state)__# |The final state of the component, as defined by the workflow engine. +
Possible values: __FINISHED__, __CANCELLED__, __FAILED__, __RESULTS_REJECTED__
.3+|*Login/Account Data Initialized* +
[small]#__(accounts.initialized)__#

A set of accounts has been initialized, typically at application or subsystem startup. |Account type{nbsp} [small]#__(type)__# |The type of accounts that were initialized, e.g. "ssh". +
Possible values: __ssh__
|New number of accounts{nbsp} [small]#__(number_of_accounts)__# |Indicates the total number of registered accounts after initialization.
|Account data origin{nbsp} [small]#__(origin)__# |Indicates the data source from which the initial account data was read. Absent if not applicable for the current account type. +
[small]#__(optional)__#
.3+|*Login/Account Data Updated* +
[small]#__(accounts.updated)__#

A set of accounts has been updated at application runtime, after being already initialized. |Account type{nbsp} [small]#__(type)__# |The type of accounts that were updated, e.g. "ssh". +
Possible values: __ssh__
|New number of accounts{nbsp} [small]#__(number_of_accounts)__# |Indicates the total number of registered accounts after the update (NOT the number of changes!).
|Account data origin{nbsp} [small]#__(origin)__# |Indicates the data source from which the updated account data was read. Absent if not applicable for the current account type. +
[small]#__(optional)__#
.5+|*System Monitoring Initialized* +
[small]#__(sysmon.initialized)__#

Indicates that the system monitoring subsystem was initialized and logs static system information. |Java process id{nbsp} [small]#__(jvm_pid)__# |The PID of the main process running the JVM. Depending on the operating system, this process may either be the RCE executable or a separate Java process.
|Processor count (JVM){nbsp} [small]#__(jvm_processor_count)__# |The number of processors, as reported by the JVM.
|Heap limit (JVM){nbsp} [small]#__(jvm_heap_limit)__# |The configured heap (Java RAM) limit, as reported by the JVM.
|System RAM (native){nbsp} [small]#__(system_total_ram)__# |The total system RAM in bytes, as reported by the system monitoring library.
|Logical CPUs (native){nbsp} [small]#__(system_logical_cpus)__# |The number of "logical CPUs", as reported by the system monitoring library.
.1+|*Custom Event* +
[small]#__(custom)__#

A custom event type, allowing extensions or plugins to make use of the event logging system. This event type is special in the way that its list of attributes is not pre-defined, except for "type". This allows custom events to log all kinds of extra attributes. Consequently, any event log validation code must have a special rule to accept those attributes. Note that while custom attribute keys are supported, there are still certain rules for them. For now, they must start with a-z, end with a-z or a digit, and not exceed the maximum length defined above. It is also recommended to keep them lowercase and dot-separated for consistency. |Custom event type id{nbsp} [small]#__(type)__# |A custom type id describing the logged event. It should generally follow the naming pattern of the standard events, and plugins/extensions should strive to make those ids collision-free.
|=======================
