15c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
25c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Copyright (C) 2009 The Android Open Source Project
35c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
45c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
55c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * you may not use this file except in compliance with the License.
65c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * You may obtain a copy of the License at
75c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
85c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
95c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
105c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Unless required by applicable law or agreed to in writing, software
115c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
125c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * See the License for the specific language governing permissions and
145c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * limitations under the License.
155c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
165c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
175c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef _ANDROID_LOG_H
185c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define _ANDROID_LOG_H
195c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
205c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/******************************************************************
215c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
225c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * IMPORTANT NOTICE:
235c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
245c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   This file is part of Android's set of stable system headers
255c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   exposed by the Android NDK (Native Development Kit) since
265c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   platform release 1.5
275c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
285c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   Third-party source AND binary code relies on the definitions
295c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
305c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
315c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
325c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
335c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
345c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
355c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
365c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
3765725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
3865725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * \file
3965725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes *
4065725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Support routines to send messages to the Android log buffer,
4165725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * which can later be accessed through the `logcat` utility.
425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
435c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Each log message must have
445c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - a priority
455c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - a log tag
465c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - some text
475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
485c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * The tag normally corresponds to the component that emits the log message,
495c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * and should be reasonably small.
505c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Log message text may be truncated to less than an implementation-specific
5265725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * limit (1023 bytes).
535c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
545c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Note that a newline character ("\n") will be appended automatically to your
552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn * log message, if not already there. It is not possible to send several
562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn * messages and have them appear on a single line in logcat.
575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
5865725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Please use logging in moderation:
595c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
605c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *  - Sending log messages eats CPU and slow down your application and the
615c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *    system.
625c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
6365725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes *  - The circular log buffer is pretty small, so sending many messages
6465725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes *    will hide other important log messages.
655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
665c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *  - In release builds, only send log messages to account for exceptional
675c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *    conditions.
685c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
695c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
705c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#include <stdarg.h>
715c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
725c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __cplusplus
735c967da341c9395a4c378c149f326505224ec66eMark Salyzynextern "C" {
745c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
755c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
7665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
7765725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Android log priority values, in increasing order of priority.
785c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
795c967da341c9395a4c378c149f326505224ec66eMark Salyzyntypedef enum android_LogPriority {
8065725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** For internal use only.  */
812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_UNKNOWN = 0,
8265725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** The default priority, for internal use only.  */
832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
8465725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Verbose logging. Should typically be disabled for a release apk. */
852ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_VERBOSE,
8665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Debug logging. Should typically be disabled for a release apk. */
872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_DEBUG,
8865725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Informational logging. Should typically be disabled for a release apk. */
892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_INFO,
9065725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Warning logging. For use with recoverable failures. */
912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_WARN,
9265725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Error logging. For use with unrecoverable failures. */
932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_ERROR,
9465725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** Fatal logging. For use when aborting. */
952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_FATAL,
9665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes  /** For internal use only.  */
972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
985c967da341c9395a4c378c149f326505224ec66eMark Salyzyn} android_LogPriority;
995c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
10065725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
10165725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Writes the constant string `text` to the log, with priority `prio` and tag
10265725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * `tag`.
1035c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1045c967da341c9395a4c378c149f326505224ec66eMark Salyzynint __android_log_write(int prio, const char* tag, const char* text);
1055c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
10665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
10765725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Writes a formatted string to the log, with priority `prio` and tag `tag`.
10865725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * The details of formatting are the same as for
10965725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * [printf(3)](http://man7.org/linux/man-pages/man3/printf.3.html).
1105c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1112ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint __android_log_print(int prio, const char* tag, const char* fmt, ...)
1125c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1135c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1145c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 4)))
1165c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1185c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1195c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1215c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1225c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1235c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1245c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
12565725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
12665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Equivalent to `__android_log_print`, but taking a `va_list`.
12765725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * (If `__android_log_print` is like `printf`, this is like `vprintf`.)
1285c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1292ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap)
1305c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1315c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1325c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 0)))
1345c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 0)))
1365c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1375c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 0)))
1395c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1405c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1415c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
14365725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes/**
14465725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Writes an assertion failure to the log (as `ANDROID_LOG_FATAL`) and to
14565725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * stderr, before calling
14665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * [abort(3)](http://man7.org/linux/man-pages/man3/abort.3.html).
14765725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes *
14865725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * If `fmt` is non-null, `cond` is unused. If `fmt` is null, the string
14965725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * `Assertion failed: %s` is used with `cond` as the string argument.
15065725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * If both `fmt` and `cond` are null, a default string is provided.
15165725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes *
15265725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * Most callers should use
15365725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * [assert(3)](http://man7.org/linux/man-pages/man3/assert.3.html) from
15465725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * `<assert.h>` instead, or the `__assert` and `__assert2` functions provided by
15565725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * bionic if more control is needed. They support automatically including the
15665725ac4646f8c243215f87df0abb8c96caea0aeElliott Hughes * source filename and line number more conveniently than this function.
1575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynvoid __android_log_assert(const char* cond, const char* tag, const char* fmt,
1592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                          ...)
1605c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__noreturn__))
1625c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1635c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 4)))
1655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1675c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1685c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1705c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1715c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1725c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1735c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
17473ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry#ifndef log_id_t_defined
17573ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry#define log_id_t_defined
17673ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherrytypedef enum log_id {
17773ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_MIN = 0,
17873ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry
17973ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_MAIN = 0,
18073ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_RADIO = 1,
18173ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_EVENTS = 2,
18273ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_SYSTEM = 3,
18373ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_CRASH = 4,
18473ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_STATS = 5,
18573ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_SECURITY = 6,
18673ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_KERNEL = 7, /* place last, third-parties can not use it */
18773ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry
18873ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry  LOG_ID_MAX
18973ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry} log_id_t;
19073ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry#endif
19173ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry
19273ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry/*
19373ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry * Send a simple string to the log.
19473ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry */
19573ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherryint __android_log_buf_write(int bufID, int prio, const char* tag,
19673ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry                            const char* text);
19773ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherryint __android_log_buf_print(int bufID, int prio, const char* tag,
19873ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry                            const char* fmt, ...)
19973ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry#if defined(__GNUC__)
20073ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry    __attribute__((__format__(printf, 4, 5)))
20173ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry#endif
20273ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry    ;
20373ac28b4086f6d9f11433bcaa4fa601d079e9d04Tom Cherry
2045c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __cplusplus
2055c967da341c9395a4c378c149f326505224ec66eMark Salyzyn}
2065c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
2075c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
2085c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif /* _ANDROID_LOG_H */
209