From a0009c807eb6ad01ea0827b2b14ea3bd433ddc69 Mon Sep 17 00:00:00 2001
From: Mark Murawski <markm@intellasoft.net>
Date: Fri, 19 Mar 2021 10:11:26 -0400
Subject: [PATCH] logger: Console sessions will now respect logger.conf
 dateformat= option

The 'core' console (ie: asterisk -c) does read logger.conf and does
use the dateformat= option.

Whereas 'remote' consoles (ie: asterisk -r -T) does not read logger.conf
and uses a hard coded dateformat option for printing received verbose messages:
  main/logger.c: static char dateformat[256] = "%b %e %T"

This change will load logger.conf for each remote console session and
use the dateformat= option to set the per-line timestamp for verbose messages

Change-Id: I3ea10990dbd920e9f7ce8ff771bc65aa7f4ea8c1
ASTERISK-25358: #close
Reported-by: Igor Liferenko
---
 doc/CHANGES-staging/logger_dateformat.txt | 47 +++++++++++++++++++++++
 include/asterisk/logger.h                 |  5 +++
 main/asterisk.c                           |  2 +
 main/logger.c                             | 17 ++++++++
 4 files changed, 71 insertions(+)
 create mode 100644 doc/CHANGES-staging/logger_dateformat.txt

diff --git a/doc/CHANGES-staging/logger_dateformat.txt b/doc/CHANGES-staging/logger_dateformat.txt
new file mode 100644
index 0000000000..efeb11803d
--- /dev/null
+++ b/doc/CHANGES-staging/logger_dateformat.txt
@@ -0,0 +1,47 @@
+Subject: logger
+
+The dateformat option in logger.conf will now control the remote
+console (asterisk -r -T) timestamp format.  Previously, dateformat only
+controlled the formatting of the timestamp going to log files and the
+main console (asterisk -c) but only for non-verbose messages.
+
+Internally, Asterisk does not send the logging timestamp with verbose
+messages to console clients. It's up to the Asterisk remote consoles
+to format verbose messages.  Asterisk remote consoles previously did
+not load dateformat from logger.conf.
+
+Previously there was a non-configurable and hard-coded "%b %e %T"
+dateformat that would be used no matter what on all verbose console
+messages printed on remote consoles.
+
+Example:
+logger.conf
+ dateformat=%F %T.%3q
+
+# asterisk -rvvv -T
+[2021-03-19 09:54:19.760-0400]  Loading res_stasis_answer.so.
+[Mar 19 09:55:43]     -- Goto (dialExten,s,1)
+
+Given the following example configuration in logger.conf, Asterisk log
+files and the console, will log verbose messages using the given
+timestamp.  Now ensuring that all remote console messages are logged
+with the same dateformat as other log streams.
+
+---
+[general]
+dateformat=%F %T.%3q
+
+[logfiles]
+console  => notice,warning,error,verbose
+full     => notice,warning,error,debug,verbose
+---
+
+Now we have a globally-defined dateformat that will be used
+consistently across the Asterisk main console, remote consoles, and
+log files.
+
+Now we have consistent logging:
+
+# asterisk -rvvv -T
+[2021-03-19 09:54:19.760-0400]  Loading res_stasis_answer.so.
+[2021-03-19 09:55:43.920-0400]     -- Goto (dialExten,s,1)
diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h
index 6ab55f76da..d823ed4e44 100644
--- a/include/asterisk/logger.h
+++ b/include/asterisk/logger.h
@@ -621,6 +621,11 @@ an entry/exit message.  To do so, you can use the ast_trace macros...
  */
 unsigned int ast_trace_get_by_module(const char *module);
 
+/*!
+ * \brief load logger.conf configuration for console socket connections
+ */
+void ast_init_logger_for_socket_console(void);
+
 #define TRACE_ATLEAST(level) \
 	(option_trace >= (level) \
 		|| (ast_opt_trace_module \
diff --git a/main/asterisk.c b/main/asterisk.c
index b42e5963aa..f53c7810e9 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -3254,6 +3254,8 @@ static void ast_remotecontrol(char *data)
 	}
 
 	ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid);
+	ast_init_logger_for_socket_console();
+
 	remotehostname = hostname;
 	if (el_hist == NULL || el == NULL)
 		ast_el_initialize();
diff --git a/main/logger.c b/main/logger.c
index 5562bf37eb..457a6fb53d 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -679,6 +679,23 @@ static struct logchannel *make_logchannel(const char *channel, const char *compo
 	return chan;
 }
 
+void ast_init_logger_for_socket_console(void)
+{
+	struct ast_config *cfg;
+	const char *s;
+	struct ast_flags config_flags = { 0 };
+
+	if (!(cfg = ast_config_load2("logger.conf", "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
+		return;
+	}
+
+	if ((s = ast_variable_retrieve(cfg, "general", "dateformat"))) {
+		ast_copy_string(dateformat, s, sizeof(dateformat));
+	}
+
+	ast_config_destroy(cfg);
+}
+
 /*!
  * \brief Read config, setup channels.
  * \param altconf Alternate configuration file to read.
-- 
GitLab