3 * Copyright (c) 2005-2008, The Android Open Source Project
4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the License);
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
27 #ifdef SD_JOURNAL_SUPPORT
29 #include <systemd/sd-journal.h>
31 #define LOG_BUF_SIZE 1024
33 #define LOG_MAIN "log_main"
34 #define LOG_RADIO "log_radio"
35 #define LOG_SYSTEM "log_system"
36 #define LOG_APPS "log_apps"
38 static int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1, -1 };
40 static int g_logging_on = 1;
41 static int g_dlog_level_init = 0;
42 static int g_dlog_level = DLOG_SILENT;
44 static int __dlog_init(log_id_t, log_priority, const char *tag, const char *msg);
45 static int (*write_to_log)(log_id_t, log_priority, const char *tag, const char *msg) = __dlog_init;
46 static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
47 static int __write_to_log_null(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
51 static int __write_to_log_kernel(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
57 if (log_id < LOG_ID_MAX)
58 log_fd = log_fds[log_id];
68 vec[0].iov_base = (unsigned char *) &prio;
70 vec[1].iov_base = (void *) tag;
71 vec[1].iov_len = strlen(tag) + 1;
72 vec[2].iov_base = (void *) msg;
73 vec[2].iov_len = strlen(msg) + 1;
75 ret = writev(log_fd, vec, 3);
79 static char dlog_pri_to_char (log_priority pri)
82 case DLOG_VERBOSE: return 'V';
83 case DLOG_DEBUG: return 'D';
84 case DLOG_INFO: return 'I';
85 case DLOG_WARN: return 'W';
86 case DLOG_ERROR: return 'E';
87 case DLOG_FATAL: return 'F';
88 case DLOG_SILENT: return 'S';
96 #ifdef SD_JOURNAL_SUPPORT
97 static int dlog_pri_to_journal_pri(log_priority prio)
99 int journal_prio = LOG_DEBUG;
105 journal_prio = LOG_DEBUG;
108 journal_prio = LOG_DEBUG;
111 journal_prio = LOG_INFO;
114 journal_prio = LOG_WARNING;
117 journal_prio = LOG_ERR;
120 journal_prio = LOG_CRIT;
129 static int __write_to_log_sd_journal_print(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
131 return sd_journal_print(dlog_pri_to_journal_pri(prio), "%c %s: %s",dlog_pri_to_char(prio), tag, msg);
134 void init_dlog_level(void)
136 char *dlog_level_env;
137 char *logging_mode_env;
139 logging_mode_env = getenv("TIZEN_PLATFORMLOGGING_MODE");
140 if (!logging_mode_env)
143 g_logging_on = atoi(logging_mode_env);
146 dlog_level_env = getenv("TIZEN_DLOG_LEVEL");
147 if (!dlog_level_env) {
150 g_dlog_level = atoi(dlog_level_env);
154 g_dlog_level_init = 1;
156 static int __dlog_init(log_id_t log_id, log_priority prio, const char *tag, const char *msg)
158 pthread_mutex_lock(&log_init_lock);
159 // get filtering info
161 if (write_to_log == __dlog_init) {
163 log_fds[LOG_ID_MAIN] = open("/dev/"LOG_MAIN, O_WRONLY);
164 log_fds[LOG_ID_RADIO] = open("/dev/"LOG_RADIO, O_WRONLY);
165 log_fds[LOG_ID_SYSTEM] = open("/dev/"LOG_SYSTEM, O_WRONLY);
166 log_fds[LOG_ID_APPS] = open("/dev/"LOG_APPS, O_WRONLY);
168 if (log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0) {
169 write_to_log = __write_to_log_null;
171 #ifdef SD_JOURNAL_SUPPORT
172 write_to_log = __write_to_log_sd_journal_print;
174 write_to_log = __write_to_log_kernel;
178 if (log_fds[LOG_ID_SYSTEM] < 0)
179 log_fds[LOG_ID_SYSTEM] = log_fds[LOG_ID_MAIN];
180 if (log_fds[LOG_ID_APPS] < 0)
181 log_fds[LOG_ID_APPS] = log_fds[LOG_ID_MAIN];
183 pthread_mutex_unlock(&log_init_lock);
184 return write_to_log(log_id, prio, tag, msg);
187 int __dlog_vprint(log_id_t log_id, int prio, const char *tag, const char *fmt, va_list ap)
189 char buf[LOG_BUF_SIZE];
190 if (!g_dlog_level_init) {
193 if (log_id < LOG_ID_APPS) {
194 if(prio < g_dlog_level) {
197 } else if (LOG_ID_MAX <= log_id) {
201 vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
203 return write_to_log(log_id, prio, tag, buf);
206 int __dlog_print(log_id_t log_id, int prio, const char *tag, const char *fmt, ...)
209 char buf[LOG_BUF_SIZE];
211 if (!g_dlog_level_init) {
214 if (log_id < LOG_ID_APPS) {
215 if(prio < g_dlog_level) {
218 } else if (LOG_ID_MAX <= log_id) {
223 vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
226 return write_to_log(log_id, prio, tag, buf);
228 int _get_logging_on(void)