84 ts = localtime (&now);
85 strftime (buf,
sizeof (buf), time_fmt, ts);
87 return g_strdup_printf (
"%s", buf);
100 if (level && strlen (level) > 0)
102 if (level[0] >=
'0' && level[0] <=
'9')
104 if (strcasecmp (level,
"critical") == 0)
105 return G_LOG_LEVEL_CRITICAL;
106 if (strcasecmp (level,
"debug") == 0)
107 return G_LOG_LEVEL_DEBUG;
108 if (strcasecmp (level,
"error") == 0)
109 return G_LOG_LEVEL_ERROR;
110 if (strcasecmp (level,
"info") == 0)
111 return G_LOG_LEVEL_INFO;
112 if (strcasecmp (level,
"message") == 0)
113 return G_LOG_LEVEL_MESSAGE;
114 if (strcasecmp (level,
"warning") == 0)
115 return G_LOG_LEVEL_WARNING;
131 if (facility && strlen (facility) > 0)
134 while (facilitynames[i].c_name != NULL)
136 if (g_ascii_strcasecmp (facility, facilitynames[i].c_name) == 0)
137 return facilitynames[i].c_val;
159 GError *error = NULL;
170 GSList *log_domain_list = NULL;
173 key_file = g_key_file_new ();
174 flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
177 if (!g_key_file_load_from_file (key_file, config_file, flags, &error))
179 g_error (
"%s: %s", config_file, error->message);
183 groups = g_key_file_get_groups (key_file, NULL);
188 while (*group != NULL)
195 log_domain_entry->
log_domain = g_strdup (*group);
207 if (g_key_file_has_key (key_file, *group,
"prepend", &error))
210 g_key_file_get_value (key_file, *group,
"prepend", &error);
214 if (g_key_file_has_key (key_file, *group,
"separator", &error))
217 g_key_file_get_value (key_file, *group,
"separator", &error);
221 if (g_key_file_has_key (key_file, *group,
"prepend_time_format", &error))
224 key_file, *group,
"prepend_time_format", &error);
228 if (g_key_file_has_key (key_file, *group,
"file", &error))
231 g_key_file_get_value (key_file, *group,
"file", &error);
235 if (g_key_file_has_key (key_file, *group,
"level", &error))
239 level = g_key_file_get_value (key_file, *group,
"level", &error);
240 level = g_strchug (level);
247 if (g_key_file_has_key (key_file, *group,
"syslog_facility", &error))
250 g_key_file_get_value (key_file, *group,
"syslog_facility", &error);
256 if (g_key_file_has_key (key_file, *group,
"syslog_ident", &error))
259 g_key_file_get_value (key_file, *group,
"syslog_ident", &error);
265 log_domain_list = g_slist_prepend (log_domain_list, log_domain_entry);
272 g_key_file_free (key_file);
274 return log_domain_list;
285 GSList *log_domain_list_tmp;
292 log_domain_list_tmp = log_domain_list;
293 while (log_domain_list_tmp != NULL)
298 log_domain_entry = log_domain_list_tmp->data;
304 g_free (log_domain_entry->
log_file);
311 g_io_channel_unref (log_domain_entry->
log_channel);
314 g_free (log_domain_entry);
317 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
320 g_slist_free (log_domain_list);
333 const char *message, gpointer gvm_log_config_list)
338 (void) gvm_log_config_list;
385 const char *message, gpointer gvm_log_config_list)
396 GSList *log_domain_list_tmp;
401 GError *error = NULL;
406 gchar *prepend_format =
"%t %s %p - ";
407 gchar *time_format =
"%Y-%m-%d %Hh%M.%S %Z";
408 gchar *log_separator =
":";
409 gchar *log_file =
"-";
410 GLogLevelFlags default_level = G_LOG_LEVEL_DEBUG;
412 gchar *syslog_facility =
"local0";
413 gchar *syslog_ident = NULL;
422 if (gvm_log_config_list != NULL && log_domain != NULL)
425 log_domain_list_tmp = (GSList *) gvm_log_config_list;
427 while (log_domain_list_tmp != NULL)
431 entry = log_domain_list_tmp->data;
434 if (g_ascii_strcasecmp (entry->
log_domain,
"*") == 0)
437 log_domain_entry = entry;
445 log_file = log_domain_entry->
log_file;
458 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
465 if (gvm_log_config_list != NULL && log_domain != NULL)
468 log_domain_list_tmp = (GSList *) gvm_log_config_list;
470 while (log_domain_list_tmp != NULL)
474 entry = log_domain_list_tmp->data;
477 if (g_ascii_strcasecmp (entry->
log_domain, log_domain) == 0)
480 log_domain_entry = entry;
485 log_file = log_domain_entry->
log_file;
497 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
504 if (default_level < log_level)
508 prepend_buf = g_strdup (
"");
511 tmp = prepend_format;
516 if ((*tmp ==
'%') && (*(tmp + 1) ==
'p'))
520 prepend_tmp = g_strdup_printf (
"%s%d", prepend_buf, (
int) getpid ());
522 g_free (prepend_buf);
524 prepend_buf = prepend_tmp;
528 else if ((*tmp ==
'%') && (*(tmp + 1) ==
't'))
533 prepend_tmp1 =
get_time (time_format);
537 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, prepend_tmp1);
539 g_free (prepend_tmp1);
541 g_free (prepend_buf);
543 prepend_buf = prepend_tmp;
547 else if ((*tmp ==
'%') && (*(tmp + 1) ==
's'))
552 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, log_separator);
554 g_free (prepend_buf);
556 prepend_buf = prepend_tmp;
572 case G_LOG_FLAG_RECURSION:
573 prepend = g_strdup_printf (
"RECURSION%s%s", log_separator, prepend_buf);
576 case G_LOG_FLAG_FATAL:
577 prepend = g_strdup_printf (
"FATAL%s%s", log_separator, prepend_buf);
580 case G_LOG_LEVEL_ERROR:
581 prepend = g_strdup_printf (
"ERROR%s%s", log_separator, prepend_buf);
584 case G_LOG_LEVEL_CRITICAL:
585 prepend = g_strdup_printf (
"CRITICAL%s%s", log_separator, prepend_buf);
588 case G_LOG_LEVEL_WARNING:
589 prepend = g_strdup_printf (
"WARNING%s%s", log_separator, prepend_buf);
592 case G_LOG_LEVEL_MESSAGE:
593 prepend = g_strdup_printf (
"MESSAGE%s%s", log_separator, prepend_buf);
596 case G_LOG_LEVEL_INFO:
597 prepend = g_strdup_printf (
" INFO%s%s", log_separator, prepend_buf);
600 case G_LOG_LEVEL_DEBUG:
601 prepend = g_strdup_printf (
" DEBUG%s%s", log_separator, prepend_buf);
605 prepend = g_strdup_printf (
"UNKNOWN%s%s", log_separator, prepend_buf);
614 messagelen = message ? strlen (message) : 0;
615 if (messagelen > 1 && message[messagelen - 1] ==
'\n')
617 tmpstr = g_strdup_printf (
"%s%s%s%s %.*s\n", log_domain ? log_domain :
"",
618 log_separator, prepend, log_separator, messagelen,
624 if (g_ascii_strcasecmp (log_file,
"-") == 0)
626 fprintf (stderr,
"%s", tmpstr);
630 else if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
633 int syslog_level = LOG_INFO;
635 openlog (syslog_ident, LOG_CONS | LOG_PID | LOG_NDELAY, facility);
639 case G_LOG_FLAG_FATAL:
640 syslog_level = LOG_ALERT;
642 case G_LOG_LEVEL_ERROR:
643 syslog_level = LOG_ERR;
645 case G_LOG_LEVEL_CRITICAL:
646 syslog_level = LOG_CRIT;
648 case G_LOG_LEVEL_WARNING:
649 syslog_level = LOG_WARNING;
651 case G_LOG_LEVEL_MESSAGE:
652 syslog_level = LOG_NOTICE;
654 case G_LOG_LEVEL_INFO:
655 syslog_level = LOG_INFO;
657 case G_LOG_LEVEL_DEBUG:
658 syslog_level = LOG_DEBUG;
661 syslog_level = LOG_INFO;
665 syslog (syslog_level,
"%s", message);
676 channel = g_io_channel_new_file (log_file,
"a", &error);
679 gchar *log = g_strdup (log_file);
680 gchar *dir = dirname (log);
686 if (error->code != G_FILE_ERROR_NOENT)
687 fprintf (stderr,
"Can not open '%s' logfile: %s\n", log_file,
689 g_error_free (error);
692 if (g_mkdir_with_parents (dir, 0755))
694 g_warning (
"Failed to create log file directory %s: %s", dir,
698 g_free (prepend_buf);
705 channel = g_io_channel_new_file (log_file,
"a", &error);
708 g_error (
"Can not open '%s' logfile: %s", log_file,
714 if (log_domain_entry != NULL)
717 g_io_channel_write_chars (channel, (
const gchar *) tmpstr, -1, NULL,
719 g_io_channel_flush (channel, NULL);
723 g_free (prepend_buf);
740 g_log (
"x gnutls", G_LOG_LEVEL_INFO,
"tls(%d): %s", level, message);
753 GSList *log_domain_list_tmp;
754 if (gvm_log_config_list != NULL)
757 log_domain_list_tmp = (GSList *) gvm_log_config_list;
759 while (log_domain_list_tmp != NULL)
764 log_domain_entry = log_domain_list_tmp->data;
768 (!strcmp (log_domain_entry,
"syslog")) ? gvm_syslog_func :
772 if (g_ascii_strcasecmp (log_domain_entry->
log_domain,
"*"))
776 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO
777 | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING
778 | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR
779 | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION),
780 (GLogFunc) logfunc, gvm_log_config_list);
784 g_log_set_default_handler ((GLogFunc) logfunc,
785 gvm_log_config_list);
789 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
794 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO | G_LOG_LEVEL_MESSAGE
795 | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL
796 | G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL
797 | G_LOG_FLAG_RECURSION),
gchar * prepend_time_format
If prependstring has t, format for strftime.
static void gvm_log_unlock(void)
Unlock logger_mutex.
void free_log_configuration(GSList *log_domain_list)
Frees all resources loaded by the config loader.
void log_func_for_gnutls(int level, const char *message)
This function logs debug messages from gnutls.
gchar * prepend_string
Prepend this string before every message.
void setup_log_handlers(GSList *gvm_log_config_list)
Sets up routing of logdomains to log handlers.
gchar * syslog_facility
Syslog facility to use for syslog logging.
Logging stores the parameters loaded from a log configuration.
Implementation of logging methods.
GIOChannel * log_channel
Gio Channel - FD holder for logfile.
gchar * log_domain
Affected logdomain e.g libnasl.
static gint facility_int_from_string(const gchar *facility)
Return the integer corresponding to a syslog facility string.
static void gvm_log_lock_init(void)
Initialize logger_mutex mutex if it was not done before.
GSList * load_log_configuration(gchar *config_file)
Loads parameters from a config file into a linked list.
void gvm_log_silent(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer gvm_log_config_list)
Returns immediately.
static GMutex * logger_mutex
gchar * log_file
Where to log to.
void gvm_log_func(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer gvm_log_config_list)
Creates the formatted string and outputs it to the log destination.
gchar * syslog_ident
Syslog ident to use for syslog logging.
gchar * prepend_separator
GLogLevelFlags * default_level
What severity level to use as default.
static gint level_int_from_string(const gchar *level)
Return the integer corresponding to a log level string.
static void gvm_log_lock(void)
Try to lock logger_mutex.
gchar * get_time(gchar *time_fmt)
Returns time as specified in time_fmt strftime format.