1*4a64e381SAndroid Build Coastguard Worker /* 2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2017, The OpenThread Authors. 3*4a64e381SAndroid Build Coastguard Worker * All rights reserved. 4*4a64e381SAndroid Build Coastguard Worker * 5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*4a64e381SAndroid Build Coastguard Worker * 16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 27*4a64e381SAndroid Build Coastguard Worker */ 28*4a64e381SAndroid Build Coastguard Worker 29*4a64e381SAndroid Build Coastguard Worker /** 30*4a64e381SAndroid Build Coastguard Worker * @file 31*4a64e381SAndroid Build Coastguard Worker * This file define logging interface. 32*4a64e381SAndroid Build Coastguard Worker */ 33*4a64e381SAndroid Build Coastguard Worker #ifndef OTBR_COMMON_LOGGING_HPP_ 34*4a64e381SAndroid Build Coastguard Worker #define OTBR_COMMON_LOGGING_HPP_ 35*4a64e381SAndroid Build Coastguard Worker 36*4a64e381SAndroid Build Coastguard Worker #include "openthread-br/config.h" 37*4a64e381SAndroid Build Coastguard Worker 38*4a64e381SAndroid Build Coastguard Worker #include <stdarg.h> 39*4a64e381SAndroid Build Coastguard Worker #include <stddef.h> 40*4a64e381SAndroid Build Coastguard Worker 41*4a64e381SAndroid Build Coastguard Worker #ifndef OTBR_LOG_TAG 42*4a64e381SAndroid Build Coastguard Worker #error "OTBR_LOG_TAG is not defined" 43*4a64e381SAndroid Build Coastguard Worker #endif 44*4a64e381SAndroid Build Coastguard Worker 45*4a64e381SAndroid Build Coastguard Worker #include "common/types.hpp" 46*4a64e381SAndroid Build Coastguard Worker 47*4a64e381SAndroid Build Coastguard Worker /** 48*4a64e381SAndroid Build Coastguard Worker * Logging level. 49*4a64e381SAndroid Build Coastguard Worker */ 50*4a64e381SAndroid Build Coastguard Worker typedef enum 51*4a64e381SAndroid Build Coastguard Worker { 52*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_EMERG, ///< System is unusable 53*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_ALERT, ///< Action must be taken immediately 54*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_CRIT, ///< Critical conditions 55*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_ERR, ///< Error conditions 56*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_WARNING, ///< Warning conditions 57*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_NOTICE, ///< Normal but significant condition 58*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_INFO, ///< Informational 59*4a64e381SAndroid Build Coastguard Worker OTBR_LOG_DEBUG, ///< Debug level messages 60*4a64e381SAndroid Build Coastguard Worker } otbrLogLevel; 61*4a64e381SAndroid Build Coastguard Worker 62*4a64e381SAndroid Build Coastguard Worker /** 63*4a64e381SAndroid Build Coastguard Worker * Get current log level. 64*4a64e381SAndroid Build Coastguard Worker */ 65*4a64e381SAndroid Build Coastguard Worker otbrLogLevel otbrLogGetLevel(void); 66*4a64e381SAndroid Build Coastguard Worker 67*4a64e381SAndroid Build Coastguard Worker /** 68*4a64e381SAndroid Build Coastguard Worker * Get default log level. 69*4a64e381SAndroid Build Coastguard Worker */ 70*4a64e381SAndroid Build Coastguard Worker otbrLogLevel otbrLogGetDefaultLevel(void); 71*4a64e381SAndroid Build Coastguard Worker 72*4a64e381SAndroid Build Coastguard Worker /** 73*4a64e381SAndroid Build Coastguard Worker * Set current log level. 74*4a64e381SAndroid Build Coastguard Worker */ 75*4a64e381SAndroid Build Coastguard Worker void otbrLogSetLevel(otbrLogLevel aLevel); 76*4a64e381SAndroid Build Coastguard Worker 77*4a64e381SAndroid Build Coastguard Worker /** 78*4a64e381SAndroid Build Coastguard Worker * Control log to syslog. 79*4a64e381SAndroid Build Coastguard Worker * 80*4a64e381SAndroid Build Coastguard Worker * @param[in] aEnabled True to enable logging to/via syslog. 81*4a64e381SAndroid Build Coastguard Worker */ 82*4a64e381SAndroid Build Coastguard Worker void otbrLogSyslogSetEnabled(bool aEnabled); 83*4a64e381SAndroid Build Coastguard Worker 84*4a64e381SAndroid Build Coastguard Worker /** 85*4a64e381SAndroid Build Coastguard Worker * This function initialize the logging service. 86*4a64e381SAndroid Build Coastguard Worker * 87*4a64e381SAndroid Build Coastguard Worker * @param[in] aProgramName The name of this runnable program. 88*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel Log level of the logger. 89*4a64e381SAndroid Build Coastguard Worker * @param[in] aPrintStderr Whether to log to stderr. 90*4a64e381SAndroid Build Coastguard Worker * @param[in] aSyslogDisable Whether to disable logging to syslog. 91*4a64e381SAndroid Build Coastguard Worker */ 92*4a64e381SAndroid Build Coastguard Worker void otbrLogInit(const char *aProgramName, otbrLogLevel aLevel, bool aPrintStderr, bool aSyslogDisable); 93*4a64e381SAndroid Build Coastguard Worker 94*4a64e381SAndroid Build Coastguard Worker /** 95*4a64e381SAndroid Build Coastguard Worker * This function log at level @p aLevel. 96*4a64e381SAndroid Build Coastguard Worker * 97*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel Log level of the logger. 98*4a64e381SAndroid Build Coastguard Worker * @param[in] aLogTag Log tag. 99*4a64e381SAndroid Build Coastguard Worker * @param[in] aFormat Format string as in printf. 100*4a64e381SAndroid Build Coastguard Worker */ 101*4a64e381SAndroid Build Coastguard Worker void otbrLog(otbrLogLevel aLevel, const char *aLogTag, const char *aFormat, ...); 102*4a64e381SAndroid Build Coastguard Worker 103*4a64e381SAndroid Build Coastguard Worker /** 104*4a64e381SAndroid Build Coastguard Worker * This function log at level @p aLevel. 105*4a64e381SAndroid Build Coastguard Worker * 106*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel Log level of the logger. 107*4a64e381SAndroid Build Coastguard Worker * @param[in] aFormat Format string as in printf. 108*4a64e381SAndroid Build Coastguard Worker * @param[in] aArgList The variable-length arguments list. 109*4a64e381SAndroid Build Coastguard Worker */ 110*4a64e381SAndroid Build Coastguard Worker void otbrLogv(otbrLogLevel aLevel, const char *aFormat, va_list aArgList); 111*4a64e381SAndroid Build Coastguard Worker 112*4a64e381SAndroid Build Coastguard Worker /** 113*4a64e381SAndroid Build Coastguard Worker * This function writes logs without filtering with the log level. 114*4a64e381SAndroid Build Coastguard Worker * 115*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel Log level of the logger. 116*4a64e381SAndroid Build Coastguard Worker * @param[in] aFormat Format string as in printf. 117*4a64e381SAndroid Build Coastguard Worker * @param[in] aArgList The variable-length arguments list. 118*4a64e381SAndroid Build Coastguard Worker */ 119*4a64e381SAndroid Build Coastguard Worker void otbrLogvNoFilter(otbrLogLevel aLevel, const char *aFormat, va_list aArgList); 120*4a64e381SAndroid Build Coastguard Worker 121*4a64e381SAndroid Build Coastguard Worker /** 122*4a64e381SAndroid Build Coastguard Worker * This function dump memory as hex string at level @p aLevel. 123*4a64e381SAndroid Build Coastguard Worker * 124*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel Log level of the logger. 125*4a64e381SAndroid Build Coastguard Worker * @param[in] aLogTag Log tag. 126*4a64e381SAndroid Build Coastguard Worker * @param[in] aPrefix String before dumping memory. 127*4a64e381SAndroid Build Coastguard Worker * @param[in] aMemory The pointer to the memory to be dumped. 128*4a64e381SAndroid Build Coastguard Worker * @param[in] aSize The size of memory in bytes to be dumped. 129*4a64e381SAndroid Build Coastguard Worker */ 130*4a64e381SAndroid Build Coastguard Worker void otbrDump(otbrLogLevel aLevel, const char *aLogTag, const char *aPrefix, const void *aMemory, size_t aSize); 131*4a64e381SAndroid Build Coastguard Worker 132*4a64e381SAndroid Build Coastguard Worker /** 133*4a64e381SAndroid Build Coastguard Worker * This function converts error code to string. 134*4a64e381SAndroid Build Coastguard Worker * 135*4a64e381SAndroid Build Coastguard Worker * @param[in] aError The error code. 136*4a64e381SAndroid Build Coastguard Worker * 137*4a64e381SAndroid Build Coastguard Worker * @returns The string information of error. 138*4a64e381SAndroid Build Coastguard Worker */ 139*4a64e381SAndroid Build Coastguard Worker const char *otbrErrorString(otbrError aError); 140*4a64e381SAndroid Build Coastguard Worker 141*4a64e381SAndroid Build Coastguard Worker /** 142*4a64e381SAndroid Build Coastguard Worker * This function deinitializes the logging service. 143*4a64e381SAndroid Build Coastguard Worker */ 144*4a64e381SAndroid Build Coastguard Worker void otbrLogDeinit(void); 145*4a64e381SAndroid Build Coastguard Worker 146*4a64e381SAndroid Build Coastguard Worker /** 147*4a64e381SAndroid Build Coastguard Worker * This macro log an action result according to @p aError. 148*4a64e381SAndroid Build Coastguard Worker * 149*4a64e381SAndroid Build Coastguard Worker * If @p aError is OTBR_ERROR_NONE, the log level will be OTBR_LOG_INFO, 150*4a64e381SAndroid Build Coastguard Worker * otherwise OTBR_LOG_WARNING. 151*4a64e381SAndroid Build Coastguard Worker * 152*4a64e381SAndroid Build Coastguard Worker * @param[in] aError The action result. 153*4a64e381SAndroid Build Coastguard Worker * @param[in] aFormat Format string as in printf. 154*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 155*4a64e381SAndroid Build Coastguard Worker */ 156*4a64e381SAndroid Build Coastguard Worker #define otbrLogResult(aError, aFormat, ...) \ 157*4a64e381SAndroid Build Coastguard Worker do \ 158*4a64e381SAndroid Build Coastguard Worker { \ 159*4a64e381SAndroid Build Coastguard Worker otbrError _err = (aError); \ 160*4a64e381SAndroid Build Coastguard Worker otbrLog(_err == OTBR_ERROR_NONE ? OTBR_LOG_INFO : OTBR_LOG_WARNING, OTBR_LOG_TAG, aFormat ": %s", \ 161*4a64e381SAndroid Build Coastguard Worker ##__VA_ARGS__, otbrErrorString(_err)); \ 162*4a64e381SAndroid Build Coastguard Worker } while (0) 163*4a64e381SAndroid Build Coastguard Worker 164*4a64e381SAndroid Build Coastguard Worker /** 165*4a64e381SAndroid Build Coastguard Worker * @def otbrLogEmerg 166*4a64e381SAndroid Build Coastguard Worker * 167*4a64e381SAndroid Build Coastguard Worker * Log at level emergency. 168*4a64e381SAndroid Build Coastguard Worker * 169*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 170*4a64e381SAndroid Build Coastguard Worker */ 171*4a64e381SAndroid Build Coastguard Worker 172*4a64e381SAndroid Build Coastguard Worker /** 173*4a64e381SAndroid Build Coastguard Worker * @def otbrLogAlert 174*4a64e381SAndroid Build Coastguard Worker * 175*4a64e381SAndroid Build Coastguard Worker * Log at level alert. 176*4a64e381SAndroid Build Coastguard Worker * 177*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 178*4a64e381SAndroid Build Coastguard Worker */ 179*4a64e381SAndroid Build Coastguard Worker 180*4a64e381SAndroid Build Coastguard Worker /** 181*4a64e381SAndroid Build Coastguard Worker * @def otbrLogCrit 182*4a64e381SAndroid Build Coastguard Worker * 183*4a64e381SAndroid Build Coastguard Worker * Log at level critical. 184*4a64e381SAndroid Build Coastguard Worker * 185*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 186*4a64e381SAndroid Build Coastguard Worker */ 187*4a64e381SAndroid Build Coastguard Worker 188*4a64e381SAndroid Build Coastguard Worker /** 189*4a64e381SAndroid Build Coastguard Worker * @def otbrLogErr 190*4a64e381SAndroid Build Coastguard Worker * 191*4a64e381SAndroid Build Coastguard Worker * Log at level error. 192*4a64e381SAndroid Build Coastguard Worker * 193*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 194*4a64e381SAndroid Build Coastguard Worker */ 195*4a64e381SAndroid Build Coastguard Worker 196*4a64e381SAndroid Build Coastguard Worker /** 197*4a64e381SAndroid Build Coastguard Worker * @def otbrLogWarning 198*4a64e381SAndroid Build Coastguard Worker * 199*4a64e381SAndroid Build Coastguard Worker * Log at level warning. 200*4a64e381SAndroid Build Coastguard Worker * 201*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 202*4a64e381SAndroid Build Coastguard Worker */ 203*4a64e381SAndroid Build Coastguard Worker 204*4a64e381SAndroid Build Coastguard Worker /** 205*4a64e381SAndroid Build Coastguard Worker * @def otbrLogNotice 206*4a64e381SAndroid Build Coastguard Worker * 207*4a64e381SAndroid Build Coastguard Worker * Log at level notice. 208*4a64e381SAndroid Build Coastguard Worker * 209*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 210*4a64e381SAndroid Build Coastguard Worker */ 211*4a64e381SAndroid Build Coastguard Worker 212*4a64e381SAndroid Build Coastguard Worker /** 213*4a64e381SAndroid Build Coastguard Worker * @def otbrLogInfo 214*4a64e381SAndroid Build Coastguard Worker * 215*4a64e381SAndroid Build Coastguard Worker * Log at level information. 216*4a64e381SAndroid Build Coastguard Worker * 217*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 218*4a64e381SAndroid Build Coastguard Worker */ 219*4a64e381SAndroid Build Coastguard Worker 220*4a64e381SAndroid Build Coastguard Worker /** 221*4a64e381SAndroid Build Coastguard Worker * @def otbrLogDebug 222*4a64e381SAndroid Build Coastguard Worker * 223*4a64e381SAndroid Build Coastguard Worker * Log at level debug. 224*4a64e381SAndroid Build Coastguard Worker * 225*4a64e381SAndroid Build Coastguard Worker * @param[in] ... Arguments for the format specification. 226*4a64e381SAndroid Build Coastguard Worker */ 227*4a64e381SAndroid Build Coastguard Worker #define otbrLogEmerg(...) otbrLog(OTBR_LOG_EMERG, OTBR_LOG_TAG, __VA_ARGS__) 228*4a64e381SAndroid Build Coastguard Worker #define otbrLogAlert(...) otbrLog(OTBR_LOG_ALERT, OTBR_LOG_TAG, __VA_ARGS__) 229*4a64e381SAndroid Build Coastguard Worker #define otbrLogCrit(...) otbrLog(OTBR_LOG_CRIT, OTBR_LOG_TAG, __VA_ARGS__) 230*4a64e381SAndroid Build Coastguard Worker #define otbrLogErr(...) otbrLog(OTBR_LOG_ERR, OTBR_LOG_TAG, __VA_ARGS__) 231*4a64e381SAndroid Build Coastguard Worker #define otbrLogWarning(...) otbrLog(OTBR_LOG_WARNING, OTBR_LOG_TAG, __VA_ARGS__) 232*4a64e381SAndroid Build Coastguard Worker #define otbrLogNotice(...) otbrLog(OTBR_LOG_NOTICE, OTBR_LOG_TAG, __VA_ARGS__) 233*4a64e381SAndroid Build Coastguard Worker #define otbrLogInfo(...) otbrLog(OTBR_LOG_INFO, OTBR_LOG_TAG, __VA_ARGS__) 234*4a64e381SAndroid Build Coastguard Worker #define otbrLogDebug(...) otbrLog(OTBR_LOG_DEBUG, OTBR_LOG_TAG, __VA_ARGS__) 235*4a64e381SAndroid Build Coastguard Worker 236*4a64e381SAndroid Build Coastguard Worker /** 237*4a64e381SAndroid Build Coastguard Worker * Convert otbrLogLevel to otLogLevel. 238*4a64e381SAndroid Build Coastguard Worker * 239*4a64e381SAndroid Build Coastguard Worker * @param[in] aLevel The otbrLogLevel to convert. 240*4a64e381SAndroid Build Coastguard Worker * 241*4a64e381SAndroid Build Coastguard Worker * @return the corresponding OT log level. 242*4a64e381SAndroid Build Coastguard Worker */ 243*4a64e381SAndroid Build Coastguard Worker otLogLevel ConvertToOtLogLevel(otbrLogLevel aLevel); 244*4a64e381SAndroid Build Coastguard Worker 245*4a64e381SAndroid Build Coastguard Worker #endif // OTBR_COMMON_LOGGING_HPP_ 246