summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-12-02 05:37:38 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-12-02 05:37:38 -0600
commit197e4083950721861f4377ffb1d4a798a0fcbc0e (patch)
treeb41fefdddc203b56ab1bbee17c3e1e1563168ee0 /res
parenta2343aa20049f1d7174aa599b093a7206155cffb (diff)
parent1dfa11b65cd3bd768605eb7779214e4330f52ed3 (diff)
Merge "PJPROJECT logging: Made easier to get available logging levels."
Diffstat (limited to 'res')
-rw-r--r--res/res_pjproject.c145
-rw-r--r--res/res_rtp_asterisk.c2
2 files changed, 131 insertions, 16 deletions
diff --git a/res/res_pjproject.c b/res/res_pjproject.c
index 66c95f2b7..476defb41 100644
--- a/res/res_pjproject.c
+++ b/res/res_pjproject.c
@@ -41,6 +41,27 @@
<configInfo name="res_pjproject" language="en_US">
<synopsis>pjproject common configuration</synopsis>
<configFile name="pjproject.conf">
+ <configObject name="startup">
+ <synopsis>Asterisk startup time options for PJPROJECT</synopsis>
+ <description>
+ <note><para>The id of this object, as well as its type, must be
+ 'startup' or it won't be found.</para></note>
+ </description>
+ <configOption name="type">
+ <synopsis>Must be of type 'startup'.</synopsis>
+ </configOption>
+ <configOption name="log_level" default="2">
+ <synopsis>Initial maximum pjproject logging level to log.</synopsis>
+ <description>
+ <para>Valid values are: 0-6, and default</para>
+ <note><para>
+ This option is needed very early in the startup process
+ so it can only be read from config files because the
+ modules for other methods have not been loaded yet.
+ </para></note>
+ </description>
+ </configOption>
+ </configObject>
<configObject name="log_mappings">
<synopsis>PJPROJECT to Asterisk Log Level Mapping</synopsis>
<description><para>Warnings and errors in the pjproject libraries are generally handled
@@ -64,7 +85,7 @@
<configOption name="asterisk_notice" default="">
<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_NOTICE.</synopsis>
</configOption>
- <configOption name="asterisk_debug" default="3,4,5">
+ <configOption name="asterisk_debug" default="3,4,5,6">
<synopsis>A comma separated list of pjproject log levels to map to Asterisk LOG_DEBUG.</synopsis>
</configOption>
<configOption name="asterisk_verbose" default="">
@@ -82,6 +103,7 @@
#include <pjsip.h>
#include <pj/log.h>
+#include "asterisk/options.h"
#include "asterisk/logger.h"
#include "asterisk/module.h"
#include "asterisk/cli.h"
@@ -144,9 +166,11 @@ static struct log_mappings *get_log_mappings(void)
static int get_log_level(int pj_level)
{
- RAII_VAR(struct log_mappings *, mappings, get_log_mappings(), ao2_cleanup);
+ int mapped_level;
unsigned char l;
+ struct log_mappings *mappings;
+ mappings = get_log_mappings();
if (!mappings) {
return __LOG_ERROR;
}
@@ -154,18 +178,21 @@ static int get_log_level(int pj_level)
l = '0' + fmin(pj_level, 9);
if (strchr(mappings->asterisk_error, l)) {
- return __LOG_ERROR;
+ mapped_level = __LOG_ERROR;
} else if (strchr(mappings->asterisk_warning, l)) {
- return __LOG_WARNING;
+ mapped_level = __LOG_WARNING;
} else if (strchr(mappings->asterisk_notice, l)) {
- return __LOG_NOTICE;
+ mapped_level = __LOG_NOTICE;
} else if (strchr(mappings->asterisk_verbose, l)) {
- return __LOG_VERBOSE;
+ mapped_level = __LOG_VERBOSE;
} else if (strchr(mappings->asterisk_debug, l)) {
- return __LOG_DEBUG;
+ mapped_level = __LOG_DEBUG;
+ } else {
+ mapped_level = __LOG_SUPPRESS;
}
- return __LOG_SUPPRESS;
+ ao2_ref(mappings, -1);
+ return mapped_level;
}
static void log_forwarder(int level, const char *data, int len)
@@ -192,13 +219,6 @@ static void log_forwarder(int level, const char *data, int len)
return;
}
- if (ast_level == __LOG_DEBUG) {
- /* Obey the debug level for res_pjproject */
- if (!DEBUG_ATLEAST(level)) {
- return;
- }
- }
-
/* PJPROJECT uses indention to indicate function call depth. We'll prepend
* log statements with a tab so they'll have a better shot at lining
* up */
@@ -349,9 +369,95 @@ static char *handle_pjproject_show_log_mappings(struct ast_cli_entry *e, int cmd
return CLI_SUCCESS;
}
+struct max_pjproject_log_level_check {
+ /*!
+ * Compile time sanity check to determine if
+ * MAX_PJ_LOG_MAX_LEVEL matches CLI syntax.
+ */
+ char check[1 / (6 == MAX_PJ_LOG_MAX_LEVEL)];
+};
+
+static char *handle_pjproject_set_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ int level_new;
+ int level_old;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjproject set log level {default|0|1|2|3|4|5|6}";
+ e->usage =
+ "Usage: pjproject set log level {default|<level>}\n"
+ "\n"
+ " Set the maximum active pjproject logging level.\n"
+ " See pjproject.conf.sample for additional information\n"
+ " about the various levels pjproject uses.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 5) {
+ return CLI_SHOWUSAGE;
+ }
+
+ if (!strcasecmp(a->argv[4], "default")) {
+ level_new = DEFAULT_PJ_LOG_MAX_LEVEL;
+ } else {
+ if (sscanf(a->argv[4], "%30d", &level_new) != 1
+ || level_new < 0 || MAX_PJ_LOG_MAX_LEVEL < level_new) {
+ return CLI_SHOWUSAGE;
+ }
+ }
+
+ /* Update pjproject logging level */
+ level_old = ast_option_pjproject_log_level;
+ if (level_old == level_new) {
+ ast_cli(a->fd, "pjproject log level is still %d.\n", level_old);
+ } else {
+ ast_cli(a->fd, "pjproject log level was %d and is now %d.\n",
+ level_old, level_new);
+ pj_log_set_level(level_new);
+ }
+ ast_option_pjproject_log_level = pj_log_get_level();
+ if (ast_option_pjproject_log_level != level_new) {
+ ast_log(LOG_WARNING, "Asterisk built with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
+ }
+
+ return CLI_SUCCESS;
+}
+
+static char *handle_pjproject_show_log_level(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjproject show log level";
+ e->usage =
+ "Usage: pjproject show log level\n"
+ "\n"
+ " Show the current maximum active pjproject logging level.\n"
+ " See pjproject.conf.sample for additional information\n"
+ " about the various levels pjproject uses.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4) {
+ return CLI_SHOWUSAGE;
+ }
+
+ ast_cli(a->fd, "pjproject log level is %d.%s\n",
+ ast_option_pjproject_log_level,
+ ast_option_pjproject_log_level == DEFAULT_PJ_LOG_MAX_LEVEL ? " (default)" : "");
+
+ return CLI_SUCCESS;
+}
+
static struct ast_cli_entry pjproject_cli[] = {
+ AST_CLI_DEFINE(handle_pjproject_set_log_level, "Set the maximum active pjproject logging level"),
AST_CLI_DEFINE(handle_pjproject_show_buildopts, "Show the compiled config of the pjproject in use"),
AST_CLI_DEFINE(handle_pjproject_show_log_mappings, "Show pjproject to Asterisk log mappings"),
+ AST_CLI_DEFINE(handle_pjproject_show_log_level, "Show the maximum active pjproject logging level"),
};
static int load_module(void)
@@ -385,10 +491,11 @@ static int load_module(void)
}
ast_string_field_set(default_log_mappings, asterisk_error, "0,1");
ast_string_field_set(default_log_mappings, asterisk_warning, "2");
- ast_string_field_set(default_log_mappings, asterisk_debug, "3,4,5");
+ ast_string_field_set(default_log_mappings, asterisk_debug, "3,4,5,6");
ast_sorcery_load(pjproject_sorcery);
+ pj_log_set_level(ast_option_pjproject_log_level);
pj_init();
decor_orig = pj_log_get_decor();
@@ -403,9 +510,15 @@ static int load_module(void)
*/
pj_log_set_log_func(capture_buildopts_cb);
pj_log_set_decor(0);
+ pj_log_set_level(MAX_PJ_LOG_MAX_LEVEL);/* Set level to guarantee the dump output. */
pj_dump_config();
+ pj_log_set_level(ast_option_pjproject_log_level);
pj_log_set_decor(PJ_LOG_HAS_SENDER | PJ_LOG_HAS_INDENT);
pj_log_set_log_func(log_forwarder);
+ if (!AST_VECTOR_SIZE(&buildopts)
+ || ast_option_pjproject_log_level != pj_log_get_level()) {
+ ast_log(LOG_WARNING, "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
+ }
ast_cli_register_multiple(pjproject_cli, ARRAY_LEN(pjproject_cli));
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 4136f7e7b..58c217ecb 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -52,6 +52,7 @@
#include <ifaddrs.h>
#endif
+#include "asterisk/options.h"
#include "asterisk/stun.h"
#include "asterisk/pbx.h"
#include "asterisk/frame.h"
@@ -5665,6 +5666,7 @@ static int load_module(void)
#ifdef HAVE_PJPROJECT
pj_lock_t *lock;
+ pj_log_set_level(ast_option_pjproject_log_level);
if (pj_init() != PJ_SUCCESS) {
return AST_MODULE_LOAD_DECLINE;
}