LCOV - code coverage report
Current view: top level - zephyr/logging - log_output.h Coverage Total Hit
Test: new.info Lines: 67.6 % 37 25
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2018 Nordic Semiconductor ASA
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_LOGGING_LOG_OUTPUT_H_
       7              : #define ZEPHYR_INCLUDE_LOGGING_LOG_OUTPUT_H_
       8              : 
       9              : #include <zephyr/logging/log_msg.h>
      10              : #include <zephyr/sys/util.h>
      11              : #include <stdarg.h>
      12              : #include <zephyr/sys/atomic.h>
      13              : #include <zephyr/kernel.h>
      14              : 
      15              : #ifdef __cplusplus
      16              : extern "C" {
      17              : #endif
      18              : 
      19              : /**
      20              :  * @brief Log output API
      21              :  * @defgroup log_output Log output API
      22              :  * @ingroup logger
      23              :  * @{
      24              :  */
      25              : 
      26              : /**@defgroup LOG_OUTPUT_FLAGS Log output formatting flags.
      27              :  * @{
      28              :  */
      29              : 
      30              : /** @brief Flag forcing ANSI escape code colors, red (errors), yellow
      31              :  *         (warnings).
      32              :  */
      33            1 : #define LOG_OUTPUT_FLAG_COLORS                  BIT(0)
      34              : 
      35              : /** @brief Flag forcing timestamp */
      36            1 : #define LOG_OUTPUT_FLAG_TIMESTAMP               BIT(1)
      37              : 
      38              : /** @brief Flag forcing timestamp formatting. */
      39            1 : #define LOG_OUTPUT_FLAG_FORMAT_TIMESTAMP        BIT(2)
      40              : 
      41              : /** @brief Flag forcing severity level prefix. */
      42            1 : #define LOG_OUTPUT_FLAG_LEVEL                   BIT(3)
      43              : 
      44              : /** @brief Flag preventing the logger from adding CR and LF characters. */
      45            1 : #define LOG_OUTPUT_FLAG_CRLF_NONE               BIT(4)
      46              : 
      47              : /** @brief Flag forcing a single LF character for line breaks. */
      48            1 : #define LOG_OUTPUT_FLAG_CRLF_LFONLY             BIT(5)
      49              : 
      50              : /** @brief Flag forcing syslog format specified in RFC 5424
      51              :  */
      52            1 : #define LOG_OUTPUT_FLAG_FORMAT_SYSLOG           BIT(6)
      53              : 
      54              : /** @brief Flag thread id or name prefix. */
      55            1 : #define LOG_OUTPUT_FLAG_THREAD                  BIT(7)
      56              : 
      57              : /** @brief Flag forcing to skip logging the source. */
      58            1 : #define LOG_OUTPUT_FLAG_SKIP_SOURCE             BIT(8)
      59              : 
      60              : /**@} */
      61              : 
      62              : /** @brief Supported backend logging format types for use
      63              :  * with log_format_set() API to switch log format at runtime.
      64              :  */
      65            1 : #define LOG_OUTPUT_TEXT 0
      66              : 
      67            0 : #define LOG_OUTPUT_SYST 1
      68              : 
      69            0 : #define LOG_OUTPUT_DICT 2
      70              : 
      71            0 : #define LOG_OUTPUT_CUSTOM 3
      72              : 
      73              : /**
      74              :  * @brief Prototype of the function processing output data.
      75              :  *
      76              :  * @param buf The buffer data.
      77              :  * @param size The buffer size.
      78              :  * @param ctx User context.
      79              :  *
      80              :  * @return Number of bytes processed, dropped or discarded.
      81              :  *
      82              :  * @note If the log output function cannot process all of the data, it is
      83              :  *       its responsibility to mark them as dropped or discarded by returning
      84              :  *       the corresponding number of bytes dropped or discarded to the caller.
      85              :  */
      86            1 : typedef int (*log_output_func_t)(uint8_t *buf, size_t size, void *ctx);
      87              : 
      88              : /* @brief Control block structure for log_output instance.  */
      89            0 : struct log_output_control_block {
      90            0 :         atomic_t offset;
      91            0 :         void *ctx;
      92            0 :         const char *hostname;
      93              : };
      94              : 
      95              : /** @brief Log_output instance structure. */
      96            1 : struct log_output {
      97            0 :         log_output_func_t func;
      98            0 :         struct log_output_control_block *control_block;
      99            0 :         uint8_t *buf;
     100            0 :         size_t size;
     101              : };
     102              : 
     103              : /**
     104              :  * @brief Typedef of the function pointer table "format_table".
     105              :  *
     106              :  * @param output Pointer to log_output struct.
     107              :  * @param msg Pointer to log_msg struct.
     108              :  * @param flags Flags used for text formatting options.
     109              :  *
     110              :  * @return Function pointer based on Kconfigs defined for backends.
     111              :  */
     112            1 : typedef void (*log_format_func_t)(const struct log_output *output,
     113              :                                         struct log_msg *msg, uint32_t flags);
     114              : 
     115              : /**
     116              :  * @brief Declaration of the get routine for function pointer table format_table.
     117              :  */
     118            1 : log_format_func_t log_format_func_t_get(uint32_t log_type);
     119              : 
     120              : /** @brief Create log_output instance.
     121              :  *
     122              :  * @param _name Instance name.
     123              :  * @param _func Function for processing output data.
     124              :  * @param _buf  Pointer to the output buffer.
     125              :  * @param _size Size of the output buffer.
     126              :  */
     127            1 : #define LOG_OUTPUT_DEFINE(_name, _func, _buf, _size)                    \
     128              :         static struct log_output_control_block _name##_control_block;   \
     129              :         static const struct log_output _name = {                        \
     130              :                 .func = _func,                                          \
     131              :                 .control_block = &_name##_control_block,            \
     132              :                 .buf = _buf,                                            \
     133              :                 .size = _size,                                          \
     134              :         }
     135              : 
     136              : /** @brief Process log messages v2 to readable strings.
     137              :  *
     138              :  * Function is using provided context with the buffer and output function to
     139              :  * process formatted string and output the data.
     140              :  *
     141              :  * @param log_output Pointer to the log output instance.
     142              :  * @param msg Log message.
     143              :  * @param flags Optional flags. See @ref LOG_OUTPUT_FLAGS.
     144              :  */
     145            1 : void log_output_msg_process(const struct log_output *log_output,
     146              :                             struct log_msg *msg, uint32_t flags);
     147              : 
     148              : /** @brief Process input data to a readable string.
     149              :  *
     150              :  * @param log_output    Pointer to the log output instance.
     151              :  * @param timestamp     Timestamp.
     152              :  * @param domain        Domain name string. Can be NULL.
     153              :  * @param source        Source name string. Can be NULL.
     154              :  * @param tid           Thread ID.
     155              :  * @param level         Criticality level.
     156              :  * @param package       Cbprintf package with a logging message string.
     157              :  * @param data          Data passed to hexdump API. Can be NULL.
     158              :  * @param data_len      Data length.
     159              :  * @param flags         Formatting flags. See @ref LOG_OUTPUT_FLAGS.
     160              :  */
     161            1 : void log_output_process(const struct log_output *log_output,
     162              :                         log_timestamp_t timestamp,
     163              :                         const char *domain,
     164              :                         const char *source,
     165              :                         k_tid_t tid,
     166              :                         uint8_t level,
     167              :                         const uint8_t *package,
     168              :                         const uint8_t *data,
     169              :                         size_t data_len,
     170              :                         uint32_t flags);
     171              : 
     172              : /** @brief Process log messages v2 to SYS-T format.
     173              :  *
     174              :  * Function is using provided context with the buffer and output function to
     175              :  * process formatted string and output the data in sys-t log output format.
     176              :  *
     177              :  * @param log_output Pointer to the log output instance.
     178              :  * @param msg Log message.
     179              :  * @param flags Optional flags. See @ref LOG_OUTPUT_FLAGS.
     180              :  */
     181            1 : void log_output_msg_syst_process(const struct log_output *log_output,
     182              :                                   struct log_msg *msg, uint32_t flags);
     183              : 
     184              : /** @brief Process dropped messages indication.
     185              :  *
     186              :  * Function prints error message indicating lost log messages.
     187              :  *
     188              :  * @param output Pointer to the log output instance.
     189              :  * @param cnt        Number of dropped messages.
     190              :  */
     191            1 : void log_output_dropped_process(const struct log_output *output, uint32_t cnt);
     192              : 
     193              : /** @brief Write to the output buffer.
     194              :  *
     195              :  * @param outf Output function.
     196              :  * @param buf  Buffer.
     197              :  * @param len  Buffer length.
     198              :  * @param ctx  Context passed to the %p outf.
     199              :  */
     200            1 : static inline void log_output_write(log_output_func_t outf, uint8_t *buf, size_t len, void *ctx)
     201              : {
     202              :         int processed;
     203              : 
     204              :         while (len != 0) {
     205              :                 processed = outf(buf, len, ctx);
     206              :                 len -= processed;
     207              :                 buf += processed;
     208              :         }
     209              : }
     210              : 
     211              : /** @brief Flush output buffer.
     212              :  *
     213              :  * @param output Pointer to the log output instance.
     214              :  */
     215            1 : static inline void log_output_flush(const struct log_output *output)
     216              : {
     217              :         log_output_write(output->func, output->buf, output->control_block->offset,
     218              :                          output->control_block->ctx);
     219              :         output->control_block->offset = 0;
     220              : }
     221              : 
     222              : /** @brief Function for setting user context passed to the output function.
     223              :  *
     224              :  * @param output        Pointer to the log output instance.
     225              :  * @param ctx           User context.
     226              :  */
     227            1 : static inline void log_output_ctx_set(const struct log_output *output,
     228              :                                       void *ctx)
     229              : {
     230              :         output->control_block->ctx = ctx;
     231              : }
     232              : 
     233              : /** @brief Function for setting hostname of this device
     234              :  *
     235              :  * @param output        Pointer to the log output instance.
     236              :  * @param hostname      Hostname of this device
     237              :  */
     238            1 : static inline void log_output_hostname_set(const struct log_output *output,
     239              :                                            const char *hostname)
     240              : {
     241              :         output->control_block->hostname = hostname;
     242              : }
     243              : 
     244              : /** @brief Set timestamp frequency.
     245              :  *
     246              :  * @param freq Frequency in Hz.
     247              :  */
     248            1 : void log_output_timestamp_freq_set(uint32_t freq);
     249              : 
     250              : /** @brief Convert timestamp of the message to us.
     251              :  *
     252              :  * @param timestamp Message timestamp
     253              :  *
     254              :  * @return Timestamp value in us.
     255              :  */
     256            1 : uint64_t log_output_timestamp_to_us(log_timestamp_t timestamp);
     257              : 
     258              : /**
     259              :  * @}
     260              :  */
     261              : 
     262              : 
     263              : #ifdef __cplusplus
     264              : }
     265              : #endif
     266              : 
     267              : #endif /* ZEPHYR_INCLUDE_LOGGING_LOG_OUTPUT_H_ */
        

Generated by: LCOV version 2.0-1