* 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;
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;
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;
}
-