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