35#define G_LOG_DOMAIN "libgvm base"
78 localtime_r (&now, &ts);
79 strftime (buf,
sizeof (buf), time_fmt, &ts);
81 return g_strdup_printf (
"%s", buf);
94 if (level && strlen (level) > 0)
96 if (level[0] >=
'0' && level[0] <=
'9')
98 if (strcasecmp (level,
"critical") == 0)
99 return G_LOG_LEVEL_CRITICAL;
100 if (strcasecmp (level,
"debug") == 0)
101 return G_LOG_LEVEL_DEBUG;
102 if (strcasecmp (level,
"error") == 0)
103 return G_LOG_LEVEL_ERROR;
104 if (strcasecmp (level,
"info") == 0)
105 return G_LOG_LEVEL_INFO;
106 if (strcasecmp (level,
"message") == 0)
107 return G_LOG_LEVEL_MESSAGE;
108 if (strcasecmp (level,
"warning") == 0)
109 return G_LOG_LEVEL_WARNING;
125 if (facility && strlen (facility) > 0)
128 while (facilitynames[i].c_name != NULL)
130 if (g_ascii_strcasecmp (facility, facilitynames[i].c_name) == 0)
131 return facilitynames[i].c_val;
153 GError *error = NULL;
164 GSList *log_domain_list = NULL;
167 key_file = g_key_file_new ();
168 flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
171 if (!g_key_file_load_from_file (key_file, config_file, flags, &error))
173 g_error (
"%s: %s", config_file, error->message);
177 groups = g_key_file_get_groups (key_file, NULL);
182 while (*group != NULL)
189 log_domain_entry->
log_domain = g_strdup (*group);
201 if (g_key_file_has_key (key_file, *group,
"prepend", &error))
204 g_key_file_get_value (key_file, *group,
"prepend", &error);
208 if (g_key_file_has_key (key_file, *group,
"separator", &error))
211 g_key_file_get_value (key_file, *group,
"separator", &error);
215 if (g_key_file_has_key (key_file, *group,
"prepend_time_format", &error))
218 key_file, *group,
"prepend_time_format", &error);
222 if (g_key_file_has_key (key_file, *group,
"file", &error))
225 g_key_file_get_value (key_file, *group,
"file", &error);
229 if (g_key_file_has_key (key_file, *group,
"level", &error))
233 level = g_key_file_get_value (key_file, *group,
"level", &error);
234 level = g_strchug (level);
241 if (g_key_file_has_key (key_file, *group,
"syslog_facility", &error))
244 g_key_file_get_value (key_file, *group,
"syslog_facility", &error);
250 if (g_key_file_has_key (key_file, *group,
"syslog_ident", &error))
253 g_key_file_get_value (key_file, *group,
"syslog_ident", &error);
259 log_domain_list = g_slist_prepend (log_domain_list, log_domain_entry);
266 g_key_file_free (key_file);
268 return log_domain_list;
279 GSList *log_domain_list_tmp;
286 log_domain_list_tmp = log_domain_list;
287 while (log_domain_list_tmp != NULL)
292 log_domain_entry = log_domain_list_tmp->data;
298 g_free (log_domain_entry->
log_file);
305 g_io_channel_unref (log_domain_entry->
log_channel);
308 g_free (log_domain_entry);
311 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
314 g_slist_free (log_domain_list);
327 const char *message, gpointer gvm_log_config_list)
332 (void) gvm_log_config_list;
433 const char *message, gpointer gvm_log_config_list)
444 GSList *log_domain_list_tmp;
449 GError *error = NULL;
454 gchar *prepend_format =
"%t %s %p - ";
455 gchar *time_format =
"%Y-%m-%d %Hh%M.%S %Z";
456 gchar *log_separator =
":";
457 gchar *log_file =
"-";
458 GLogLevelFlags default_level = G_LOG_LEVEL_DEBUG;
460 gchar *syslog_facility =
"local0";
461 gchar *syslog_ident = NULL;
467 if (gvm_log_config_list != NULL && log_domain != NULL)
470 log_domain_list_tmp = (GSList *) gvm_log_config_list;
472 while (log_domain_list_tmp != NULL)
476 entry = log_domain_list_tmp->data;
479 if (g_ascii_strcasecmp (entry->
log_domain,
"*") == 0)
482 log_domain_entry = entry;
490 log_file = log_domain_entry->
log_file;
503 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
510 if (gvm_log_config_list != NULL && log_domain != NULL)
513 log_domain_list_tmp = (GSList *) gvm_log_config_list;
515 while (log_domain_list_tmp != NULL)
519 entry = log_domain_list_tmp->data;
522 if (g_ascii_strcasecmp (entry->
log_domain, log_domain) == 0)
525 log_domain_entry = entry;
531 log_file = log_domain_entry->
log_file;
543 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
550 if (default_level < log_level)
554 prepend_buf = g_strdup (
"");
557 tmp = prepend_format;
562 if ((*tmp ==
'%') && (*(tmp + 1) ==
'p'))
567 g_strdup_printf (
"%s%d%s%s", prepend_buf, (
int) getpid (),
575 g_strdup_printf (
"%s%d", prepend_buf, (
int) getpid ());
578 g_free (prepend_buf);
580 prepend_buf = prepend_tmp;
584 else if ((*tmp ==
'%') && (*(tmp + 1) ==
't'))
589 prepend_tmp1 =
get_time (time_format);
593 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, prepend_tmp1);
595 g_free (prepend_tmp1);
597 g_free (prepend_buf);
599 prepend_buf = prepend_tmp;
603 else if ((*tmp ==
'%') && (*(tmp + 1) ==
's'))
608 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, log_separator);
610 g_free (prepend_buf);
612 prepend_buf = prepend_tmp;
628 case G_LOG_FLAG_RECURSION:
629 prepend = g_strdup_printf (
"RECURSION%s%s", log_separator, prepend_buf);
632 case G_LOG_FLAG_FATAL:
633 prepend = g_strdup_printf (
"FATAL%s%s", log_separator, prepend_buf);
636 case G_LOG_LEVEL_ERROR:
637 prepend = g_strdup_printf (
"ERROR%s%s", log_separator, prepend_buf);
640 case G_LOG_LEVEL_CRITICAL:
641 prepend = g_strdup_printf (
"CRITICAL%s%s", log_separator, prepend_buf);
644 case G_LOG_LEVEL_WARNING:
645 prepend = g_strdup_printf (
"WARNING%s%s", log_separator, prepend_buf);
648 case G_LOG_LEVEL_MESSAGE:
649 prepend = g_strdup_printf (
"MESSAGE%s%s", log_separator, prepend_buf);
652 case G_LOG_LEVEL_INFO:
653 prepend = g_strdup_printf (
" INFO%s%s", log_separator, prepend_buf);
656 case G_LOG_LEVEL_DEBUG:
657 prepend = g_strdup_printf (
" DEBUG%s%s", log_separator, prepend_buf);
661 prepend = g_strdup_printf (
"UNKNOWN%s%s", log_separator, prepend_buf);
670 messagelen = message ? strlen (message) : 0;
671 if (messagelen > 1 && message[messagelen - 1] ==
'\n')
673 tmpstr = g_strdup_printf (
"%s%s%s%s %.*s\n", log_domain ? log_domain :
"",
674 log_separator, prepend, log_separator, messagelen,
678 if (log_level <= G_LOG_LEVEL_WARNING)
683 if (g_ascii_strcasecmp (log_file,
"-") == 0)
685 fprintf (stderr,
"%s", tmpstr);
689 else if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
692 int syslog_level = LOG_INFO;
694 openlog (syslog_ident, LOG_CONS | LOG_PID | LOG_NDELAY, facility);
698 case G_LOG_FLAG_FATAL:
699 syslog_level = LOG_ALERT;
701 case G_LOG_LEVEL_ERROR:
702 syslog_level = LOG_ERR;
704 case G_LOG_LEVEL_CRITICAL:
705 syslog_level = LOG_CRIT;
707 case G_LOG_LEVEL_WARNING:
708 syslog_level = LOG_WARNING;
710 case G_LOG_LEVEL_MESSAGE:
711 syslog_level = LOG_NOTICE;
713 case G_LOG_LEVEL_INFO:
714 syslog_level = LOG_INFO;
716 case G_LOG_LEVEL_DEBUG:
717 syslog_level = LOG_DEBUG;
720 syslog_level = LOG_INFO;
727 if (messagelen > 1000)
730 char *message_aux, *message_aux2;
733 message_aux2 = g_strdup (message);
734 message_aux = message_aux2;
735 for (pos = 0; pos <= messagelen; pos = pos +
sizeof (buffer) - 1)
737 memcpy (buffer, message_aux,
sizeof (buffer) - 1);
738 buffer[
sizeof (buffer) - 1] =
'\0';
739 message_aux = &(message_aux[
sizeof (buffer) - 1]);
740 syslog (syslog_level,
"%s", buffer);
742 g_free (message_aux2);
745 syslog (syslog_level,
"%s", message);
756 channel = g_io_channel_new_file (log_file,
"a", &error);
759 gchar *log = g_strdup (log_file);
760 gchar *dir = dirname (log);
766 if (error->code != G_FILE_ERROR_NOENT)
767 fprintf (stderr,
"Can not open '%s' logfile: %s\n", log_file,
769 g_error_free (error);
772 if (g_mkdir_with_parents (dir, 0755))
774 g_warning (
"Failed to create log file directory %s: %s", dir,
778 g_free (prepend_buf);
785 channel = g_io_channel_new_file (log_file,
"a", &error);
788 g_error (
"Can not open '%s' logfile: %s", log_file,
794 if (log_domain_entry != NULL)
797 g_io_channel_write_chars (channel, (
const gchar *) tmpstr, -1, NULL,
799 g_io_channel_flush (channel, NULL);
803 g_free (prepend_buf);
820 g_log (
"x gnutls", G_LOG_LEVEL_INFO,
"tls(%d): %s", level, message);
835 GIOChannel *channel = NULL;
836 GError *error = NULL;
837 gchar *log_file = NULL;
840 log_file = log_domain_entry->
log_file;
846 if (!g_strcmp0 (log_file,
""))
850 if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
853 channel = g_io_channel_new_file (log_file,
"a", &error);
856 gchar *log = g_strdup (log_file);
857 gchar *dir = dirname (log);
860 if (g_mkdir_with_parents (dir, 0755))
869 channel = g_io_channel_new_file (log_file,
"a", &error);
889 GSList *log_domain_list_tmp;
893 if (gvm_log_config_list != NULL)
896 log_domain_list_tmp = (GSList *) gvm_log_config_list;
898 while (log_domain_list_tmp != NULL)
903 log_domain_entry = log_domain_list_tmp->data;
910 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
916 (!strcmp (log_domain_entry,
"syslog")) ? gvm_syslog_func :
920 if (g_ascii_strcasecmp (log_domain_entry->
log_domain,
"*"))
924 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO
925 | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING
926 | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR
927 | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION),
928 (GLogFunc) logfunc, gvm_log_config_list);
932 g_log_set_default_handler ((GLogFunc) logfunc,
933 gvm_log_config_list);
937 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
942 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO | G_LOG_LEVEL_MESSAGE
943 | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL
944 | G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL
945 | G_LOG_FLAG_RECURSION),
void gvm_sentry_log(const char *message)
Send a message to Sentry server if it was initialized.
Implementation of sentry methods.
static int check_log_file(gvm_logging_t *log_domain_entry)
Check permissions of log file and log file directory.
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.
void free_log_reference(void)
Free the log reference object.
char * get_log_reference(void)
Get the log reference object.
void set_log_reference(char *ref)
Set the log reference object.
void log_func_for_gnutls(int level, const char *message)
This function logs debug messages from gnutls.
GSList * load_log_configuration(gchar *config_file)
Loads parameters from a config file into a linked list.
void free_log_configuration(GSList *log_domain_list)
Frees all resources loaded by the config loader.
gchar * get_time(gchar *time_fmt)
Returns time as specified in time_fmt strftime format.
static gint level_int_from_string(const gchar *level)
Return the integer corresponding to a log level string.
void gvm_log_unlock(void)
Unlock logger_mutex.
void gvm_log_lock(void)
Try to lock logger_mutex.
static GMutex * logger_mutex
static void gvm_log_lock_init(void)
Initialize logger_mutex mutex if it was not done before.
static gint facility_int_from_string(const gchar *facility)
Return the integer corresponding to a syslog facility string.
int setup_log_handlers(GSList *gvm_log_config_list)
Sets up routing of logdomains to log handlers.
void gvm_log_silent(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer gvm_log_config_list)
Returns immediately.
Implementation of logging methods.
Logging stores the parameters loaded from a log configuration.
gchar * prepend_string
Prepend this string before every message.
gchar * prepend_time_format
If prependstring has t, format for strftime.
gchar * syslog_ident
Syslog ident to use for syslog logging.
gchar * prepend_separator
gchar * syslog_facility
Syslog facility to use for syslog logging.
GIOChannel * log_channel
Gio Channel - FD holder for logfile.
gchar * log_domain
Affected logdomain e.g libnasl.
gchar * log_file
Where to log to.
GLogLevelFlags * default_level
What severity level to use as default.