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