1*598139dcSAndroid Build Coastguard Worker /* 2*598139dcSAndroid Build Coastguard Worker * Copyright (C) 2006 The Android Open Source Project 3*598139dcSAndroid Build Coastguard Worker * 4*598139dcSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*598139dcSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*598139dcSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*598139dcSAndroid Build Coastguard Worker * 8*598139dcSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*598139dcSAndroid Build Coastguard Worker * 10*598139dcSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*598139dcSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*598139dcSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*598139dcSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*598139dcSAndroid Build Coastguard Worker * limitations under the License. 15*598139dcSAndroid Build Coastguard Worker */ 16*598139dcSAndroid Build Coastguard Worker 17*598139dcSAndroid Build Coastguard Worker #pragma once 18*598139dcSAndroid Build Coastguard Worker 19*598139dcSAndroid Build Coastguard Worker #include <stdint.h> 20*598139dcSAndroid Build Coastguard Worker #include <stdio.h> 21*598139dcSAndroid Build Coastguard Worker #include <sys/types.h> 22*598139dcSAndroid Build Coastguard Worker 23*598139dcSAndroid Build Coastguard Worker #include <android/log.h> 24*598139dcSAndroid Build Coastguard Worker #include <log/event_tag_map.h> 25*598139dcSAndroid Build Coastguard Worker 26*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus 27*598139dcSAndroid Build Coastguard Worker extern "C" { 28*598139dcSAndroid Build Coastguard Worker #endif 29*598139dcSAndroid Build Coastguard Worker 30*598139dcSAndroid Build Coastguard Worker typedef enum { 31*598139dcSAndroid Build Coastguard Worker /* Verbs */ 32*598139dcSAndroid Build Coastguard Worker FORMAT_OFF = 0, 33*598139dcSAndroid Build Coastguard Worker FORMAT_BRIEF, 34*598139dcSAndroid Build Coastguard Worker FORMAT_PROCESS, 35*598139dcSAndroid Build Coastguard Worker FORMAT_TAG, 36*598139dcSAndroid Build Coastguard Worker FORMAT_THREAD, 37*598139dcSAndroid Build Coastguard Worker FORMAT_RAW, 38*598139dcSAndroid Build Coastguard Worker FORMAT_TIME, 39*598139dcSAndroid Build Coastguard Worker FORMAT_THREADTIME, 40*598139dcSAndroid Build Coastguard Worker FORMAT_LONG, 41*598139dcSAndroid Build Coastguard Worker /* Adverbs. The following are modifiers to above format verbs */ 42*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_COLOR, /* converts priority to color */ 43*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_TIME_USEC, /* switches from msec to usec time precision */ 44*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_PRINTABLE, /* converts non-printable to printable escapes */ 45*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_YEAR, /* Adds year to date */ 46*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_ZONE, /* Adds zone to date, + UTC */ 47*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_EPOCH, /* Print time as seconds since Jan 1 1970 */ 48*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_MONOTONIC, /* Print cpu time as seconds since start */ 49*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_UID, /* Adds uid */ 50*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_DESCRIPT, /* Adds descriptive */ 51*598139dcSAndroid Build Coastguard Worker /* private, undocumented */ 52*598139dcSAndroid Build Coastguard Worker FORMAT_MODIFIER_TIME_NSEC, /* switches from msec to nsec time precision */ 53*598139dcSAndroid Build Coastguard Worker } AndroidLogPrintFormat; 54*598139dcSAndroid Build Coastguard Worker 55*598139dcSAndroid Build Coastguard Worker typedef struct AndroidLogFormat_t AndroidLogFormat; 56*598139dcSAndroid Build Coastguard Worker 57*598139dcSAndroid Build Coastguard Worker typedef struct AndroidLogEntry_t { 58*598139dcSAndroid Build Coastguard Worker time_t tv_sec; 59*598139dcSAndroid Build Coastguard Worker long tv_nsec; 60*598139dcSAndroid Build Coastguard Worker android_LogPriority priority; 61*598139dcSAndroid Build Coastguard Worker int32_t uid; 62*598139dcSAndroid Build Coastguard Worker int32_t pid; 63*598139dcSAndroid Build Coastguard Worker int32_t tid; 64*598139dcSAndroid Build Coastguard Worker const char* tag; 65*598139dcSAndroid Build Coastguard Worker size_t tagLen; 66*598139dcSAndroid Build Coastguard Worker size_t messageLen; 67*598139dcSAndroid Build Coastguard Worker const char* message; 68*598139dcSAndroid Build Coastguard Worker } AndroidLogEntry; 69*598139dcSAndroid Build Coastguard Worker 70*598139dcSAndroid Build Coastguard Worker AndroidLogFormat* android_log_format_new(); 71*598139dcSAndroid Build Coastguard Worker 72*598139dcSAndroid Build Coastguard Worker void android_log_format_free(AndroidLogFormat* p_format); 73*598139dcSAndroid Build Coastguard Worker 74*598139dcSAndroid Build Coastguard Worker /* currently returns 0 if format is a modifier, 1 if not */ 75*598139dcSAndroid Build Coastguard Worker int android_log_setPrintFormat(AndroidLogFormat* p_format, 76*598139dcSAndroid Build Coastguard Worker AndroidLogPrintFormat format); 77*598139dcSAndroid Build Coastguard Worker 78*598139dcSAndroid Build Coastguard Worker /** 79*598139dcSAndroid Build Coastguard Worker * Returns FORMAT_OFF on invalid string 80*598139dcSAndroid Build Coastguard Worker */ 81*598139dcSAndroid Build Coastguard Worker AndroidLogPrintFormat android_log_formatFromString(const char* s); 82*598139dcSAndroid Build Coastguard Worker 83*598139dcSAndroid Build Coastguard Worker /** 84*598139dcSAndroid Build Coastguard Worker * filterExpression: a single filter expression 85*598139dcSAndroid Build Coastguard Worker * eg "AT:d" 86*598139dcSAndroid Build Coastguard Worker * 87*598139dcSAndroid Build Coastguard Worker * returns 0 on success and -1 on invalid expression 88*598139dcSAndroid Build Coastguard Worker * 89*598139dcSAndroid Build Coastguard Worker * Assumes single threaded execution 90*598139dcSAndroid Build Coastguard Worker * 91*598139dcSAndroid Build Coastguard Worker */ 92*598139dcSAndroid Build Coastguard Worker 93*598139dcSAndroid Build Coastguard Worker int android_log_addFilterRule(AndroidLogFormat* p_format, 94*598139dcSAndroid Build Coastguard Worker const char* filterExpression); 95*598139dcSAndroid Build Coastguard Worker 96*598139dcSAndroid Build Coastguard Worker /** 97*598139dcSAndroid Build Coastguard Worker * filterString: a whitespace-separated set of filter expressions 98*598139dcSAndroid Build Coastguard Worker * eg "AT:d *:i" 99*598139dcSAndroid Build Coastguard Worker * 100*598139dcSAndroid Build Coastguard Worker * returns 0 on success and -1 on invalid expression 101*598139dcSAndroid Build Coastguard Worker * 102*598139dcSAndroid Build Coastguard Worker * Assumes single threaded execution 103*598139dcSAndroid Build Coastguard Worker * 104*598139dcSAndroid Build Coastguard Worker */ 105*598139dcSAndroid Build Coastguard Worker 106*598139dcSAndroid Build Coastguard Worker int android_log_addFilterString(AndroidLogFormat* p_format, 107*598139dcSAndroid Build Coastguard Worker const char* filterString); 108*598139dcSAndroid Build Coastguard Worker 109*598139dcSAndroid Build Coastguard Worker /** 110*598139dcSAndroid Build Coastguard Worker * returns 1 if this log line should be printed based on its priority 111*598139dcSAndroid Build Coastguard Worker * and tag, and 0 if it should not 112*598139dcSAndroid Build Coastguard Worker */ 113*598139dcSAndroid Build Coastguard Worker int android_log_shouldPrintLine(AndroidLogFormat* p_format, const char* tag, 114*598139dcSAndroid Build Coastguard Worker android_LogPriority pri); 115*598139dcSAndroid Build Coastguard Worker 116*598139dcSAndroid Build Coastguard Worker /** 117*598139dcSAndroid Build Coastguard Worker * Splits a wire-format buffer into an AndroidLogEntry 118*598139dcSAndroid Build Coastguard Worker * entry allocated by caller. Pointers will point directly into buf 119*598139dcSAndroid Build Coastguard Worker * 120*598139dcSAndroid Build Coastguard Worker * Returns 0 on success and -1 on invalid wire format (entry will be 121*598139dcSAndroid Build Coastguard Worker * in unspecified state) 122*598139dcSAndroid Build Coastguard Worker */ 123*598139dcSAndroid Build Coastguard Worker int android_log_processLogBuffer(struct logger_entry* buf, 124*598139dcSAndroid Build Coastguard Worker AndroidLogEntry* entry); 125*598139dcSAndroid Build Coastguard Worker 126*598139dcSAndroid Build Coastguard Worker /** 127*598139dcSAndroid Build Coastguard Worker * Like android_log_processLogBuffer, but for binary logs. 128*598139dcSAndroid Build Coastguard Worker * 129*598139dcSAndroid Build Coastguard Worker * If "map" is non-NULL, it will be used to convert the log tag number 130*598139dcSAndroid Build Coastguard Worker * into a string. 131*598139dcSAndroid Build Coastguard Worker */ 132*598139dcSAndroid Build Coastguard Worker int android_log_processBinaryLogBuffer(struct logger_entry* buf, 133*598139dcSAndroid Build Coastguard Worker AndroidLogEntry* entry, 134*598139dcSAndroid Build Coastguard Worker const EventTagMap* map, char* messageBuf, 135*598139dcSAndroid Build Coastguard Worker int messageBufLen); 136*598139dcSAndroid Build Coastguard Worker 137*598139dcSAndroid Build Coastguard Worker /** 138*598139dcSAndroid Build Coastguard Worker * Formats a log message into a buffer 139*598139dcSAndroid Build Coastguard Worker * 140*598139dcSAndroid Build Coastguard Worker * Uses defaultBuffer if it can, otherwise malloc()'s a new buffer 141*598139dcSAndroid Build Coastguard Worker * If return value != defaultBuffer, caller must call free() 142*598139dcSAndroid Build Coastguard Worker * Returns NULL on malloc error 143*598139dcSAndroid Build Coastguard Worker */ 144*598139dcSAndroid Build Coastguard Worker 145*598139dcSAndroid Build Coastguard Worker char* android_log_formatLogLine(AndroidLogFormat* p_format, char* defaultBuffer, 146*598139dcSAndroid Build Coastguard Worker size_t defaultBufferSize, 147*598139dcSAndroid Build Coastguard Worker const AndroidLogEntry* p_line, 148*598139dcSAndroid Build Coastguard Worker size_t* p_outLength); 149*598139dcSAndroid Build Coastguard Worker 150*598139dcSAndroid Build Coastguard Worker /** 151*598139dcSAndroid Build Coastguard Worker * Formats a log message into a FILE*. 152*598139dcSAndroid Build Coastguard Worker */ 153*598139dcSAndroid Build Coastguard Worker size_t android_log_printLogLine(AndroidLogFormat* p_format, FILE* fp, const AndroidLogEntry* entry); 154*598139dcSAndroid Build Coastguard Worker 155*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus 156*598139dcSAndroid Build Coastguard Worker } 157*598139dcSAndroid Build Coastguard Worker #endif 158