1*2b54f0dbSXin Li# clog: C-style (a-la printf) logging library 2*2b54f0dbSXin Li 3*2b54f0dbSXin Li[](https://github.com/pytorch/cpuinfo/blob/master/deps/clog/LICENSE) 4*2b54f0dbSXin Li 5*2b54f0dbSXin LiC-style library for logging errors, warnings, information notes, and debug information. 6*2b54f0dbSXin Li 7*2b54f0dbSXin Li## Features 8*2b54f0dbSXin Li 9*2b54f0dbSXin Li- printf-style interface for formatting variadic parameters. 10*2b54f0dbSXin Li- Separate functions for logging errors, warnings, information notes, and debug information. 11*2b54f0dbSXin Li- Independent logging settings for different modules. 12*2b54f0dbSXin Li- Logging to logcat on Android and stderr/stdout on other platforms. 13*2b54f0dbSXin Li- Compatible with C99 and C++. 14*2b54f0dbSXin Li- Covered with unit tests. 15*2b54f0dbSXin Li 16*2b54f0dbSXin Li## Example 17*2b54f0dbSXin Li 18*2b54f0dbSXin Li```c 19*2b54f0dbSXin Li#include <clog.h> 20*2b54f0dbSXin Li 21*2b54f0dbSXin Li#ifndef MYMODULE_LOG_LEVEL 22*2b54f0dbSXin Li #define MYMODULE_LOG_LEVEL CLOG_DEBUG 23*2b54f0dbSXin Li#endif 24*2b54f0dbSXin Li 25*2b54f0dbSXin LiCLOG_DEFINE_LOG_DEBUG(mymodule_, "My Module", MYMODULE_LOG_LEVEL); 26*2b54f0dbSXin LiCLOG_DEFINE_LOG_INFO(mymodule_, "My Module", MYMODULE_LOG_LEVEL); 27*2b54f0dbSXin LiCLOG_DEFINE_LOG_WARNING(mymodule_, "My Module", MYMODULE_LOG_LEVEL); 28*2b54f0dbSXin LiCLOG_DEFINE_LOG_ERROR(mymodule_, "My Module", MYMODULE_LOG_LEVEL); 29*2b54f0dbSXin Li 30*2b54f0dbSXin Li... 31*2b54f0dbSXin Li 32*2b54f0dbSXin Livoid some_function(...) { 33*2b54f0dbSXin Li int status = ... 34*2b54f0dbSXin Li if (status != 0) { 35*2b54f0dbSXin Li mymodule_log_error( 36*2b54f0dbSXin Li "something really bad happened: " 37*2b54f0dbSXin Li "operation failed with status %d", status); 38*2b54f0dbSXin Li } 39*2b54f0dbSXin Li 40*2b54f0dbSXin Li uint32_t expected_zero = ... 41*2b54f0dbSXin Li if (expected_zero != 0) { 42*2b54f0dbSXin Li mymodule_log_warning( 43*2b54f0dbSXin Li "something suspicious happened (var = %"PRIu32"), " 44*2b54f0dbSXin Li "fall back to generic implementation", expected_zero); 45*2b54f0dbSXin Li } 46*2b54f0dbSXin Li 47*2b54f0dbSXin Li void* usually_non_null = ... 48*2b54f0dbSXin Li if (usually_non_null == NULL) { 49*2b54f0dbSXin Li mymodule_log_info( 50*2b54f0dbSXin Li "something unusual, but common, happened: " 51*2b54f0dbSXin Li "enabling work-around"); 52*2b54f0dbSXin Li } 53*2b54f0dbSXin Li 54*2b54f0dbSXin Li float a = ... 55*2b54f0dbSXin Li mymodule_log_debug("computed a = %.7f", a); 56*2b54f0dbSXin Li} 57*2b54f0dbSXin Li``` 58