1 /* 2 * Copyright (C) 2009 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 #pragma once 18 19 /** 20 * @addtogroup Logging 21 * @{ 22 */ 23 24 /** 25 * \file 26 * 27 * Support routines to send messages to the Android log buffer, 28 * which can later be accessed through the `logcat` utility. 29 * 30 * Each log message must have 31 * - a priority 32 * - a log tag 33 * - some text 34 * 35 * The tag normally corresponds to the component that emits the log message, 36 * and should be reasonably small. 37 * 38 * Log message text may be truncated to less than an implementation-specific 39 * limit (1023 bytes). 40 * 41 * Note that a newline character ("\n") will be appended automatically to your 42 * log message, if not already there. It is not possible to send several 43 * messages and have them appear on a single line in logcat. 44 * 45 * Please use logging in moderation: 46 * 47 * - Sending log messages eats CPU and slow down your application and the 48 * system. 49 * 50 * - The circular log buffer is pretty small, so sending many messages 51 * will hide other important log messages. 52 * 53 * - In release builds, only send log messages to account for exceptional 54 * conditions. 55 */ 56 57 #include <stdarg.h> 58 #include <stddef.h> 59 #include <stdint.h> 60 #include <sys/cdefs.h> 61 62 #if !defined(__BIONIC__) && !defined(__INTRODUCED_IN) 63 #define __INTRODUCED_IN(x) 64 #endif 65 66 #ifdef __cplusplus 67 extern "C" { 68 #endif 69 70 /** 71 * Android log priority values, in increasing order of priority. 72 */ 73 typedef enum android_LogPriority { 74 /** For internal use only. */ 75 ANDROID_LOG_UNKNOWN = 0, 76 /** The default priority, for internal use only. */ 77 ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ 78 /** Verbose logging. Should typically be disabled for a release apk. */ 79 ANDROID_LOG_VERBOSE, 80 /** Debug logging. Should typically be disabled for a release apk. */ 81 ANDROID_LOG_DEBUG, 82 /** Informational logging. Should typically be disabled for a release apk. */ 83 ANDROID_LOG_INFO, 84 /** Warning logging. For use with recoverable failures. */ 85 ANDROID_LOG_WARN, 86 /** Error logging. For use with unrecoverable failures. */ 87 ANDROID_LOG_ERROR, 88 /** Fatal logging. For use when aborting. */ 89 ANDROID_LOG_FATAL, 90 /** For internal use only. */ 91 ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */ 92 } android_LogPriority; 93 94 /** 95 * Writes the constant string `text` to the log, with priority `prio` and tag 96 * `tag`. 97 * 98 * @return 1 if the message was written to the log, or -EPERM if it was not; see 99 * __android_log_is_loggable(). 100 */ 101 int __android_log_write(int prio, const char* tag, const char* text); 102 103 /** 104 * Writes a formatted string to the log, with priority `prio` and tag `tag`. 105 * The details of formatting are the same as for 106 * [printf(3)](http://man7.org/linux/man-pages/man3/printf.3.html). 107 * 108 * @return 1 if the message was written to the log, or -EPERM if it was not; see 109 * __android_log_is_loggable(). 110 */ 111 int __android_log_print(int prio, const char* tag, const char* fmt, ...) 112 __attribute__((__format__(printf, 3, 4))); 113 114 /** 115 * Equivalent to __android_log_print(), but taking a `va_list`. 116 * (If __android_log_print() is like printf(), this is like vprintf().) 117 * 118 * @return 1 if the message was written to the log, or -EPERM if it was not; see 119 * __android_log_is_loggable(). 120 */ 121 int __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap) 122 __attribute__((__format__(printf, 3, 0))); 123 124 /** 125 * Writes an assertion failure to the log (as `ANDROID_LOG_FATAL`) and to 126 * stderr, before calling 127 * [abort(3)](http://man7.org/linux/man-pages/man3/abort.3.html). 128 * 129 * If `fmt` is non-null, `cond` is unused. If `fmt` is null, the string 130 * `Assertion failed: %s` is used with `cond` as the string argument. 131 * If both `fmt` and `cond` are null, a default string is provided. 132 * 133 * Most callers should use 134 * [assert(3)](http://man7.org/linux/man-pages/man3/assert.3.html) from 135 * `<assert.h>` instead, or the `__assert` and `__assert2` functions 136 * provided by bionic if more control is needed. They support automatically 137 * including the source filename and line number more conveniently than this 138 * function. 139 */ 140 void __android_log_assert(const char* cond, const char* tag, const char* fmt, ...) 141 __attribute__((__noreturn__)) __attribute__((__format__(printf, 3, 4))); 142 143 /** 144 * Identifies a specific log buffer for __android_log_buf_write() 145 * and __android_log_buf_print(). 146 */ 147 typedef enum log_id { 148 LOG_ID_MIN = 0, 149 150 /** The main log buffer. This is the only log buffer available to apps. */ 151 LOG_ID_MAIN = 0, 152 /** The radio log buffer. */ 153 LOG_ID_RADIO = 1, 154 /** The event log buffer. */ 155 LOG_ID_EVENTS = 2, 156 /** The system log buffer. */ 157 LOG_ID_SYSTEM = 3, 158 /** The crash log buffer. */ 159 LOG_ID_CRASH = 4, 160 /** The statistics log buffer. */ 161 LOG_ID_STATS = 5, 162 /** The security log buffer. */ 163 LOG_ID_SECURITY = 6, 164 /** The kernel log buffer. */ 165 LOG_ID_KERNEL = 7, 166 167 LOG_ID_MAX, 168 169 /** Let the logging function choose the best log target. */ 170 LOG_ID_DEFAULT = 0x7FFFFFFF 171 } log_id_t; 172 173 /** 174 * Writes the constant string `text` to the log buffer `id`, 175 * with priority `prio` and tag `tag`. 176 * 177 * Apps should use __android_log_write() instead. 178 * 179 * @return 1 if the message was written to the log, or -EPERM if it was not; see 180 * __android_log_is_loggable(). 181 */ 182 int __android_log_buf_write(int bufID, int prio, const char* tag, const char* text); 183 184 /** 185 * Writes a formatted string to log buffer `id`, 186 * with priority `prio` and tag `tag`. 187 * The details of formatting are the same as for 188 * [printf(3)](http://man7.org/linux/man-pages/man3/printf.3.html). 189 * 190 * Apps should use __android_log_print() instead. 191 * 192 * @return 1 if the message was written to the log, or -EPERM if it was not; see 193 * __android_log_is_loggable(). 194 */ 195 int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) 196 __attribute__((__format__(printf, 4, 5))); 197 198 /** 199 * Logger data struct used for writing log messages to liblog via __android_log_write_logger_data() 200 * and sending log messages to user defined loggers specified in __android_log_set_logger(). 201 */ 202 struct __android_log_message { 203 /** Must be set to `sizeof(__android_log_message)` and is used for versioning. */ 204 size_t struct_size; 205 206 /** {@link log_id_t} values. */ 207 int32_t buffer_id; 208 209 /** {@link android_LogPriority} values. */ 210 int32_t priority; 211 212 /** The tag for the log message. */ 213 const char* tag; 214 215 /** Optional file name, may be set to nullptr. */ 216 const char* file; 217 218 /** Optional line number, ignore if file is nullptr. */ 219 uint32_t line; 220 221 /** The log message itself. */ 222 const char* message; 223 }; 224 225 /** 226 * Prototype for the 'logger' function that is called for every log message. 227 */ 228 typedef void (*__android_logger_function)(const struct __android_log_message* log_message); 229 /** 230 * Prototype for the 'abort' function that is called when liblog will abort due to 231 * __android_log_assert() failures. 232 */ 233 typedef void (*__android_aborter_function)(const char* abort_message); 234 235 /** 236 * Writes the log message specified by log_message. log_message includes additional file name and 237 * line number information that a logger may use. log_message is versioned for backwards 238 * compatibility. 239 * This assumes that loggability has already been checked through __android_log_is_loggable(). 240 * Higher level logging libraries, such as libbase, first check loggability, then format their 241 * buffers, then pass the message to liblog via this function, and therefore we do not want to 242 * duplicate the loggability check here. 243 * 244 * @param log_message the log message itself, see {@link __android_log_message}. 245 * 246 * Available since API level 30. 247 */ 248 void __android_log_write_log_message(struct __android_log_message* log_message) __INTRODUCED_IN(30); 249 250 /** 251 * Sets a user defined logger function. All log messages sent to liblog will be set to the 252 * function pointer specified by logger for processing. It is not expected that log messages are 253 * already terminated with a new line. This function should add new lines if required for line 254 * separation. 255 * 256 * @param logger the new function that will handle log messages. 257 * 258 * Available since API level 30. 259 */ 260 void __android_log_set_logger(__android_logger_function logger) __INTRODUCED_IN(30); 261 262 /** 263 * Writes the log message to logd. This is an {@link __android_logger_function} and can be provided to 264 * __android_log_set_logger(). It is the default logger when running liblog on a device. 265 * 266 * @param log_message the log message to write, see {@link __android_log_message}. 267 * 268 * Available since API level 30. 269 */ 270 void __android_log_logd_logger(const struct __android_log_message* log_message) __INTRODUCED_IN(30); 271 272 /** 273 * Writes the log message to stderr. This is an {@link __android_logger_function} and can be provided to 274 * __android_log_set_logger(). It is the default logger when running liblog on host. 275 * 276 * @param log_message the log message to write, see {@link __android_log_message}. 277 * 278 * Available since API level 30. 279 */ 280 void __android_log_stderr_logger(const struct __android_log_message* log_message) 281 __INTRODUCED_IN(30); 282 283 /** 284 * Sets a user defined aborter function that is called for __android_log_assert() failures. This 285 * user defined aborter function is highly recommended to abort and be noreturn, but is not strictly 286 * required to. 287 * 288 * @param aborter the new aborter function, see {@link __android_aborter_function}. 289 * 290 * Available since API level 30. 291 */ 292 void __android_log_set_aborter(__android_aborter_function aborter) __INTRODUCED_IN(30); 293 294 /** 295 * Calls the stored aborter function. This allows for other logging libraries to use the same 296 * aborter function by calling this function in liblog. 297 * 298 * @param abort_message an additional message supplied when aborting, for example this is used to 299 * call android_set_abort_message() in __android_log_default_aborter(). 300 * 301 * Available since API level 30. 302 */ 303 void __android_log_call_aborter(const char* abort_message) __INTRODUCED_IN(30); 304 305 /** 306 * Sets android_set_abort_message() on device then aborts(). This is the default aborter. 307 * 308 * @param abort_message an additional message supplied when aborting. This functions calls 309 * android_set_abort_message() with its contents. 310 * 311 * Available since API level 30. 312 */ 313 void __android_log_default_aborter(const char* abort_message) __attribute__((noreturn)) 314 __INTRODUCED_IN(30); 315 316 /** 317 * Use the per-tag properties "log.tag.<tagname>" along with the minimum priority from 318 * __android_log_set_minimum_priority() to determine if a log message with a given prio and tag will 319 * be printed. A non-zero result indicates yes, zero indicates false. 320 * 321 * If both a priority for a tag and a minimum priority are set by 322 * __android_log_set_minimum_priority(), then the lowest of the two values are to determine the 323 * minimum priority needed to log. If only one is set, then that value is used to determine the 324 * minimum priority needed. If none are set, then default_priority is used. 325 * 326 * @param prio the priority to test, takes {@link android_LogPriority} values. 327 * @param tag the tag to test. 328 * @param default_prio the default priority to use if no properties or minimum priority are set. 329 * @return an integer where 1 indicates that the message is loggable and 0 indicates that it is not. 330 * 331 * Available since API level 30. 332 */ 333 int __android_log_is_loggable(int prio, const char* tag, int default_prio) __INTRODUCED_IN(30); 334 335 /** 336 * Use the per-tag properties "log.tag.<tagname>" along with the minimum priority from 337 * __android_log_set_minimum_priority() to determine if a log message with a given prio and tag will 338 * be printed. A non-zero result indicates yes, zero indicates false. 339 * 340 * If both a priority for a tag and a minimum priority are set by 341 * __android_log_set_minimum_priority(), then the lowest of the two values are to determine the 342 * minimum priority needed to log. If only one is set, then that value is used to determine the 343 * minimum priority needed. If none are set, then default_priority is used. 344 * 345 * @param prio the priority to test, takes {@link android_LogPriority} values. 346 * @param tag the tag to test. 347 * @param len the length of the tag. 348 * @param default_prio the default priority to use if no properties or minimum priority are set. 349 * @return an integer where 1 indicates that the message is loggable and 0 indicates that it is not. 350 * 351 * Available since API level 30. 352 */ 353 int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio) 354 __INTRODUCED_IN(30); 355 356 /** 357 * Sets the minimum priority that will be logged for this process. 358 * 359 * @param priority the new minimum priority to set, takes {@link android_LogPriority} values. 360 * @return the previous set minimum priority, or `ANDROID_LOG_DEFAULT` if none was set. 361 * 362 * Available since API level 30. 363 */ 364 int32_t __android_log_set_minimum_priority(int32_t priority) __INTRODUCED_IN(30); 365 366 /** 367 * Gets the minimum priority that will be logged for this process. 368 * 369 * @return the current minimum priority, or `ANDROID_LOG_DEFAULT` if none is set. 370 * 371 * Available since API level 30. 372 */ 373 int32_t __android_log_get_minimum_priority(void) __INTRODUCED_IN(30); 374 375 /** 376 * Sets the default tag if no tag is provided when writing a log message. Defaults to 377 * getprogname(). This truncates tag to the maximum log message size, though appropriate tags 378 * should be much smaller. 379 * 380 * @param tag the new log tag. 381 * 382 * Available since API level 30. 383 */ 384 void __android_log_set_default_tag(const char* tag) __INTRODUCED_IN(30); 385 386 #ifdef __cplusplus 387 } 388 #endif 389 390 /** @} */ 391