<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22960">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">logging: Allow prefixing thread ID to each log line<br><br>Change-Id: I38fc93ab0182b4edbd639c7ed0f31ce51964ee18<br>---<br>M include/osmocom/core/logging.h<br>M src/logging.c<br>M src/vty/logging_vty.c<br>M tests/logging/logging_vty_test.vty<br>4 files changed, 45 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/60/22960/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h</span><br><span>index c7f89de..4361cad 100644</span><br><span>--- a/include/osmocom/core/logging.h</span><br><span>+++ b/include/osmocom/core/logging.h</span><br><span>@@ -281,6 +281,8 @@</span><br><span>     unsigned int use_color:1;</span><br><span>    /*! should log messages be prefixed with a timestamp? */</span><br><span>     unsigned int print_timestamp:1;</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! should log messages be prefixed with the logger Thread ID? */</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int print_tid:1;</span><br><span>    /*! DEPRECATED: use print_filename2 instead. */</span><br><span>      unsigned int print_filename:1;</span><br><span>       /*! should log messages be prefixed with a category name? */</span><br><span>@@ -374,6 +376,7 @@</span><br><span> void log_set_use_color(struct log_target *target, int);</span><br><span> void log_set_print_extended_timestamp(struct log_target *target, int);</span><br><span> void log_set_print_timestamp(struct log_target *target, int);</span><br><span style="color: hsl(120, 100%, 40%);">+void log_set_print_tid(struct log_target *target, int);</span><br><span> void log_set_print_filename(struct log_target *target, int);</span><br><span> void log_set_print_filename2(struct log_target *target, enum log_filename_type lft);</span><br><span> void log_set_print_filename_pos(struct log_target *target, enum log_filename_pos pos);</span><br><span>diff --git a/src/logging.c b/src/logging.c</span><br><span>index a40008e..c2a0453 100644</span><br><span>--- a/src/logging.c</span><br><span>+++ b/src/logging.c</span><br><span>@@ -64,6 +64,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/thread.h></span><br><span> </span><br><span> #include <osmocom/vty/logging.h>     /* for LOGGING_STR. */</span><br><span> </span><br><span>@@ -83,6 +84,8 @@</span><br><span> void *tall_log_ctx = NULL;</span><br><span> LLIST_HEAD(osmo_log_target_list);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static __thread long int logging_tid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if (!EMBEDDED)</span><br><span> /*! This mutex must be held while using osmo_log_target_list or any of its</span><br><span>   log_targets in a multithread program. Prevents race conditions between threads</span><br><span>@@ -473,6 +476,14 @@</span><br><span>                   buf[offset + ret - 1] = ' ';</span><br><span>                         OSMO_SNPRINTF_RET(ret, rem, offset, len);</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (target->print_tid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (logging_tid == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                         logging_tid = (long int)osmo_gettid();</span><br><span style="color: hsl(120, 100%, 40%);">+                        ret = snprintf(buf + offset, rem, "%ld ", logging_tid);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                               goto err;</span><br><span style="color: hsl(120, 100%, 40%);">+                     OSMO_SNPRINTF_RET(ret, rem, offset, len);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            if (target->print_category) {</span><br><span>                     ret = snprintf(buf + offset, rem, "%s%s%s%s ",</span><br><span>                                    target->use_color ? level_color(level) : "",</span><br><span>@@ -778,6 +789,15 @@</span><br><span>      target->print_ext_timestamp = print_timestamp;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Enable or disable printing of timestamps while logging</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] target Log target to be affected</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] print_tid Enable (1) or disable (0) Thread ID logging</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void log_set_print_tid(struct log_target *target, int print_tid)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       target->print_tid = print_tid;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Use log_set_print_filename2() instead.</span><br><span>  * Call log_set_print_filename2() with LOG_FILENAME_PATH or LOG_FILENAME_NONE, *as well as* call</span><br><span>  * log_set_print_category_hex() with the argument passed to this function. This is to mirror legacy</span><br><span>@@ -917,6 +937,7 @@</span><br><span>        /* global settings */</span><br><span>        target->use_color = 1;</span><br><span>    target->print_timestamp = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       target->print_tid = 0;</span><br><span>    target->print_filename2 = LOG_FILENAME_PATH;</span><br><span>      target->print_category_hex = true;</span><br><span> </span><br><span>diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c</span><br><span>index 6a7a8f4..48b039b 100644</span><br><span>--- a/src/vty/logging_vty.c</span><br><span>+++ b/src/vty/logging_vty.c</span><br><span>@@ -225,6 +225,22 @@</span><br><span>    RET_WITH_UNLOCK(CMD_SUCCESS);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(logging_prnt_tid,</span><br><span style="color: hsl(120, 100%, 40%);">+      logging_prnt_tid_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "logging print thread-id (0|1)",</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGGING_STR "Log output settings\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Configure log message logging Thread ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Don't prefix each log message\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Prefix each log message with current Thread ID\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct log_target *tgt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ACQUIRE_VTY_LOG_TGT_WITH_LOCK(vty, tgt);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    log_set_print_tid(tgt, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+        RET_WITH_UNLOCK(CMD_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(logging_prnt_cat,</span><br><span>       logging_prnt_cat_cmd,</span><br><span>       "logging print category (0|1)",</span><br><span>@@ -1003,6 +1019,8 @@</span><br><span>              tgt->print_category_hex ? 1 : 0, VTY_NEWLINE);</span><br><span>    vty_out(vty, " logging print category %d%s",</span><br><span>               tgt->print_category ? 1 : 0, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " logging print thread-id %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+               tgt->print_tid ? 1 : 0, VTY_NEWLINE);</span><br><span>     if (tgt->print_ext_timestamp)</span><br><span>             vty_out(vty, " logging print extended-timestamp 1%s", VTY_NEWLINE);</span><br><span>        else</span><br><span>@@ -1134,6 +1152,7 @@</span><br><span>         install_lib_element_ve(&logging_use_clr_cmd);</span><br><span>    install_lib_element_ve(&logging_prnt_timestamp_cmd);</span><br><span>     install_lib_element_ve(&logging_prnt_ext_timestamp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_lib_element_ve(&logging_prnt_tid_cmd);</span><br><span>   install_lib_element_ve(&logging_prnt_cat_cmd);</span><br><span>   install_lib_element_ve(&logging_prnt_cat_hex_cmd);</span><br><span>       install_lib_element_ve(&logging_prnt_level_cmd);</span><br><span>@@ -1168,6 +1187,7 @@</span><br><span>         install_lib_element(CFG_LOG_NODE, &logging_use_clr_cmd);</span><br><span>         install_lib_element(CFG_LOG_NODE, &logging_prnt_timestamp_cmd);</span><br><span>  install_lib_element(CFG_LOG_NODE, &logging_prnt_ext_timestamp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_lib_element(CFG_LOG_NODE, &logging_prnt_tid_cmd);</span><br><span>        install_lib_element(CFG_LOG_NODE, &logging_prnt_cat_cmd);</span><br><span>        install_lib_element(CFG_LOG_NODE, &logging_prnt_cat_hex_cmd);</span><br><span>    install_lib_element(CFG_LOG_NODE, &logging_prnt_level_cmd);</span><br><span>diff --git a/tests/logging/logging_vty_test.vty b/tests/logging/logging_vty_test.vty</span><br><span>index dd2db63..82db2cc 100644</span><br><span>--- a/tests/logging/logging_vty_test.vty</span><br><span>+++ b/tests/logging/logging_vty_test.vty</span><br><span>@@ -48,6 +48,7 @@</span><br><span>   logging color (0|1)</span><br><span>   logging timestamp (0|1)</span><br><span>   logging print extended-timestamp (0|1)</span><br><span style="color: hsl(120, 100%, 40%);">+  logging print thread-id (0|1)</span><br><span>   logging print category (0|1)</span><br><span>   logging print category-hex (0|1)</span><br><span>   logging print level (0|1)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22960">change 22960</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/22960"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I38fc93ab0182b4edbd639c7ed0f31ce51964ee18 </div>
<div style="display:none"> Gerrit-Change-Number: 22960 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>