51 #include <gnutls/gnutls.h> 81 static void (*legacy_log_handler)(
const char *format, va_list args);
106 ts = localtime (&now);
107 strftime (buf,
sizeof (buf), time_fmt, ts);
109 return g_strdup_printf (
"%s", buf);
120 level_int_from_string (
const gchar * level)
122 if (level && strlen (level) > 0)
124 if (level[0] >=
'0' && level[0] <=
'9')
126 if (strcasecmp (level,
"critical") == 0)
127 return G_LOG_LEVEL_CRITICAL;
128 if (strcasecmp (level,
"debug") == 0)
129 return G_LOG_LEVEL_DEBUG;
130 if (strcasecmp (level,
"error") == 0)
131 return G_LOG_LEVEL_ERROR;
132 if (strcasecmp (level,
"info") == 0)
133 return G_LOG_LEVEL_INFO;
134 if (strcasecmp (level,
"message") == 0)
135 return G_LOG_LEVEL_MESSAGE;
136 if (strcasecmp (level,
"warning") == 0)
137 return G_LOG_LEVEL_WARNING;
150 facility_int_from_string (
const gchar * facility)
152 if (facility && strlen (facility) > 0)
155 while (facilitynames[i].c_name != NULL)
157 if (g_ascii_strcasecmp (facility, facilitynames[i].c_name) == 0)
158 return facilitynames[i].c_val;
180 GError *error = NULL;
193 GSList *log_domain_list = NULL;
196 key_file = g_key_file_new ();
197 flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
200 if (!g_key_file_load_from_file (key_file, config_file, flags, &error))
202 g_error (
"%s: %s", config_file, error->message);
206 groups = g_key_file_get_groups (key_file, NULL);
211 while (*group != NULL)
216 log_domain_entry->
log_domain = g_strdup (*group);
228 if (g_key_file_has_key (key_file, *group,
"prepend", &error))
231 g_key_file_get_value (key_file, *group,
"prepend", &error);
235 if (g_key_file_has_key (key_file, *group,
"prepend_time_format", &error))
238 g_key_file_get_value (key_file, *group,
"prepend_time_format",
243 if (g_key_file_has_key (key_file, *group,
"file", &error))
246 g_key_file_get_value (key_file, *group,
"file", &error);
250 if (g_key_file_has_key (key_file, *group,
"level", &error))
254 level = g_key_file_get_value (key_file, *group,
"level", &error);
255 level = g_strchug (level);
257 *log_domain_entry->
default_level = level_int_from_string (level);
262 if (g_key_file_has_key (key_file, *group,
"syslog_facility", &error))
265 g_key_file_get_value (key_file, *group,
"syslog_facility", &error);
271 if (g_key_file_has_key (key_file, *group,
"syslog_ident", &error))
274 g_key_file_get_value (key_file, *group,
"syslog_ident", &error);
280 log_domain_list = g_slist_prepend (log_domain_list, log_domain_entry);
287 g_key_file_free (key_file);
289 return log_domain_list;
300 GSList *log_domain_list_tmp;
308 log_domain_list_tmp = log_domain_list;
309 while (log_domain_list_tmp != NULL)
312 log_domain_entry = log_domain_list_tmp->data;
318 g_free (log_domain_entry->
log_file);
324 g_io_channel_unref (log_domain_entry->
log_channel);
327 g_free (log_domain_entry);
330 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
334 g_slist_free (log_domain_list);
347 const char *message, gpointer openvas_log_config_list)
352 (void) openvas_log_config_list;
356 static GMutex *logger_mutex = NULL;
359 openvas_log_lock_init (
void)
361 if (logger_mutex == NULL)
363 logger_mutex = g_malloc (
sizeof (*logger_mutex));
364 g_mutex_init (logger_mutex);
369 openvas_log_lock (
void)
371 g_mutex_lock (logger_mutex);
375 openvas_log_unlock (
void)
377 g_mutex_unlock (logger_mutex);
390 const char *message, gpointer openvas_log_config_list)
401 GSList *log_domain_list_tmp;
406 GError *error = NULL;
411 gchar *prepend_format =
"%p %t - ";
412 gchar *time_format =
"%Y-%m-%d %Hh%M.%S %Z";
415 gchar *log_separator =
":";
416 gchar *log_file =
"-";
417 GLogLevelFlags default_level = G_LOG_LEVEL_DEBUG;
419 gchar *syslog_facility =
"local0";
420 gchar *syslog_ident = NULL;
423 openvas_log_lock_init ();
429 if (openvas_log_config_list != NULL && log_domain != NULL)
433 log_domain_list_tmp = (GSList *) openvas_log_config_list;
435 while (log_domain_list_tmp != NULL)
439 entry = log_domain_list_tmp->data;
442 if (g_ascii_strcasecmp (entry->
log_domain,
"*") == 0)
445 log_domain_entry = entry;
453 log_file = log_domain_entry->
log_file;
464 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
471 if (openvas_log_config_list != NULL && log_domain != NULL)
475 log_domain_list_tmp = (GSList *) openvas_log_config_list;
477 while (log_domain_list_tmp != NULL)
481 entry = log_domain_list_tmp->data;
484 if (g_ascii_strcasecmp (entry->
log_domain, log_domain) == 0)
487 log_domain_entry = entry;
492 log_file = log_domain_entry->
log_file;
502 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
509 if (default_level < log_level)
514 prepend_buf = g_strdup (
"");
518 tmp = prepend_format;
523 if ((*tmp ==
'%') && (*(tmp + 1) ==
'p'))
528 g_strdup_printf (
"%s%s%d", prepend_buf, log_separator,
531 g_free (prepend_buf);
533 prepend_buf = prepend_tmp;
537 else if ((*tmp ==
'%') && (*(tmp + 1) ==
't'))
542 prepend_tmp1 =
get_time (time_format);
547 g_strdup_printf (
"%s%s%s", prepend_buf, log_separator,
550 g_free (prepend_tmp1);
552 g_free (prepend_buf);
554 prepend_buf = prepend_tmp;
570 case G_LOG_FLAG_RECURSION:
571 prepend = g_strdup_printf (
"RECURSION%s", prepend_buf);
574 case G_LOG_FLAG_FATAL:
575 prepend = g_strdup_printf (
"FATAL%s", prepend_buf);
578 case G_LOG_LEVEL_ERROR:
579 prepend = g_strdup_printf (
"ERROR%s", prepend_buf);
582 case G_LOG_LEVEL_CRITICAL:
583 prepend = g_strdup_printf (
"CRITICAL%s", prepend_buf);
586 case G_LOG_LEVEL_WARNING:
587 prepend = g_strdup_printf (
"WARNING%s", prepend_buf);
590 case G_LOG_LEVEL_MESSAGE:
591 prepend = g_strdup_printf (
"MESSAGE%s", prepend_buf);
594 case G_LOG_LEVEL_INFO:
595 prepend = g_strdup_printf (
" INFO%s", prepend_buf);
598 case G_LOG_LEVEL_DEBUG:
599 prepend = g_strdup_printf (
" DEBUG%s", prepend_buf);
603 prepend = g_strdup_printf (
"UNKNOWN%s", prepend_buf);
612 messagelen = message? strlen (message) : 0;
613 if (messagelen > 1 && message[messagelen-1] ==
'\n')
615 tmpstr = g_strdup_printf (
"%s%s%s%s %.*s\n",
616 log_domain ? log_domain :
"", log_separator,
617 prepend, log_separator, messagelen, message);
622 if (g_ascii_strcasecmp (log_file,
"-") == 0)
624 fprintf (stderr,
"%s", tmpstr);
628 else if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
630 int facility = facility_int_from_string (syslog_facility);
631 int syslog_level = LOG_INFO;
633 openlog (syslog_ident, LOG_CONS | LOG_PID | LOG_NDELAY, facility);
637 case G_LOG_FLAG_FATAL:
638 syslog_level = LOG_ALERT;
640 case G_LOG_LEVEL_ERROR:
641 syslog_level = LOG_ERR;
643 case G_LOG_LEVEL_CRITICAL:
644 syslog_level = LOG_CRIT;
646 case G_LOG_LEVEL_WARNING:
647 syslog_level = LOG_WARNING;
649 case G_LOG_LEVEL_MESSAGE:
650 syslog_level = LOG_NOTICE;
652 case G_LOG_LEVEL_INFO:
653 syslog_level = LOG_INFO;
655 case G_LOG_LEVEL_DEBUG:
656 syslog_level = LOG_DEBUG;
659 syslog_level = LOG_INFO;
663 syslog (syslog_level,
"%s", message);
674 channel = g_io_channel_new_file (log_file,
"a", &error);
677 gchar *log = g_strdup (log_file);
678 gchar *dir = dirname (log);
681 g_error_free (error);
684 if (g_mkdir_with_parents (dir, 0755))
686 g_warning (
"Failed to create log file directory %s: %s", dir,
690 g_free (prepend_buf);
697 channel = g_io_channel_new_file (log_file,
"a", &error);
700 g_error (
"Can not open '%s' logfile: %s", log_file,
706 if (log_domain_entry != NULL)
709 g_io_channel_write_chars (channel, (
const gchar *) tmpstr, -1, NULL,
711 g_io_channel_flush (channel, NULL);
714 openvas_log_unlock ();
716 g_free (prepend_buf);
728 log_func_for_gnutls (
int level,
const char *message)
730 g_log (
"x gnutls", G_LOG_LEVEL_INFO,
"tls(%d): %s", level, message);
744 GSList *log_domain_list_tmp;
746 if (openvas_log_config_list != NULL)
749 log_domain_list_tmp = (GSList *) openvas_log_config_list;
751 while (log_domain_list_tmp != NULL)
754 log_domain_entry = log_domain_list_tmp->data;
758 (!strcmp (log_domain_entry,
"syslog")) ? openvas_syslog_func :
762 if (g_ascii_strcasecmp (log_domain_entry->
log_domain,
"*"))
764 g_log_set_handler (log_domain_entry->
log_domain,
765 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG |
767 G_LOG_LEVEL_MESSAGE |
768 G_LOG_LEVEL_WARNING |
769 G_LOG_LEVEL_CRITICAL |
772 G_LOG_FLAG_RECURSION),
773 (GLogFunc) logfunc, openvas_log_config_list);
777 g_log_set_default_handler ((GLogFunc) logfunc,
778 openvas_log_config_list);
782 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
785 g_log_set_handler (
"",
786 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO |
787 G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING
788 | G_LOG_LEVEL_CRITICAL |
789 G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL |
790 G_LOG_FLAG_RECURSION),
796 if ((s=getenv (
"OPENVAS_GNUTLS_DEBUG")))
798 gnutls_global_set_log_function (log_func_for_gnutls);
799 gnutls_global_set_log_level (atoi (s));
819 legacy_log_handler = handler;
836 va_start (arg_ptr, format);
837 if (legacy_log_handler)
838 legacy_log_handler (format, arg_ptr);
840 vfprintf (stderr, format, arg_ptr);
853 if (!legacy_log_handler)
GLogLevelFlags * default_level
What severity level to use as default.
gchar * log_file
Where to log to.
gchar * prepend_string
Prepend this string before every message.
GIOChannel * log_channel
Gio Channel - FD holder for logfile.
void free_log_configuration(GSList *log_domain_list)
Frees all resources loaded by the config loader.
void setup_log_handlers(GSList *openvas_log_config_list)
Sets up routing of logdomains to log handlers.
gchar * prepend_time_format
If prependstring has t, format for strftime.
void log_legacy_write(const char *format,...)
Legacy function to write a log message.
void log_legacy_fflush(void)
Legacy function to flush a log message.
GSList * load_log_configuration(gchar *config_file)
Loads parameters from a config file into a linked list.
gchar * log_domain
Affected logdomain e.g libnasl.
gchar * syslog_ident
Syslog ident to use for syslog logging.
gchar * syslog_facility
Syslog facility to use for syslog logging.
void setup_legacy_log_handler(void(*handler)(const char *, va_list))
Sets up a simple logging function.
gchar * get_time(gchar *time_fmt)
Returns time as specified in time_fmt strftime format.
void openvas_log_func(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer openvas_log_config_list)
Creates the formatted string and outputs it to the log destination.
void openvas_log_silent(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer openvas_log_config_list)
Returns immediately.