logging: fix "nmcli gen log level FOO"
The change to per-domain log levels means that when setting just the level, we need to re-set the log level for each domain (since it's the "logging" bit array that actually determines what gets logged). nm_logging_setup() was dealing correctly with domains=NULL, but not domains="" (which is what happens when it is invoked with only a level via D-Bus), so doing "nmcli gen log level DEBUG" would change the "default" log level, but leave all of the domains still at their previous level: danw@laptop:NetworkManager> nmcli g log LEVEL DOMAINS INFO PLATFORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP,IP4,IP6... danw@laptop:NetworkManager> nmcli g log level DEBUG danw@laptop:NetworkManager> nmcli g log LEVEL DOMAINS DEBUG PLATFORM:INFO,RFKILL:INFO,ETHER:INFO,WIFI:INFO,BT:INFO...
This commit is contained in:
@@ -159,101 +159,97 @@ nm_logging_setup (const char *level,
|
|||||||
GString *unrecognized = NULL;
|
GString *unrecognized = NULL;
|
||||||
guint64 new_logging[LOGL_MAX];
|
guint64 new_logging[LOGL_MAX];
|
||||||
guint32 new_log_level = log_level;
|
guint32 new_log_level = log_level;
|
||||||
|
char **tmp, **iter;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!domains)
|
|
||||||
domains = log_domains ? log_domains : "DEFAULT";
|
|
||||||
|
|
||||||
for (i = 0; i < LOGL_MAX; i++)
|
for (i = 0; i < LOGL_MAX; i++)
|
||||||
new_logging[i] = 0;
|
new_logging[i] = 0;
|
||||||
|
|
||||||
/* levels */
|
/* levels */
|
||||||
if (level && strlen (level)) {
|
if (level && *level) {
|
||||||
if (!match_log_level (level, &new_log_level, error))
|
if (!match_log_level (level, &new_log_level, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* domains */
|
/* domains */
|
||||||
if (domains && strlen (domains)) {
|
if (!domains || !*domains)
|
||||||
char **tmp, **iter;
|
domains = log_domains ? log_domains : "DEFAULT";
|
||||||
|
|
||||||
tmp = g_strsplit_set (domains, ", ", 0);
|
tmp = g_strsplit_set (domains, ", ", 0);
|
||||||
for (iter = tmp; iter && *iter; iter++) {
|
for (iter = tmp; iter && *iter; iter++) {
|
||||||
const LogDesc *diter;
|
const LogDesc *diter;
|
||||||
guint32 domain_log_level;
|
guint32 domain_log_level;
|
||||||
guint64 bits;
|
guint64 bits;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if (!strlen (*iter))
|
if (!strlen (*iter))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
p = strchr (*iter, ':');
|
p = strchr (*iter, ':');
|
||||||
if (p) {
|
if (p) {
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
if (!match_log_level (p + 1, &domain_log_level, error)) {
|
if (!match_log_level (p + 1, &domain_log_level, error)) {
|
||||||
g_strfreev (tmp);
|
g_strfreev (tmp);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
domain_log_level = new_log_level;
|
domain_log_level = new_log_level;
|
||||||
|
|
||||||
bits = 0;
|
bits = 0;
|
||||||
|
|
||||||
/* Check for combined domains */
|
/* Check for combined domains */
|
||||||
if (!g_ascii_strcasecmp (*iter, LOGD_ALL_STRING))
|
if (!g_ascii_strcasecmp (*iter, LOGD_ALL_STRING))
|
||||||
bits = LOGD_ALL;
|
bits = LOGD_ALL;
|
||||||
else if (!g_ascii_strcasecmp (*iter, LOGD_DEFAULT_STRING))
|
else if (!g_ascii_strcasecmp (*iter, LOGD_DEFAULT_STRING))
|
||||||
bits = LOGD_DEFAULT;
|
bits = LOGD_DEFAULT;
|
||||||
else if (!g_ascii_strcasecmp (*iter, LOGD_DHCP_STRING))
|
else if (!g_ascii_strcasecmp (*iter, LOGD_DHCP_STRING))
|
||||||
bits = LOGD_DHCP;
|
bits = LOGD_DHCP;
|
||||||
else if (!g_ascii_strcasecmp (*iter, LOGD_IP_STRING))
|
else if (!g_ascii_strcasecmp (*iter, LOGD_IP_STRING))
|
||||||
bits = LOGD_IP;
|
bits = LOGD_IP;
|
||||||
|
|
||||||
/* Check for compatibility domains */
|
/* Check for compatibility domains */
|
||||||
else if (!g_ascii_strcasecmp (*iter, "HW"))
|
else if (!g_ascii_strcasecmp (*iter, "HW"))
|
||||||
bits = LOGD_PLATFORM;
|
bits = LOGD_PLATFORM;
|
||||||
|
|
||||||
else {
|
else {
|
||||||
for (diter = &domain_descs[0]; diter->name; diter++) {
|
for (diter = &domain_descs[0]; diter->name; diter++) {
|
||||||
if (!g_ascii_strcasecmp (diter->name, *iter)) {
|
if (!g_ascii_strcasecmp (diter->name, *iter)) {
|
||||||
bits = diter->num;
|
bits = diter->num;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!bits) {
|
if (!bits) {
|
||||||
if (!bad_domains) {
|
if (!bad_domains) {
|
||||||
g_set_error (error, NM_LOGGING_ERROR, NM_LOGGING_ERROR_UNKNOWN_DOMAIN,
|
g_set_error (error, NM_LOGGING_ERROR, NM_LOGGING_ERROR_UNKNOWN_DOMAIN,
|
||||||
_("Unknown log domain '%s'"), *iter);
|
_("Unknown log domain '%s'"), *iter);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
if (unrecognized)
|
|
||||||
g_string_append (unrecognized, ", ");
|
|
||||||
else
|
|
||||||
unrecognized = g_string_new (NULL);
|
|
||||||
g_string_append (unrecognized, *iter);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < domain_log_level; i++)
|
if (unrecognized)
|
||||||
new_logging[i] &= ~bits;
|
g_string_append (unrecognized, ", ");
|
||||||
for (i = domain_log_level; i < LOGL_MAX; i++)
|
else
|
||||||
new_logging[i] |= bits;
|
unrecognized = g_string_new (NULL);
|
||||||
}
|
g_string_append (unrecognized, *iter);
|
||||||
g_strfreev (tmp);
|
continue;
|
||||||
|
|
||||||
if (log_domains != (char *)domains) {
|
|
||||||
g_free (log_domains);
|
|
||||||
log_domains = g_strdup (domains);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < LOGL_MAX; i++)
|
for (i = 0; i < domain_log_level; i++)
|
||||||
logging[i] = new_logging[i];
|
new_logging[i] &= ~bits;
|
||||||
|
for (i = domain_log_level; i < LOGL_MAX; i++)
|
||||||
|
new_logging[i] |= bits;
|
||||||
|
}
|
||||||
|
g_strfreev (tmp);
|
||||||
|
|
||||||
|
if (log_domains != (char *)domains) {
|
||||||
|
g_free (log_domains);
|
||||||
|
log_domains = g_strdup (domains);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_level = new_log_level;
|
log_level = new_log_level;
|
||||||
|
for (i = 0; i < LOGL_MAX; i++)
|
||||||
|
logging[i] = new_logging[i];
|
||||||
|
|
||||||
if (unrecognized)
|
if (unrecognized)
|
||||||
*bad_domains = g_string_free (unrecognized, FALSE);
|
*bad_domains = g_string_free (unrecognized, FALSE);
|
||||||
|
Reference in New Issue
Block a user