summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/logging.c
diff options
context:
space:
mode:
authorAmar Tumballi <amar@gluster.com>2011-03-16 09:38:21 +0000
committerVijay Bellur <vijay@dev.gluster.com>2011-03-17 11:57:11 -0700
commitebe47d5dae42da18b289e7be44eb67a8157a56b1 (patch)
tree13d3c68f86ca5dec97f8a1ca183d801bc9d3c92b /libglusterfs/src/logging.c
parentce01662eefb575d1afe397486653920ec101f40f (diff)
libglusterfs: gf_log_nomem() and other minor updates
log will be done when the memory allocation fails, hence in code, no explicit logs required for memory allocation failures. also, if there are logs before actually doing a log_init(), they will be logged in 'stderr'. Signed-off-by: Amar Tumballi <amar@gluster.com> Signed-off-by: Vijay Bellur <vijay@dev.gluster.com> BUG: 2346 (Log message enhancements in GlusterFS - phase 1) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2346
Diffstat (limited to 'libglusterfs/src/logging.c')
-rw-r--r--libglusterfs/src/logging.c173
1 files changed, 148 insertions, 25 deletions
diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c
index ed024840aa4..4c6bc2ed73e 100644
--- a/libglusterfs/src/logging.c
+++ b/libglusterfs/src/logging.c
@@ -48,8 +48,8 @@ static pthread_mutex_t logfile_mutex;
static char *filename = NULL;
static uint8_t logrotate = 0;
static FILE *logfile = NULL;
-static gf_loglevel_t loglevel = GF_LOG_MAX;
-static int gf_log_syslog = 0;
+static gf_loglevel_t loglevel = GF_LOG_INFO;
+static int gf_log_syslog = 1;
char gf_log_xl_log_set;
gf_loglevel_t gf_log_loglevel; /* extern'd */
@@ -115,6 +115,18 @@ gf_log_fini (void)
}
+void
+gf_log_globals_init (void)
+{
+ pthread_mutex_init (&logfile_mutex, NULL);
+
+#ifdef GF_LINUX_HOST_OS
+ /* For the 'syslog' output. one can grep 'GlusterFS' in syslog
+ for serious logs */
+ openlog ("GlusterFS", LOG_PID, LOG_DAEMON);
+#endif
+}
+
int
gf_log_init (const char *file)
{
@@ -123,8 +135,6 @@ gf_log_init (const char *file)
return -1;
}
- pthread_mutex_init (&logfile_mutex, NULL);
-
filename = gf_strdup (file);
if (!filename) {
fprintf (stderr, "gf_log_init: strdup error\n");
@@ -140,12 +150,6 @@ gf_log_init (const char *file)
return -1;
}
-#ifdef GF_LINUX_HOST_OS
- /* For the 'syslog' output. one can grep 'GlusterFS' in syslog
- for serious logs */
- openlog ("GlusterFS", LOG_PID, LOG_DAEMON);
-#endif
-
gf_log_logfile = logfile;
return 0;
@@ -170,8 +174,6 @@ struct _log_msg {
};
-
-
void
gf_log_lock (void)
{
@@ -193,6 +195,123 @@ gf_log_cleanup (void)
}
int
+_gf_log_nomem (const char *domain, const char *file,
+ const char *function, int line, gf_loglevel_t level,
+ size_t size)
+{
+ const char *basename = NULL;
+ struct tm *tm = NULL;
+ xlator_t *this = NULL;
+ struct timeval tv = {0,};
+ int ret = 0;
+ gf_loglevel_t xlator_loglevel = 0;
+ char msg[8092];
+ char timestr[256];
+ char callstr[4096];
+
+ this = THIS;
+
+ xlator_loglevel = this->loglevel;
+ if (xlator_loglevel == 0)
+ xlator_loglevel = loglevel;
+
+ if (level > xlator_loglevel)
+ goto out;
+
+ static char *level_strings[] = {"", /* NONE */
+ "M", /* EMERGENCY */
+ "A", /* ALERT */
+ "C", /* CRITICAL */
+ "E", /* ERROR */
+ "W", /* WARNING */
+ "N", /* NOTICE */
+ "I", /* INFO/NORMAL */
+ "D", /* DEBUG */
+ "T", /* TRACE */
+ ""};
+
+ if (!domain || !file || !function) {
+ fprintf (stderr,
+ "logging: %s:%s():%d: invalid argument\n",
+ __FILE__, __PRETTY_FUNCTION__, __LINE__);
+ return -1;
+ }
+
+#if HAVE_BACKTRACE
+ /* Print 'calling function' */
+ do {
+ void *array[5];
+ char **callingfn = NULL;
+ size_t bt_size = 0;
+
+ bt_size = backtrace (array, 5);
+ if (bt_size)
+ callingfn = backtrace_symbols (&array[2], bt_size-2);
+ if (!callingfn)
+ break;
+
+ if (bt_size == 5)
+ snprintf (callstr, 4096, "(-->%s (-->%s (-->%s)))",
+ callingfn[2], callingfn[1], callingfn[0]);
+ if (bt_size == 4)
+ snprintf (callstr, 4096, "(-->%s (-->%s))",
+ callingfn[1], callingfn[0]);
+ if (bt_size == 3)
+ snprintf (callstr, 4096, "(-->%s)", callingfn[0]);
+
+ free (callingfn);
+ } while (0);
+#endif /* HAVE_BACKTRACE */
+
+ ret = gettimeofday (&tv, NULL);
+ if (-1 == ret)
+ goto out;
+
+ tm = localtime (&tv.tv_sec);
+
+ pthread_mutex_lock (&logfile_mutex);
+ {
+ strftime (timestr, 256, "%Y-%m-%d %H:%M:%S", tm);
+ snprintf (timestr + strlen (timestr), 256 - strlen (timestr),
+ ".%"GF_PRI_SUSECONDS, tv.tv_usec);
+
+ basename = strrchr (file, '/');
+ if (basename)
+ basename++;
+ else
+ basename = file;
+
+ ret = sprintf (msg, "[%s] %s [%s:%d:%s] %s %s: no memory "
+ "available for size (%"GF_PRI_SIZET")",
+ timestr, level_strings[level],
+ basename, line, function, callstr,
+ domain, size);
+ if (-1 == ret) {
+ goto unlock;
+ }
+
+ if (logfile) {
+ fprintf (logfile, "%s\n", msg);
+ fflush (logfile);
+ } else {
+ fprintf (stderr, "%s\n", msg);
+ }
+
+#ifdef GF_LINUX_HOST_OS
+ /* We want only serious log in 'syslog', not our debug
+ and trace logs */
+ if (gf_log_syslog && level && (level <= GF_LOG_ERROR))
+ syslog ((level-1), "%s\n", msg);
+#endif
+ }
+
+unlock:
+ pthread_mutex_unlock (&logfile_mutex);
+out:
+ return ret;
+ }
+
+int
_gf_log_callingfn (const char *domain, const char *file, const char *function,
int line, gf_loglevel_t level, const char *fmt, ...)
{
@@ -210,9 +329,6 @@ _gf_log_callingfn (const char *domain, const char *file, const char *function,
gf_loglevel_t xlator_loglevel = 0;
va_list ap;
- if (!logfile)
- return -1;
-
this = THIS;
xlator_loglevel = this->loglevel;
@@ -308,13 +424,17 @@ _gf_log_callingfn (const char *domain, const char *file, const char *function,
strcpy (msg, str1);
strcpy (msg + len, str2);
- fprintf (logfile, "%s\n", msg);
- fflush (logfile);
+ if (logfile) {
+ fprintf (logfile, "%s\n", msg);
+ fflush (logfile);
+ } else {
+ fprintf (stderr, "%s\n", msg);
+ }
#ifdef GF_LINUX_HOST_OS
/* We want only serious log in 'syslog', not our debug
and trace logs */
- if (gf_log_syslog && level && (level <= GF_LOG_ERROR))
+ if (gf_log_syslog && level && (level <= GF_LOG_CRITICAL))
syslog ((level-1), "%s\n", msg);
#endif
}
@@ -355,9 +475,6 @@ _gf_log (const char *domain, const char *file, const char *function, int line,
xlator_t *this = NULL;
gf_loglevel_t xlator_loglevel = 0;
- if (!logfile)
- return -1;
-
this = THIS;
xlator_loglevel = this->loglevel;
@@ -398,7 +515,9 @@ _gf_log (const char *domain, const char *file, const char *function, int line,
goto log;
}
- fclose (logfile);
+ if (logfile)
+ fclose (logfile);
+
gf_log_logfile = logfile = new_logfile;
}
@@ -444,13 +563,17 @@ log:
strcpy (msg, str1);
strcpy (msg + len, str2);
- fprintf (logfile, "%s\n", msg);
- fflush (logfile);
+ if (logfile) {
+ fprintf (logfile, "%s\n", msg);
+ fflush (logfile);
+ } else {
+ fprintf (stderr, "%s\n", msg);
+ }
#ifdef GF_LINUX_HOST_OS
/* We want only serious log in 'syslog', not our debug
and trace logs */
- if (gf_log_syslog && level && (level <= GF_LOG_ERROR))
+ if (gf_log_syslog && level && (level <= GF_LOG_CRITICAL))
syslog ((level-1), "%s\n", msg);
#endif
}