OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2005 The Android Open Source Project | |
3 * | |
4 * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 * you may not use this file except in compliance with the License. | |
6 * You may obtain a copy of the License at | |
7 * | |
8 * http://www.apache.org/licenses/LICENSE-2.0 | |
9 * | |
10 * Unless required by applicable law or agreed to in writing, software | |
11 * distributed under the License is distributed on an "AS IS" BASIS, | |
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 * See the License for the specific language governing permissions and | |
14 * limitations under the License. | |
15 */ | |
16 | |
17 // | |
18 // C/C++ logging functions. See the logging documentation for API details. | |
19 // | |
20 // We'd like these to be available from C code (in case we import some from | |
21 // somewhere), so this has a C interface. | |
22 // | |
23 // The output will be correct when the log file is shared between multiple | |
24 // threads and/or multiple processes so long as the operating system | |
25 // supports O_APPEND. These calls have mutex-protected data structures | |
26 // and so are NOT reentrant. Do not use LOG in a signal handler. | |
27 // | |
28 #ifndef _LIBS_LOG_LOG_H | |
29 #define _LIBS_LOG_LOG_H | |
30 | |
31 #include <stdio.h> | |
32 #include <time.h> | |
33 #include <sys/types.h> | |
34 #include <unistd.h> | |
35 #ifdef HAVE_PTHREADS | |
36 #include <pthread.h> | |
37 #endif | |
38 #include <stdarg.h> | |
39 | |
40 #ifdef ANDROID | |
41 #include <log/uio.h> | |
42 #include <log/logd.h> | |
43 #else | |
44 #include <android/log.h> | |
45 #endif | |
46 | |
47 #ifdef __cplusplus | |
48 extern "C" { | |
49 #endif | |
50 | |
51 // --------------------------------------------------------------------- | |
52 | |
53 /* | |
54 * Normally we strip ALOGV (VERBOSE messages) from release builds. | |
55 * You can modify this (for example with "#define LOG_NDEBUG 0" | |
56 * at the top of your source file) to change that behavior. | |
57 */ | |
58 #ifndef LOG_NDEBUG | |
59 #ifdef NDEBUG | |
60 #define LOG_NDEBUG 1 | |
61 #else | |
62 #define LOG_NDEBUG 0 | |
63 #endif | |
64 #endif | |
65 | |
66 /* | |
67 * This is the local tag used for the following simplified | |
68 * logging macros. You can change this preprocessor definition | |
69 * before using the other macros to change the tag. | |
70 */ | |
71 #ifndef LOG_TAG | |
72 #define LOG_TAG NULL | |
73 #endif | |
74 | |
75 // --------------------------------------------------------------------- | |
76 | |
77 /* | |
78 * Simplified macro to send a verbose log message using the current LOG_TAG. | |
79 */ | |
80 #ifndef ALOGV | |
81 #if LOG_NDEBUG | |
82 #define ALOGV(...) ((void)0) | |
83 #else | |
84 #define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) | |
85 #endif | |
86 #endif | |
87 | |
88 #define CONDITION(cond) (__builtin_expect((cond)!=0, 0)) | |
89 | |
90 #ifndef ALOGV_IF | |
91 #if LOG_NDEBUG | |
92 #define ALOGV_IF(cond, ...) ((void)0) | |
93 #else | |
94 #define ALOGV_IF(cond, ...) \ | |
95 ( (CONDITION(cond)) \ | |
96 ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ | |
97 : (void)0 ) | |
98 #endif | |
99 #endif | |
100 | |
101 /* | |
102 * Simplified macro to send a debug log message using the current LOG_TAG. | |
103 */ | |
104 #ifndef ALOGD | |
105 #define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) | |
106 #endif | |
107 | |
108 #ifndef ALOGD_IF | |
109 #define ALOGD_IF(cond, ...) \ | |
110 ( (CONDITION(cond)) \ | |
111 ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ | |
112 : (void)0 ) | |
113 #endif | |
114 | |
115 /* | |
116 * Simplified macro to send an info log message using the current LOG_TAG. | |
117 */ | |
118 #ifndef ALOGI | |
119 #define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) | |
120 #endif | |
121 | |
122 #ifndef ALOGI_IF | |
123 #define ALOGI_IF(cond, ...) \ | |
124 ( (CONDITION(cond)) \ | |
125 ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \ | |
126 : (void)0 ) | |
127 #endif | |
128 | |
129 /* | |
130 * Simplified macro to send a warning log message using the current LOG_TAG. | |
131 */ | |
132 #ifndef ALOGW | |
133 #define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) | |
134 #endif | |
135 | |
136 #ifndef ALOGW_IF | |
137 #define ALOGW_IF(cond, ...) \ | |
138 ( (CONDITION(cond)) \ | |
139 ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \ | |
140 : (void)0 ) | |
141 #endif | |
142 | |
143 /* | |
144 * Simplified macro to send an error log message using the current LOG_TAG. | |
145 */ | |
146 #ifndef ALOGE | |
147 #define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) | |
148 #endif | |
149 | |
150 #ifndef ALOGE_IF | |
151 #define ALOGE_IF(cond, ...) \ | |
152 ( (CONDITION(cond)) \ | |
153 ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ | |
154 : (void)0 ) | |
155 #endif | |
156 | |
157 // --------------------------------------------------------------------- | |
158 | |
159 /* | |
160 * Conditional based on whether the current LOG_TAG is enabled at | |
161 * verbose priority. | |
162 */ | |
163 #ifndef IF_ALOGV | |
164 #if LOG_NDEBUG | |
165 #define IF_ALOGV() if (false) | |
166 #else | |
167 #define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG) | |
168 #endif | |
169 #endif | |
170 | |
171 /* | |
172 * Conditional based on whether the current LOG_TAG is enabled at | |
173 * debug priority. | |
174 */ | |
175 #ifndef IF_ALOGD | |
176 #define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG) | |
177 #endif | |
178 | |
179 /* | |
180 * Conditional based on whether the current LOG_TAG is enabled at | |
181 * info priority. | |
182 */ | |
183 #ifndef IF_ALOGI | |
184 #define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG) | |
185 #endif | |
186 | |
187 /* | |
188 * Conditional based on whether the current LOG_TAG is enabled at | |
189 * warn priority. | |
190 */ | |
191 #ifndef IF_ALOGW | |
192 #define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG) | |
193 #endif | |
194 | |
195 /* | |
196 * Conditional based on whether the current LOG_TAG is enabled at | |
197 * error priority. | |
198 */ | |
199 #ifndef IF_ALOGE | |
200 #define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG) | |
201 #endif | |
202 | |
203 | |
204 // --------------------------------------------------------------------- | |
205 | |
206 /* | |
207 * Simplified macro to send a verbose system log message using the current LOG_T
AG. | |
208 */ | |
209 #ifndef SLOGV | |
210 #if LOG_NDEBUG | |
211 #define SLOGV(...) ((void)0) | |
212 #else | |
213 #define SLOGV(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VER
BOSE, LOG_TAG, __VA_ARGS__)) | |
214 #endif | |
215 #endif | |
216 | |
217 #define CONDITION(cond) (__builtin_expect((cond)!=0, 0)) | |
218 | |
219 #ifndef SLOGV_IF | |
220 #if LOG_NDEBUG | |
221 #define SLOGV_IF(cond, ...) ((void)0) | |
222 #else | |
223 #define SLOGV_IF(cond, ...) \ | |
224 ( (CONDITION(cond)) \ | |
225 ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG
, __VA_ARGS__)) \ | |
226 : (void)0 ) | |
227 #endif | |
228 #endif | |
229 | |
230 /* | |
231 * Simplified macro to send a debug system log message using the current LOG_TAG
. | |
232 */ | |
233 #ifndef SLOGD | |
234 #define SLOGD(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEB
UG, LOG_TAG, __VA_ARGS__)) | |
235 #endif | |
236 | |
237 #ifndef SLOGD_IF | |
238 #define SLOGD_IF(cond, ...) \ | |
239 ( (CONDITION(cond)) \ | |
240 ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG,
__VA_ARGS__)) \ | |
241 : (void)0 ) | |
242 #endif | |
243 | |
244 /* | |
245 * Simplified macro to send an info system log message using the current LOG_TAG
. | |
246 */ | |
247 #ifndef SLOGI | |
248 #define SLOGI(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INF
O, LOG_TAG, __VA_ARGS__)) | |
249 #endif | |
250 | |
251 #ifndef SLOGI_IF | |
252 #define SLOGI_IF(cond, ...) \ | |
253 ( (CONDITION(cond)) \ | |
254 ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, _
_VA_ARGS__)) \ | |
255 : (void)0 ) | |
256 #endif | |
257 | |
258 /* | |
259 * Simplified macro to send a warning system log message using the current LOG_T
AG. | |
260 */ | |
261 #ifndef SLOGW | |
262 #define SLOGW(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WAR
N, LOG_TAG, __VA_ARGS__)) | |
263 #endif | |
264 | |
265 #ifndef SLOGW_IF | |
266 #define SLOGW_IF(cond, ...) \ | |
267 ( (CONDITION(cond)) \ | |
268 ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, _
_VA_ARGS__)) \ | |
269 : (void)0 ) | |
270 #endif | |
271 | |
272 /* | |
273 * Simplified macro to send an error system log message using the current LOG_TA
G. | |
274 */ | |
275 #ifndef SLOGE | |
276 #define SLOGE(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERR
OR, LOG_TAG, __VA_ARGS__)) | |
277 #endif | |
278 | |
279 #ifndef SLOGE_IF | |
280 #define SLOGE_IF(cond, ...) \ | |
281 ( (CONDITION(cond)) \ | |
282 ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG,
__VA_ARGS__)) \ | |
283 : (void)0 ) | |
284 #endif | |
285 | |
286 // --------------------------------------------------------------------- | |
287 | |
288 /* | |
289 * Simplified macro to send a verbose radio log message using the current LOG_TA
G. | |
290 */ | |
291 #ifndef RLOGV | |
292 #if LOG_NDEBUG | |
293 #define RLOGV(...) ((void)0) | |
294 #else | |
295 #define RLOGV(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERB
OSE, LOG_TAG, __VA_ARGS__)) | |
296 #endif | |
297 #endif | |
298 | |
299 #define CONDITION(cond) (__builtin_expect((cond)!=0, 0)) | |
300 | |
301 #ifndef RLOGV_IF | |
302 #if LOG_NDEBUG | |
303 #define RLOGV_IF(cond, ...) ((void)0) | |
304 #else | |
305 #define RLOGV_IF(cond, ...) \ | |
306 ( (CONDITION(cond)) \ | |
307 ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG,
__VA_ARGS__)) \ | |
308 : (void)0 ) | |
309 #endif | |
310 #endif | |
311 | |
312 /* | |
313 * Simplified macro to send a debug radio log message using the current LOG_TAG. | |
314 */ | |
315 #ifndef RLOGD | |
316 #define RLOGD(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBU
G, LOG_TAG, __VA_ARGS__)) | |
317 #endif | |
318 | |
319 #ifndef RLOGD_IF | |
320 #define RLOGD_IF(cond, ...) \ | |
321 ( (CONDITION(cond)) \ | |
322 ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, _
_VA_ARGS__)) \ | |
323 : (void)0 ) | |
324 #endif | |
325 | |
326 /* | |
327 * Simplified macro to send an info radio log message using the current LOG_TAG. | |
328 */ | |
329 #ifndef RLOGI | |
330 #define RLOGI(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO
, LOG_TAG, __VA_ARGS__)) | |
331 #endif | |
332 | |
333 #ifndef RLOGI_IF | |
334 #define RLOGI_IF(cond, ...) \ | |
335 ( (CONDITION(cond)) \ | |
336 ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __
VA_ARGS__)) \ | |
337 : (void)0 ) | |
338 #endif | |
339 | |
340 /* | |
341 * Simplified macro to send a warning radio log message using the current LOG_TA
G. | |
342 */ | |
343 #ifndef RLOGW | |
344 #define RLOGW(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN
, LOG_TAG, __VA_ARGS__)) | |
345 #endif | |
346 | |
347 #ifndef RLOGW_IF | |
348 #define RLOGW_IF(cond, ...) \ | |
349 ( (CONDITION(cond)) \ | |
350 ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __
VA_ARGS__)) \ | |
351 : (void)0 ) | |
352 #endif | |
353 | |
354 /* | |
355 * Simplified macro to send an error radio log message using the current LOG_TAG
. | |
356 */ | |
357 #ifndef RLOGE | |
358 #define RLOGE(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERRO
R, LOG_TAG, __VA_ARGS__)) | |
359 #endif | |
360 | |
361 #ifndef RLOGE_IF | |
362 #define RLOGE_IF(cond, ...) \ | |
363 ( (CONDITION(cond)) \ | |
364 ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, _
_VA_ARGS__)) \ | |
365 : (void)0 ) | |
366 #endif | |
367 | |
368 | |
369 // --------------------------------------------------------------------- | |
370 | |
371 /* | |
372 * Log a fatal error. If the given condition fails, this stops program | |
373 * execution like a normal assertion, but also generating the given message. | |
374 * It is NOT stripped from release builds. Note that the condition test | |
375 * is -inverted- from the normal assert() semantics. | |
376 */ | |
377 #ifndef LOG_ALWAYS_FATAL_IF | |
378 #define LOG_ALWAYS_FATAL_IF(cond, ...) \ | |
379 ( (CONDITION(cond)) \ | |
380 ? ((void)android_printAssert(#cond, LOG_TAG, ## __VA_ARGS__)) \ | |
381 : (void)0 ) | |
382 #endif | |
383 | |
384 #ifndef LOG_ALWAYS_FATAL | |
385 #define LOG_ALWAYS_FATAL(...) \ | |
386 ( ((void)android_printAssert(NULL, LOG_TAG, ## __VA_ARGS__)) ) | |
387 #endif | |
388 | |
389 /* | |
390 * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that | |
391 * are stripped out of release builds. | |
392 */ | |
393 #if LOG_NDEBUG | |
394 | |
395 #ifndef LOG_FATAL_IF | |
396 #define LOG_FATAL_IF(cond, ...) ((void)0) | |
397 #endif | |
398 #ifndef LOG_FATAL | |
399 #define LOG_FATAL(...) ((void)0) | |
400 #endif | |
401 | |
402 #else | |
403 | |
404 #ifndef LOG_FATAL_IF | |
405 #define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__) | |
406 #endif | |
407 #ifndef LOG_FATAL | |
408 #define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__) | |
409 #endif | |
410 | |
411 #endif | |
412 | |
413 /* | |
414 * Assertion that generates a log message when the assertion fails. | |
415 * Stripped out of release builds. Uses the current LOG_TAG. | |
416 */ | |
417 #ifndef ALOG_ASSERT | |
418 #define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__) | |
419 //#define ALOG_ASSERT(cond) LOG_FATAL_IF(!(cond), "Assertion failed: " #cond) | |
420 #endif | |
421 | |
422 // --------------------------------------------------------------------- | |
423 | |
424 /* | |
425 * Basic log message macro. | |
426 * | |
427 * Example: | |
428 * ALOG(LOG_WARN, NULL, "Failed with error %d", errno); | |
429 * | |
430 * The second argument may be NULL or "" to indicate the "global" tag. | |
431 */ | |
432 #ifndef ALOG | |
433 #define ALOG(priority, tag, ...) \ | |
434 LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__) | |
435 #endif | |
436 | |
437 /* | |
438 * Log macro that allows you to specify a number for the priority. | |
439 */ | |
440 #ifndef LOG_PRI | |
441 #define LOG_PRI(priority, tag, ...) \ | |
442 android_printLog(priority, tag, __VA_ARGS__) | |
443 #endif | |
444 | |
445 /* | |
446 * Log macro that allows you to pass in a varargs ("args" is a va_list). | |
447 */ | |
448 #ifndef LOG_PRI_VA | |
449 #define LOG_PRI_VA(priority, tag, fmt, args) \ | |
450 android_vprintLog(priority, NULL, tag, fmt, args) | |
451 #endif | |
452 | |
453 /* | |
454 * Conditional given a desired logging priority and tag. | |
455 */ | |
456 #ifndef IF_ALOG | |
457 #define IF_ALOG(priority, tag) \ | |
458 if (android_testLog(ANDROID_##priority, tag)) | |
459 #endif | |
460 | |
461 // --------------------------------------------------------------------- | |
462 | |
463 /* | |
464 * Event logging. | |
465 */ | |
466 | |
467 /* | |
468 * Event log entry types. These must match up with the declarations in | |
469 * java/android/android/util/EventLog.java. | |
470 */ | |
471 typedef enum { | |
472 EVENT_TYPE_INT = 0, | |
473 EVENT_TYPE_LONG = 1, | |
474 EVENT_TYPE_STRING = 2, | |
475 EVENT_TYPE_LIST = 3, | |
476 } AndroidEventLogType; | |
477 | |
478 | |
479 #ifndef LOG_EVENT_INT | |
480 #define LOG_EVENT_INT(_tag, _value) { \ | |
481 int intBuf = _value; \ | |
482 (void) android_btWriteLog(_tag, EVENT_TYPE_INT, &intBuf, \ | |
483 sizeof(intBuf)); \ | |
484 } | |
485 #endif | |
486 #ifndef LOG_EVENT_LONG | |
487 #define LOG_EVENT_LONG(_tag, _value) { \ | |
488 long long longBuf = _value; \ | |
489 (void) android_btWriteLog(_tag, EVENT_TYPE_LONG, &longBuf, \ | |
490 sizeof(longBuf)); \ | |
491 } | |
492 #endif | |
493 #ifndef LOG_EVENT_STRING | |
494 #define LOG_EVENT_STRING(_tag, _value) \ | |
495 ((void) 0) /* not implemented -- must combine len with string */ | |
496 #endif | |
497 /* TODO: something for LIST */ | |
498 | |
499 /* | |
500 * =========================================================================== | |
501 * | |
502 * The stuff in the rest of this file should not be used directly. | |
503 */ | |
504 | |
505 #define android_printLog(prio, tag, fmt...) \ | |
506 __android_log_print(prio, tag, fmt) | |
507 | |
508 #define android_vprintLog(prio, cond, tag, fmt...) \ | |
509 __android_log_vprint(prio, tag, fmt) | |
510 | |
511 /* XXX Macros to work around syntax errors in places where format string | |
512 * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF | |
513 * (happens only in debug builds). | |
514 */ | |
515 | |
516 /* Returns 2nd arg. Used to substitute default value if caller's vararg list | |
517 * is empty. | |
518 */ | |
519 #define __android_second(dummy, second, ...) second | |
520 | |
521 /* If passed multiple args, returns ',' followed by all but 1st arg, otherwise | |
522 * returns nothing. | |
523 */ | |
524 #define __android_rest(first, ...) , ## __VA_ARGS__ | |
525 | |
526 #define android_printAssert(cond, tag, fmt...) \ | |
527 __android_log_assert(cond, tag, \ | |
528 __android_second(0, ## fmt, NULL) __android_rest(fmt)) | |
529 | |
530 #define android_writeLog(prio, tag, text) \ | |
531 __android_log_write(prio, tag, text) | |
532 | |
533 #define android_bWriteLog(tag, payload, len) \ | |
534 __android_log_bwrite(tag, payload, len) | |
535 #define android_btWriteLog(tag, type, payload, len) \ | |
536 __android_log_btwrite(tag, type, payload, len) | |
537 | |
538 // TODO: remove these prototypes and their users | |
539 #define android_testLog(prio, tag) (1) | |
540 #define android_writevLog(vec,num) do{}while(0) | |
541 #define android_write1Log(str,len) do{}while (0) | |
542 #define android_setMinPriority(tag, prio) do{}while(0) | |
543 //#define android_logToCallback(func) do{}while(0) | |
544 #define android_logToFile(tag, file) (0) | |
545 #define android_logToFd(tag, fd) (0) | |
546 | |
547 typedef enum { | |
548 LOG_ID_MAIN = 0, | |
549 LOG_ID_RADIO = 1, | |
550 LOG_ID_EVENTS = 2, | |
551 LOG_ID_SYSTEM = 3, | |
552 | |
553 LOG_ID_MAX | |
554 } log_id_t; | |
555 | |
556 /* | |
557 * Send a simple string to the log. | |
558 */ | |
559 int __android_log_buf_write(int bufID, int prio, const char *tag, const char *te
xt); | |
560 int __android_log_buf_print(int bufID, int prio, const char *tag, const char *fm
t, ...); | |
561 | |
562 | |
563 #ifdef __cplusplus | |
564 } | |
565 #endif | |
566 | |
567 #endif // _LIBS_CUTILS_LOG_H | |
OLD | NEW |