LCOV - code coverage report
Current view: top level - zephyr/logging - log_output.h Hit Total Coverage
Test: new.info Lines: 25 37 67.6 %
Date: 2024-12-22 00:14:23

          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 1.14