xref: /aosp_15_r20/external/cpuinfo/deps/clog/README.md (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li# clog: C-style (a-la printf) logging library
2*2b54f0dbSXin Li
3*2b54f0dbSXin Li[![BSD (2 clause) License](https://img.shields.io/badge/License-BSD%202--Clause%20%22Simplified%22%20License-blue.svg)](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