{GPL, other}: Relicense to MIT license.
[collectd.git] / src / logfile.c
index 71ddec6..b75ecb8 100644 (file)
@@ -1,24 +1,29 @@
 /**
  * collectd - src/logfile.c
- * Copyright (C) 2007  Sebastian Harl
+ * Copyright (C) 2007       Sebastian Harl
  * Copyright (C) 2007,2008  Florian Forster
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; only version 2 of the License is applicable.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  *
  * Authors:
  *   Sebastian Harl <sh at tokkee.org>
- *   Florian Forster <octo at verplant.org>
+ *   Florian Forster <octo at collectd.org>
  **/
 
 #include "collectd.h"
@@ -39,37 +44,26 @@ static pthread_mutex_t file_lock = PTHREAD_MUTEX_INITIALIZER;
 
 static char *log_file = NULL;
 static int print_timestamp = 1;
-static int print_level = 0;
+static int print_severity = 0;
 
 static const char *config_keys[] =
 {
        "LogLevel",
        "File",
        "Timestamp",
-       "PrintLevel"
+       "PrintSeverity"
 };
 static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
 static int logfile_config (const char *key, const char *value)
 {
        if (0 == strcasecmp (key, "LogLevel")) {
-               if ((0 == strcasecmp (value, "emerg"))
-                               || (0 == strcasecmp (value, "alert"))
-                               || (0 == strcasecmp (value, "crit"))
-                               || (0 == strcasecmp (value, "err")))
-                       log_level = LOG_ERR;
-               else if (0 == strcasecmp (value, "warning"))
-                       log_level = LOG_WARNING;
-               else if (0 == strcasecmp (value, "notice"))
-                       log_level = LOG_NOTICE;
-               else if (0 == strcasecmp (value, "info"))
+               log_level = parse_log_severity(value);
+               if (log_level < 0) {
                        log_level = LOG_INFO;
-#if COLLECT_DEBUG
-               else if (0 == strcasecmp (value, "debug"))
-                       log_level = LOG_DEBUG;
-#endif /* COLLECT_DEBUG */
-               else
-                       return 1;
+                       ERROR ("logfile: invalid loglevel [%s] defaulting to 'info'", value);
+                       return (1);
+               }
        }
        else if (0 == strcasecmp (key, "File")) {
                sfree (log_file);
@@ -80,11 +74,11 @@ static int logfile_config (const char *key, const char *value)
                        print_timestamp = 0;
                else
                        print_timestamp = 1;
-       } else if (0 == strcasecmp(key, "PrintLevel")) {
+       } else if (0 == strcasecmp(key, "PrintSeverity")) {
                if (IS_FALSE (value))
-                       print_level = 0;
+                       print_severity = 0;
                else
-                       print_level = 1;
+                       print_severity = 1;
        }
        else {
                return -1;
@@ -92,32 +86,33 @@ static int logfile_config (const char *key, const char *value)
        return 0;
 } /* int logfile_config (const char *, const char *) */
 
-static void logfile_print (const char *msg, int severity, time_t timestamp_time)
+static void logfile_print (const char *msg, int severity,
+               cdtime_t timestamp_time)
 {
        FILE *fh;
-       int do_close = 0;
+       _Bool do_close = 0;
        struct tm timestamp_tm;
        char timestamp_str[64];
-       char level_str[16];
+       char level_str[16] = "";
 
-       if (print_level)
+       if (print_severity)
        {
                switch (severity)
                {
                case LOG_ERR:
-                       snprintf(level_str, 15, "[error] ");
+                       snprintf(level_str, sizeof (level_str), "[error] ");
                        break;  
                case LOG_WARNING:
-                       snprintf(level_str, 15, "[warning] ");
+                       snprintf(level_str, sizeof (level_str), "[warning] ");
                        break;
                case LOG_NOTICE:
-                       snprintf(level_str, 15, "[notice] ");
+                       snprintf(level_str, sizeof (level_str), "[notice] ");
                        break;  
                case LOG_INFO:
-                       snprintf(level_str, 15, "[info] ");
+                       snprintf(level_str, sizeof (level_str), "[info] ");
                        break;  
                case LOG_DEBUG:
-                       snprintf(level_str, 15, "[debug] ");
+                       snprintf(level_str, sizeof (level_str), "[debug] ");
                        break;  
                default:
                        break;
@@ -126,7 +121,8 @@ static void logfile_print (const char *msg, int severity, time_t timestamp_time)
 
        if (print_timestamp)
        {
-               localtime_r (&timestamp_time, &timestamp_tm);
+               time_t tt = CDTIME_T_TO_TIME_T (timestamp_time);
+               localtime_r (&tt, &timestamp_tm);
 
                strftime (timestamp_str, sizeof (timestamp_str), "%Y-%m-%d %H:%M:%S",
                                &timestamp_tm);
@@ -160,15 +156,15 @@ static void logfile_print (const char *msg, int severity, time_t timestamp_time)
        else
        {
                if (print_timestamp)
-                       fprintf (fh, "[%s] %s%s\n", timestamp_str,
-                                       print_level ? level_str : "",
-                                       msg);
+                       fprintf (fh, "[%s] %s%s\n", timestamp_str, level_str, msg);
                else
-                       fprintf (fh, "%s%s\n", print_level ? level_str : "",
-                                               msg);
+                       fprintf (fh, "%s%s\n", level_str, msg);
 
-               if (do_close != 0)
+               if (do_close) {
                        fclose (fh);
+               } else {
+                       fflush(fh);
+               }
        }
 
        pthread_mutex_unlock (&file_lock);
@@ -182,7 +178,7 @@ static void logfile_log (int severity, const char *msg,
        if (severity > log_level)
                return;
 
-       logfile_print (msg, severity, time (NULL));
+       logfile_print (msg, severity, cdtime ());
 } /* void logfile_log (int, const char *) */
 
 static int logfile_notification (const notification_t *n,
@@ -221,7 +217,7 @@ static int logfile_notification (const notification_t *n,
        buf[sizeof (buf) - 1] = '\0';
 
        logfile_print (buf, LOG_INFO,
-                       (n->time > 0) ? n->time : time (NULL));
+                       (n->time != 0) ? n->time : cdtime ());
 
        return (0);
 } /* int logfile_notification */