modified for systemd journal support
[framework/system/dlog.git] / log.c
diff --git a/log.c b/log.c
index d7be833..e973395 100755 (executable)
--- a/log.c
+++ b/log.c
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-#ifdef HAVE_PTHREADS
 #include <pthread.h>
-#endif
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <errno.h>
 #include <dlog.h>
-
+#ifdef SD_JOURNAL_SUPPORT
+#include <syslog.h>
+#include <systemd/sd-journal.h>
+#endif
 #define LOG_BUF_SIZE   1024
 
 #define LOG_MAIN       "log_main"
 #define LOG_SYSTEM     "log_system"
 #define LOG_APPS       "log_apps"
 
-
 static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1, -1 };
 
-static int g_debug_level= DLOG_SILENT;
+static int g_logging_on = 1;
+static int g_dlog_level = DLOG_SILENT;
 
 static int __dlog_init(log_id_t, log_priority, const char *tag, const char *msg);
 static int (*write_to_log)(log_id_t, log_priority, const char *tag, const char *msg) = __dlog_init;
-#ifdef HAVE_PTHREADS
 static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
-
 static int __write_to_log_null(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
 {
-    return -1;
+       return -1;
 }
-
 static int __write_to_log_kernel(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
 {
        ssize_t ret;
@@ -57,19 +52,22 @@ static int __write_to_log_kernel(log_id_t log_id, log_priority prio, const char
        struct iovec vec[3];
 
        if (log_id < LOG_ID_APPS) {
-               if(prio<g_debug_level) {
+               if(prio < g_dlog_level) {
                        return 0;
                }
        } else if (LOG_ID_MAX <= log_id) {
                return 0;
        }
-       if( log_id < LOG_ID_MAX )
+       if (log_id < LOG_ID_MAX)
                log_fd = log_fds[log_id];
        else
                return -1; // for TC
 
        if (!tag)
-                 tag = "";
+               tag = "";
+
+       if (!msg)
+               return -1;
 
        vec[0].iov_base = (unsigned char *) &prio;
        vec[0].iov_len  = 1;
@@ -82,80 +80,151 @@ static int __write_to_log_kernel(log_id_t log_id, log_priority prio, const char
 
        return ret;
 }
-
-void init_debug_level(void)
+static char dlog_pri_to_char (log_priority pri)
 {
-       char *debuglevel=getenv("TIZEN_DEBUG_LEVEL");
-       if(!debuglevel) {
-#ifndef NDEBUG
-               fprintf(stderr, "Not matched env. variable, TIZEN_DEBUG_LEVEL");
-#endif
-               return;
+       switch (pri) {
+               case DLOG_VERBOSE:       return 'V';
+               case DLOG_DEBUG:         return 'D';
+               case DLOG_INFO:          return 'I';
+               case DLOG_WARN:          return 'W';
+               case DLOG_ERROR:         return 'E';
+               case DLOG_FATAL:         return 'F';
+               case DLOG_SILENT:        return 'S';
+
+               case DLOG_DEFAULT:
+               case DLOG_UNKNOWN:
+               default:
+                                                                return '?';
        }
-       g_debug_level=atoi(debuglevel);
-#ifndef NDEBUG
-       fprintf(stderr, "debug level init %d(%s) \n",g_debug_level,debuglevel);
+}
+#ifdef SD_JOURNAL_SUPPORT
+static int dlog_pri_to_journal_pri(log_priority prio)
+{
+       int journal_prio = LOG_DEBUG;
+
+       switch(prio) {
+       case DLOG_UNKNOWN:
+       case DLOG_DEFAULT:
+       case DLOG_VERBOSE:
+               journal_prio = LOG_DEBUG;
+               break;
+       case DLOG_DEBUG:
+               journal_prio = LOG_DEBUG;
+               break;
+       case DLOG_INFO:
+               journal_prio = LOG_INFO;
+               break;
+       case DLOG_WARN:
+               journal_prio = LOG_WARNING;
+               break;
+       case DLOG_ERROR:
+               journal_prio = LOG_ERR;
+               break;
+       case DLOG_FATAL:
+               journal_prio = LOG_CRIT;
+               break;
+       case DLOG_SILENT:
+       default:
+               journal_prio = -1;
+               break;
+       }
+       return journal_prio;
+}
+static int __write_to_log_sd_journal_print(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
+{
+       ssize_t ret;
+       int log_fd;
+
+       if (log_id < LOG_ID_APPS) {
+               if(prio < g_dlog_level) {
+                       return 0;
+               }
+       } else if (LOG_ID_MAX <= log_id) {
+               return 0;
+       }
+       if (log_id < LOG_ID_MAX)
+               log_fd = log_fds[log_id];
+       else
+               return -1;
+       return sd_journal_print(dlog_pri_to_journal_pri(prio), "%c %s: %s",dlog_pri_to_char(prio), tag, msg);
+}
 #endif
+void init_dlog_level(void)
+{
+       char *dlog_level_env;
+       char *logging_mode_env;
+       if (g_logging_on) {
+               logging_mode_env = getenv("TIZEN_PLATFORMLOGGING_MODE");
+               if (!logging_mode_env)
+                               g_logging_on = 0;
+                       else
+                               g_logging_on = atoi(logging_mode_env);
+       }
+       if (g_logging_on) {
+               dlog_level_env = getenv("TIZEN_DLOG_LEVEL");
+               if (!dlog_level_env) {
+                       g_dlog_level = 8;
+               } else {
+                       g_dlog_level = atoi(dlog_level_env);
+               }
+       } else
+               g_dlog_level = 8;
 }
 static int __dlog_init(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
 {
-#ifdef HAVE_PTHREADS
-               pthread_mutex_lock(&log_init_lock);
-#endif
+       pthread_mutex_lock(&log_init_lock);
        // get filtering info
-
        // open device
-       if( write_to_log == __dlog_init)
-       {
+       if (write_to_log == __dlog_init) {
+               init_dlog_level();
+
                log_fds[LOG_ID_MAIN] = open("/dev/"LOG_MAIN, O_WRONLY);
                log_fds[LOG_ID_RADIO] = open("/dev/"LOG_RADIO, O_WRONLY);
                log_fds[LOG_ID_SYSTEM] = open("/dev/"LOG_SYSTEM, O_WRONLY);
                log_fds[LOG_ID_APPS] = open("/dev/"LOG_APPS, O_WRONLY);
 
-               init_debug_level();
-
-               if( log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0 )
-               {
+               if (log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0) {
                        fprintf(stderr, "open log dev is failed\n");
                        write_to_log = __write_to_log_null;
-               }
-               else
+               } else {
+#ifdef SD_JOURNAL_SUPPORT
+                       write_to_log = __write_to_log_sd_journal_print;
+#else
                        write_to_log = __write_to_log_kernel;
+#endif
+               }
 
-               if( log_fds[LOG_ID_SYSTEM] < 0 )
-               {
+               if (log_fds[LOG_ID_SYSTEM] < 0)
                        log_fds[LOG_ID_SYSTEM] = log_fds[LOG_ID_MAIN];
-               }
 
-               if( log_fds[LOG_ID_APPS] < 0 )
-               {
+               if (log_fds[LOG_ID_APPS] < 0)
                        log_fds[LOG_ID_APPS] = log_fds[LOG_ID_MAIN];
-               }
        }
-#ifdef HAVE_PTHREADS
-    pthread_mutex_unlock(&log_init_lock);
-#endif
+       pthread_mutex_unlock(&log_init_lock);
        return write_to_log(log_id, prio, tag, msg);
 }
 
 int __dlog_vprint(log_id_t log_id, int prio, const char *tag, const char *fmt, va_list ap)
 {
-    char buf[LOG_BUF_SIZE];
+       char buf[LOG_BUF_SIZE];
 
-    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+       vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
 
-    return write_to_log(log_id, prio, tag, buf);
+       return write_to_log(log_id, prio, tag, buf);
 }
 
 int __dlog_print(log_id_t log_id, int prio, const char *tag, const char *fmt, ...)
 {
-    va_list ap;
-    char buf[LOG_BUF_SIZE];
+       va_list ap;
+       char buf[LOG_BUF_SIZE];
 
-    va_start(ap, fmt);
-    vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
-    va_end(ap);
+       va_start(ap, fmt);
+       vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+       va_end(ap);
 
-    return write_to_log(log_id, prio, tag, buf);
+       return write_to_log(log_id, prio, tag, buf);
+}
+int _get_logging_on(void)
+{
+       return g_logging_on;
 }
-