holoscan::DataLoggerResource
holoscan::DataLoggerResource
Base class for all data logger resources.
This class provides the core functionality for logging data to the console. Concrete implementations of this class should provide the actual logging functionality.
==Parameters ==
- log_inputs: bool (optional, default: true)
Globally enable or disable logging on input ports (InputContext::receive calls)
- Globally enable or disable logging on input ports (
InputContext::receivecalls)
- Globally enable or disable logging on input ports (
- log_outputs: bool (optional, default: true)
Globally enable or disable logging on output ports (OutputContext::emit calls)
- Globally enable or disable logging on output ports (
OutputContext::emitcalls)
- Globally enable or disable logging on output ports (
- log_metadata: bool (optional, default: true)
Globally enable or disable logging of MetadataDictionary contents
- Globally enable or disable logging of MetadataDictionary contents
- log_tensor_data_contents: bool (optional, default: true)
Enable logging of the contents of tensors, not just basic description information. Note that logging GPU tensor contents will have the overhead of a device to host data transfer.
- Enable logging of the contents of tensors, not just basic description information. Note that logging GPU tensor contents will have the overhead of a device to host data transfer.
- use_scheduler_clock: bool (optional, default: false)
Whether the get_timestamp() method uses the scheduler’s clock for timestamps (if false, uses system clock).
- Whether the
get_timestamp()method uses the scheduler’s clock for timestamps (if false, uses system clock).
- Whether the
- allowlist_patterns: std::vector<std::string> (optional, default: empty vector)
- denylist_patterns: std::vector<std::string> (optional, default: empty vector)
Note on allowlist/denylist pattern matching:
If allowlist_patterns or denylist_patterns are specified, they are applied to the unique_id assigned to messages by the underlying framework.
In a non-distributed application (without a fragment name), the unique_id for a message will have one of the following forms:
- operator_name.port_name
- operator_name.port_name:index (for multi-receivers with N:1 connection)
For distributed applications, the fragment name will also appear in the unique id:
- fragment_name.operator_name.port_name
- fragment_name.operator_name.port_name:index (for multi-receivers with N:1 connection)
The pattern matching logic is as follows:
- If
denylist patternsis not empty and there is a match, do not log it. - Next check if
allowlist_patternsis empty: If yes, return true (allow everything) If no, return true only if there is a match to at least one of the specified patterns.- If yes, return true (allow everything)
- If no, return true only if there is a match to at least one of the specified patterns.
Inherits from: holoscan::DataLogger (public), holoscan::Resource (public)
Constructors
DataLoggerResource
Move
Default
Destructor
~DataLoggerResource
Methods
setup
Defines parameters for the logging resource, including the serializer.
Parameters
The component specification.
log_data
Logs a message.
The unique_id for the message will have the form:
- operator_name.port_name
- operator_name.port_name:index (for multi-receivers with N:1 connection)
For distributed applications, the fragment name will also appear in the unique id:
- fragment_name.operator_name.port_name
- fragment_name.operator_name.port_name:index
Returns: true if logging (including serialization and sending) was successful, false otherwise.
Parameters
The data to log, passed as std::any.
A unique identifier for the message.
Timestamp when the data was acquired (-1 if unknown).
Associated metadata dictionary for the message.
The type of I/O port (kInput or kOutput).
Optional CUDA stream for GPU operations.
log_tensor_data
Logs a Tensor with optional data content logging.
This specialized method allows efficient logging of tensor metadata without the overhead of logging large tensor data arrays when only header information is needed.
The unique_id for the message will have the form:
- operator_name.port_name
- operator_name.port_name:index (for multi-receivers with N:1 connection)
For distributed applications, the fragment name will also appear in the unique id:
- fragment_name.operator_name.port_name
- fragment_name.operator_name.port_name:index
Returns: true if logging was successful, false otherwise.
Parameters
The Tensor to log.
A unique identifier for the message.
Timestamp when the data was acquired (-1 if unknown).
Associated metadata dictionary for the message.
The type of I/O port (kInput or kOutput).
Optional CUDA stream for GPU operations.
log_tensormap_data
Logs a TensorMap with optional data content logging.
This specialized method allows efficient logging of tensor map metadata without the overhead of logging large tensor data arrays when only header information is needed.
The unique_id for the message will have the form:
- operator_name.port_name
- operator_name.port_name:index (for multi-receivers with N:1 connection)
For distributed applications, the fragment name will also appear in the unique id:
- fragment_name.operator_name.port_name
- fragment_name.operator_name.port_name:index
Returns: true if logging was successful, false otherwise.
Parameters
The TensorMap to log.
A unique identifier for the message.
Timestamp when the data was acquired (-1 if unknown).
Associated metadata dictionary for the message.
The type of I/O port (kInput or kOutput).
Optional CUDA stream for GPU operations.
log_backend_specific
Logs backend-specific data types.
This method is called for logging backend-specific data types (intended for use with backends that have separate emit/receive codepaths for backend-specific types). The data parameter is kept as std::any here to avoid making the base interface specific to a particular backend, but a backend-specific concrete implementation should be provided as needed via run-time type checking.
A concrete example of a backend-specific type is the GXF Entity type which is a heterogeneous collection of components. An implementation of this method for GXF entities is provided in the concrete implementation of the GXFConsoleLogger.
The unique_id for the message will have the form:
- operator_name.port_name
- operator_name.port_name:index (for multi-receivers with N:1 connection)
For distributed applications, the fragment name will also appear in the unique id:
- fragment_name.operator_name.port_name
- fragment_name.operator_name.port_name:index
Returns: true if logging was successful, false if backend-specific logging is not supported.
Parameters
The backend-specific data to log, passed as std::any.
A unique identifier for the message.
Timestamp when the data was acquired (-1 if unknown).
Associated metadata dictionary for the message.
The type of I/O port (kInput or kOutput).
Optional CUDA stream for GPU operations.
should_log_message
Checks if a message with the given unique_id should be logged based on allowlist/denylist patterns.
This utility function implements the filtering logic:
- First check if
denylist patternsare specified and if there is a match, do not log it. - Next check if
allowlist_patternswere specified: If no, return true (allow everything) If yes, return true only if there is a match to the specified patterns.- If no, return true (allow everything)
- If yes, return true only if there is a match to the specified patterns.
Returns: true if the message should be logged, false otherwise.
Parameters
The unique identifier to check against patterns.
should_log_output
Checks if the logger should log output ports.
If False, the data logger will not be applied during op_input.emit() calls from Operator::compute.
Returns: true if the logger should log output ports, false otherwise.
should_log_input
Checks if the logger should log input ports.
If False, the data logger will not be applied during op_input.receive() calls from Operator::compute.
Returns: true if the logger should log input ports, false otherwise.
should_log_metadata
Checks if the logger should log metadata.
If False, the data logger will not log metadata for each operator.
Returns: true if the logger should log metadata, false otherwise.
should_log_tensor_data_content
Checks if the logger should log tensor data content.
If False, only tensor header information will be logged, not the actual data arrays. When true, the full tensor data is also logged.
Returns: true if the logger should log tensor data content, false otherwise.
get_timestamp
Get the current timestamp for logging operations.
This method is called internally by the logging functions to obtain timestamps for emit_timestamp (when io_type==IOSpec::IOType::kOutput) or receive_timestamp (when io_type==IOSpec::IOType::kInput). The default implementation provides high-resolution timestamps in microseconds since epoch. Implementations can override this to provide custom timing mechanisms as appropriate.
Returns: Current timestamp in microseconds since epoch, or -1 if not available.
initialize
Initialize the component.
This method is called only once when the component is created for the first time, and use of light-weight initialization.
shutdown
Shutdown the data logger.
This method should be called to properly shutdown the data logger, including stopping any background threads and releasing resources. The default implementation does nothing. Data loggers that use background threads or other resources should override this method to perform proper cleanup.
resource_type
Get the resource type.
Returns: The resource type.
name
Set the name of the resource (1)
Set the name of the resource (2)
Const
Set the name of the resource.
Returns: The reference to the resource.
Parameters
The name of the resource.
fragment
Set the fragment of the resource.
Returns: The reference to the resource.
Parameters
The pointer to the fragment of the resource.
spec
Set the component specification to the resource
Get the component specification of the resource
Set the component specification to the resource.
Returns: The reference to the resource.
Parameters
The component specification.
spec_shared
Get the shared pointer to the component spec.
Returns: The shared pointer to the component spec.
to_yaml_node
Get a YAML representation of the resource.
Returns: YAML node including spec of the resource in addition to the base component properties.
set_parameters
Set the parameters based on defaults (sets GXF parameters for GXF components).
id
Get the identifier of the component.
By default, the identifier is set to -1. It is set to a valid value when the component is initialized.
With the default executor (GXFExecutor), the identifier is set to the GXF component ID.
Returns: The identifier of the component.
add_arg
Add an argument to the component (1)
Add an argument to the component (2)
Add a list of arguments to the component (1)
Add a list of arguments to the component (2)
Add an argument to the component.
Parameters
The argument to add.
args
Get the list of arguments.
Returns: The vector of arguments.
description
Get a description of the component.
Returns: YAML string.
See also: to_yaml_node()
service
Retrieve a registered fragment service or resource.
Retrieves a previously registered fragment service or resource by its type and optional identifier. Returns nullptr if no service/resource is found with the specified type and identifier.
Note that any changes to the service retrieval logic in this method should be synchronized with the implementation in Fragment::service() method to maintain consistency.
Returns: The shared pointer to the service/resource, or nullptr if not found or if type casting fails.
Template parameters
The type of the service/resource to retrieve. Must inherit from either Resource or FragmentService. Defaults to DefaultFragmentService if not specified.
Parameters
The identifier of the service/resource. If empty, retrieves by type only.
get_service_by_type_info
Retrieve a registered fragment service or resource for Python bindings.
This is a helper method for Python bindings to retrieve a service by its C++ type info.
Returns: The shared pointer to the base service, or nullptr if not found.
Parameters
The type info of the service/resource to retrieve.
The identifier of the service/resource. If empty, retrieves by type only.
reset_backend_objects
Reset any backend-specific objects (e.g. GXF GraphEntity).
compile_patterns
Compiles string patterns into regex objects for efficient matching.
update_params_from_args
Update parameters based on the specified arguments
Update parameters based on the specified arguments (with params)
Update parameters based on the specified arguments.
service_provider
Set the service provider that owns this component.
Static methods
register_converter
Register the argument setter for the given type.
If an operator or resource has an argument with a custom type, the argument setter must be registered using this method.
The argument setter is used to set the value of the argument from the YAML configuration.
This method can be called in the initialization phase of the operator/resource (e.g., initialize()). The example below shows how to register the argument setter for the custom type (Vec3):
It is assumed that YAML::convert<T>::encode and YAML::convert<T>::decode are implemented for the given type. You need to specialize the YAML::convert<> template class.
For example, suppose that you had a Vec3 class with the following members:
You can define the YAML::convert<Vec3> as follows in a ‘.cpp’ file:
Please refer to the yaml-cpp documentation for more details.
Template parameters
The type of the argument to register.
Example
Example
Example
register_argument_setter
Register the argument setter for the given type.
Please refer to the documentation of register_converter() for more details.
Template parameters
The type of the argument to register.
Types
ResourceType
Resource type used for the initialization of the resource.