36#define G_LOG_DOMAIN "libgvm base"
61 gchar buf[80], *original_tz;
68 original_tz = getenv (
"TZ") ? g_strdup (getenv (
"TZ")) : NULL;
77 localtime_r (&now, &ts);
78 strftime (buf,
sizeof (buf), time_fmt, &ts);
85 setenv (
"TZ", original_tz, 1);
93 return g_strdup_printf (
"%s", buf);
106 if (level && strlen (level) > 0)
108 if (level[0] >=
'0' && level[0] <=
'9')
110 if (strcasecmp (level,
"critical") == 0)
111 return G_LOG_LEVEL_CRITICAL;
112 if (strcasecmp (level,
"debug") == 0)
113 return G_LOG_LEVEL_DEBUG;
114 if (strcasecmp (level,
"error") == 0)
115 return G_LOG_LEVEL_ERROR;
116 if (strcasecmp (level,
"info") == 0)
117 return G_LOG_LEVEL_INFO;
118 if (strcasecmp (level,
"message") == 0)
119 return G_LOG_LEVEL_MESSAGE;
120 if (strcasecmp (level,
"warning") == 0)
121 return G_LOG_LEVEL_WARNING;
137 if (facility && strlen (facility) > 0)
140 while (facilitynames[i].c_name != NULL)
142 if (g_ascii_strcasecmp (facility, facilitynames[i].c_name) == 0)
143 return facilitynames[i].c_val;
165 GError *error = NULL;
176 GSList *log_domain_list = NULL;
179 key_file = g_key_file_new ();
180 flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
183 if (!g_key_file_load_from_file (key_file, config_file, flags, &error))
185 g_error (
"%s: %s", config_file, error->message);
189 groups = g_key_file_get_groups (key_file, NULL);
194 while (*group != NULL)
201 if (g_key_file_has_key (key_file, *group,
"prepend", &error))
205 g_key_file_get_value (key_file, *group,
"prepend", &error));
209 if (g_key_file_has_key (key_file, *group,
"separator", &error))
213 g_key_file_get_value (key_file, *group,
"separator", &error));
217 if (g_key_file_has_key (key_file, *group,
"prepend_time_format", &error))
221 g_key_file_get_value (key_file, *group,
"prepend_time_format",
226 if (g_key_file_has_key (key_file, *group,
"file", &error))
230 g_key_file_get_value (key_file, *group,
"file", &error));
234 if (g_key_file_has_key (key_file, *group,
"level", &error))
238 level = g_key_file_get_value (key_file, *group,
"level", &error);
239 level = g_strchug (level);
246 if (g_key_file_has_key (key_file, *group,
"syslog_facility", &error))
250 g_key_file_get_value (key_file, *group,
"syslog_facility", &error));
254 g_strdup (
"local0"));
257 if (g_key_file_has_key (key_file, *group,
"syslog_ident", &error))
261 g_key_file_get_value (key_file, *group,
"syslog_ident", &error));
268 log_domain_list = g_slist_prepend (log_domain_list, log_domain_entry);
275 g_key_file_free (key_file);
277 return log_domain_list;
288 GSList *log_domain_list_tmp;
295 log_domain_list_tmp = log_domain_list;
296 while (log_domain_list_tmp != NULL)
301 log_domain_entry = log_domain_list_tmp->data;
307 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
310 g_slist_free (log_domain_list);
323 const char *message, gpointer gvm_log_config_list)
328 (void) gvm_log_config_list;
429 const char *message, gpointer gvm_log_config_list)
440 GSList *log_domain_list_tmp;
444 GIOChannel *channel = NULL;
445 GError *error = NULL;
450 gchar *prepend_format =
"%t %s %p - ";
451 gchar *time_format =
"%Y-%m-%d %Hh%M.%S %Z";
452 gchar *log_separator =
":";
453 gchar *log_file =
"-";
454 GLogLevelFlags default_level = G_LOG_LEVEL_DEBUG;
455 gchar *syslog_facility =
"local0";
456 gchar *syslog_ident = NULL;
462 if (gvm_log_config_list != NULL && log_domain != NULL)
465 log_domain_list_tmp = (GSList *) gvm_log_config_list;
467 while (log_domain_list_tmp != NULL)
471 entry = log_domain_list_tmp->data;
479 log_domain_entry = entry;
505 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
512 if (gvm_log_config_list != NULL && log_domain != NULL)
515 log_domain_list_tmp = (GSList *) gvm_log_config_list;
517 while (log_domain_list_tmp != NULL)
521 entry = log_domain_list_tmp->data;
529 log_domain_entry = entry;
558 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
565 if (default_level < log_level)
569 prepend_buf = g_strdup (
"");
572 tmp = prepend_format;
577 if ((*tmp ==
'%') && (*(tmp + 1) ==
'p'))
582 g_strdup_printf (
"%s%d%s%s", prepend_buf, (
int) getpid (),
590 g_strdup_printf (
"%s%d", prepend_buf, (
int) getpid ());
593 g_free (prepend_buf);
595 prepend_buf = prepend_tmp;
599 else if ((*tmp ==
'%') && (*(tmp + 1) ==
't'))
604 prepend_tmp1 =
get_time (time_format);
607 prepend_tmp1 = g_strdup (
"");
612 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, prepend_tmp1);
614 g_free (prepend_tmp1);
616 g_free (prepend_buf);
618 prepend_buf = prepend_tmp;
622 else if ((*tmp ==
'%') && (*(tmp + 1) ==
's'))
627 prepend_tmp = g_strdup_printf (
"%s%s", prepend_buf, log_separator);
629 g_free (prepend_buf);
631 prepend_buf = prepend_tmp;
647 case G_LOG_FLAG_RECURSION:
648 prepend = g_strdup_printf (
"RECURSION%s%s", log_separator, prepend_buf);
651 case G_LOG_FLAG_FATAL:
652 prepend = g_strdup_printf (
"FATAL%s%s", log_separator, prepend_buf);
655 case G_LOG_LEVEL_ERROR:
656 prepend = g_strdup_printf (
"ERROR%s%s", log_separator, prepend_buf);
659 case G_LOG_LEVEL_CRITICAL:
660 prepend = g_strdup_printf (
"CRITICAL%s%s", log_separator, prepend_buf);
663 case G_LOG_LEVEL_WARNING:
664 prepend = g_strdup_printf (
"WARNING%s%s", log_separator, prepend_buf);
667 case G_LOG_LEVEL_MESSAGE:
668 prepend = g_strdup_printf (
"MESSAGE%s%s", log_separator, prepend_buf);
671 case G_LOG_LEVEL_INFO:
672 prepend = g_strdup_printf (
" INFO%s%s", log_separator, prepend_buf);
675 case G_LOG_LEVEL_DEBUG:
676 prepend = g_strdup_printf (
" DEBUG%s%s", log_separator, prepend_buf);
680 prepend = g_strdup_printf (
"UNKNOWN%s%s", log_separator, prepend_buf);
689 messagelen = message ? strlen (message) : 0;
690 if (messagelen > 1 && message[messagelen - 1] ==
'\n')
692 tmpstr = g_strdup_printf (
"%s%s%s%s %.*s\n", log_domain ? log_domain :
"",
693 log_separator, prepend, log_separator, messagelen,
697 if (log_level <= G_LOG_LEVEL_WARNING)
702 if (!log_file || g_ascii_strcasecmp (log_file,
"-") == 0
703 || !g_strcmp0 (log_file,
""))
705 fprintf (stderr,
"%s", tmpstr);
709 else if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
712 int syslog_level = LOG_INFO;
714 openlog (syslog_ident, LOG_CONS | LOG_PID | LOG_NDELAY, facility);
718 case G_LOG_FLAG_FATAL:
719 syslog_level = LOG_ALERT;
721 case G_LOG_LEVEL_ERROR:
722 syslog_level = LOG_ERR;
724 case G_LOG_LEVEL_CRITICAL:
725 syslog_level = LOG_CRIT;
727 case G_LOG_LEVEL_WARNING:
728 syslog_level = LOG_WARNING;
730 case G_LOG_LEVEL_MESSAGE:
731 syslog_level = LOG_NOTICE;
733 case G_LOG_LEVEL_INFO:
734 syslog_level = LOG_INFO;
736 case G_LOG_LEVEL_DEBUG:
737 syslog_level = LOG_DEBUG;
740 syslog_level = LOG_INFO;
747 if (messagelen > 1000)
750 char *message_aux, *message_aux2;
753 message_aux2 = g_strdup (message);
754 message_aux = message_aux2;
755 for (pos = 0; pos <= messagelen; pos = pos +
sizeof (buffer) - 1)
757 memcpy (buffer, message_aux,
sizeof (buffer) - 1);
758 buffer[
sizeof (buffer) - 1] =
'\0';
759 message_aux = &(message_aux[
sizeof (buffer) - 1]);
760 syslog (syslog_level,
"%s", buffer);
762 g_free (message_aux2);
765 syslog (syslog_level,
"%s", message);
776 channel = g_io_channel_new_file (log_file,
"a", &error);
779 gchar *log = g_strdup (log_file);
780 gchar *dir = dirname (log);
786 if (error->code != G_FILE_ERROR_NOENT)
787 fprintf (stderr,
"Can not open '%s' logfile: %s\n", log_file,
789 g_error_free (error);
792 if (g_mkdir_with_parents (dir, 0755))
794 g_warning (
"Failed to create log file directory %s: %s", dir,
798 g_free (prepend_buf);
805 channel = g_io_channel_new_file (log_file,
"a", &error);
808 g_error (
"Can not open '%s' logfile: %s", log_file,
814 if (log_domain_entry != NULL)
817 g_io_channel_write_chars (channel, (
const gchar *) tmpstr, -1, NULL,
819 g_io_channel_flush (channel, NULL);
823 g_free (prepend_buf);
840 g_log (
"x gnutls", G_LOG_LEVEL_INFO,
"tls(%d): %s", level, message);
855 GIOChannel *channel = NULL;
856 GError *error = NULL;
857 const gchar *log_file;
863 if (!log_file || g_ascii_strcasecmp (log_file,
"-") == 0
864 || !g_strcmp0 (log_file,
""))
868 if (g_ascii_strcasecmp (log_file,
"syslog") == 0)
871 channel = g_io_channel_new_file (log_file,
"a", &error);
874 gchar *log = g_strdup (log_file);
875 gchar *dir = dirname (log);
878 if (g_mkdir_with_parents (dir, 0755))
887 channel = g_io_channel_new_file (log_file,
"a", &error);
906 log_tz = tz ? g_strdup (tz) : NULL;
911 GLogFunc default_log_func,
912 GLogFunc default_domain_log_func)
914 GSList *log_domain_list_tmp;
918 if (gvm_log_config_list != NULL)
921 log_domain_list_tmp = (GSList *) gvm_log_config_list;
923 while (log_domain_list_tmp != NULL)
928 log_domain_entry = log_domain_list_tmp->data;
935 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
939 if (g_ascii_strcasecmp (
944 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO
945 | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING
946 | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR
947 | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION),
948 (GLogFunc) log_func, gvm_log_config_list);
952 g_log_set_default_handler (default_log_func, gvm_log_config_list);
956 log_domain_list_tmp = g_slist_next (log_domain_list_tmp);
961 (GLogLevelFlags) (G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_INFO | G_LOG_LEVEL_MESSAGE
962 | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL
963 | G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL
964 | G_LOG_FLAG_RECURSION),
965 default_domain_log_func, gvm_log_config_list);
void gvm_sentry_log(const char *message)
Send a message to Sentry server if it was initialized.
Definition gvm_sentry.c:97
Implementation of sentry methods.
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.
Definition logging.c:428
void free_log_reference(void)
Free the log reference object.
Definition logging.c:412
char * get_log_reference(void)
Get the log reference object.
Definition logging.c:400
void set_log_reference(char *ref)
Set the log reference object.
Definition logging.c:384
static int check_log_file(gvm_logging_domain_t *log_domain_entry)
Check permissions of log file and log file directory.
Definition logging.c:853
void log_func_for_gnutls(int level, const char *message)
This function logs debug messages from gnutls.
Definition logging.c:838
GSList * load_log_configuration(gchar *config_file)
Loads parameters from a config file into a linked list.
Definition logging.c:161
void free_log_configuration(GSList *log_domain_list)
Frees all resources loaded by the config loader.
Definition logging.c:286
gchar * get_time(gchar *time_fmt)
Returns time as specified in time_fmt strftime format.
Definition logging.c:57
static gint level_int_from_string(const gchar *level)
Return the integer corresponding to a log level string.
Definition logging.c:104
void gvm_log_unlock(void)
Unlock logger_mutex.
Definition logging.c:363
static gchar * log_tz
Timezone to use for logs.
Definition logging.c:43
void gvm_log_lock(void)
Try to lock logger_mutex.
Definition logging.c:351
static GMutex * logger_mutex
Definition logging.c:332
void set_log_tz(const gchar *tz)
Set the log timezone.
Definition logging.c:903
static void gvm_log_lock_init(void)
Initialize logger_mutex mutex if it was not done before.
Definition logging.c:338
static gint facility_int_from_string(const gchar *facility)
Return the integer corresponding to a syslog facility string.
Definition logging.c:135
static char * reference
Definition logging.c:368
int setup_log_handlers(GSList *gvm_log_config_list)
Sets up routing of logdomains to log handlers.
Definition logging.c:981
void gvm_log_silent(const char *log_domain, GLogLevelFlags log_level, const char *message, gpointer gvm_log_config_list)
Returns immediately.
Definition logging.c:322
static int setup_log_handlers_internal(GSList *gvm_log_config_list, GLogFunc log_func, GLogFunc default_log_func, GLogFunc default_domain_log_func)
Definition logging.c:910
Implementation of logging methods.
void gvm_logging_domain_set_prepend_separator(gvm_logging_domain_t *log_domain, gchar *prepend_separator)
Sets the prepend separator for the logging domain.
Definition logging_domain.c:337
GIOChannel * gvm_logging_domain_get_log_channel(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:355
void gvm_logging_domain_set_log_file(gvm_logging_domain_t *log_domain, gchar *log_file)
Sets the log file for the logging domain.
Definition logging_domain.c:133
void gvm_logging_domain_set_syslog_ident(gvm_logging_domain_t *log_domain, gchar *syslog_ident)
Sets the syslog ident for the logging domain.
Definition logging_domain.c:303
void gvm_logging_domain_set_prepend_time_format(gvm_logging_domain_t *log_domain, gchar *prepend_time_format)
Sets the prepend time format for the logging domain.
Definition logging_domain.c:202
void gvm_logging_domain_set_syslog_facility(gvm_logging_domain_t *log_domain, gchar *syslog_facility)
Sets the syslog facility for the logging domain.
Definition logging_domain.c:270
GLogLevelFlags * gvm_logging_domain_get_default_level(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:220
gvm_logging_domain_t * gvm_logging_domain_new(gchar *log_domain)
Function to initialize logging instance.
Definition logging_domain.c:40
gchar * gvm_logging_domain_get_prepend_time_format(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:185
gchar * gvm_logging_domain_get_syslog_ident(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:288
void gvm_logging_domain_set_log_channel(gvm_logging_domain_t *log_domain, GIOChannel *log_channel)
Sets the log channel for the logging domain.
Definition logging_domain.c:370
void gvm_logging_domain_free(gvm_logging_domain_t *log_domain)
Frees the resources associated with the given logging domain.
Definition logging_domain.c:72
gchar * gvm_logging_domain_get_log_file(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:117
void gvm_logging_domain_set_prepend_string(gvm_logging_domain_t *log_domain, gchar *prepend_string)
Sets the preprend string for the logging domain.
Definition logging_domain.c:167
gchar * gvm_logging_domain_get_log_domain(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:101
void gvm_logging_domain_set_default_level(gvm_logging_domain_t *log_domain, GLogLevelFlags default_level)
Sets the default log level for the logging domain.
Definition logging_domain.c:235
gchar * gvm_logging_domain_get_prepend_separator(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:321
gchar * gvm_logging_domain_get_prepend_string(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:151
gchar * gvm_logging_domain_get_syslog_facility(gvm_logging_domain_t *log_domain)
Definition logging_domain.c:254
Implementation of logging domain handling.
struct gvm_logging_domain gvm_logging_domain_t
Definition logging_domain.h:15