# Logging and printf VSI runtime has a modular logging system. This functionality is available to software executables that have been built using the 'debug' runtime build type. To select this build type: 1. Open the VSI Context Parameters for the software context. 2. Select the 'Software Parameters' tab. 3. Under 'C/C++ options' set the Runtime Build Type to Debug. ![pic](/img/img_logging/set_runtime_build_type.png) #### Environment variables Before running the software application, logging must be turned on using the following environment variables: * VSI_LOG_LVL can be one of the following: CRIT, ERR, DBG, INFO, VERBOSE (case insensitive) * VSI_LOG_COMPS can be either ALL or a list of components (case insensitive) #### Examples * Enable logging for all components and maximum logging env VSI_LOG_LVL=verbose VSI_LOG_COMPS=all ./executable * Enable logging for all components and error logging only env VSI_LOG_LVL=err VSI_LOG_COMPS=all ./executable * Enable logging for inputs and outputs components and debug logging only env VSI_LOG_LVL=dbg VSI_LOG_COMPS=inputoutput ./executable * Enable logging for tcp_server_0_1 and Trace components and info logging env VSI_LOG_LVL=info VSI_LOG_COMPS=tcp_server_0_1trace ./executable ## printf and puts Often, printf and puts is used to debug C/C++ functions. In a multithreaded application with parallels paths, especially when debugging timing issues and parallel execution paradigms, it can become challenging to figure out which thread is printing. VSI Runtime adds a helper template to printf and puts. `{{tid}}` inside the formatting argument will be replaced by a unique ID for the current thread. For example, ``` printf("write to memory {{{tid}}}"); ``` will be printed as ``` write to memory {12AE} write to memory {A92F} ``` where 12AE and A92F are unique ids for two threads accessing the same function.