1. 介绍EasyLogger 是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, EasyLogger 的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件形式进行动态扩展。 1.1 主要特性- 支持用户自定义输出方式(例如:终端、文件、数据库、串口、485、Flash...);
- 日志内容可包含级别、时间戳、线程信息、进程信息等;
- 日志输出被设计为线程安全的方式,并支持 异步输出 及 缓冲输出 模式;
- 支持多种操作系统(RT-Thread、UCOS、Linux、Windows...),也支持裸机平台;
- 日志支持 RAW格式 ;
- 支持按 标签 、 级别 、 关键词 进行动态过滤;
- 各级别日志支持不同颜色显示
- 扩展性强,支持以插件形式扩展新功能。
名词解释: 1、RAW格式:未经过格式化的原始日志。 2、标签:在软件中可以按照文件、模块、功能等方面,对需要打印的日志设定标签,实现日志分类。 2、移植下载地址 https://github.com/armink/EasyLogger
2.1、将下图文件夹拷贝到自己的工程目录下
2.2、提供接口和配置文件,如下图所示,创建如下文件
elog_cfg.h:配置文件
elog_port.c:接口文件
- elog_port.c:
- #include
- #include
- #include
- #include
- #include <time.h>
- static pthread_mutex_t output_lock;
- /**
- * EasyLogger port initialize
- *
- * [url=home.php?mod=space&uid=1141835]@Return[/url] result
- */
- ElogErrCode elog_port_init(void) {
- ElogErrCode result = ELOG_NO_ERR;
- pthread_mutex_init(&output_lock, NULL);
- return result;
- }
- /**
- * output log port interface
- *
- * @param log output of log
- * @param size log size
- */
- void elog_port_output(const char *log, size_t size) {
- /* output to terminal */
- printf("%.*s", size, log);
- }
- /**
- * output lock
- */
- void elog_port_output_lock(void) {
- pthread_mutex_lock(&output_lock);
- }
- /**
- * output unlock
- */
- void elog_port_output_unlock(void) {
- pthread_mutex_unlock(&output_lock);
- }
- /**
- * get current time interface
- *
- * @return current time
- */
- const char *elog_port_get_time(void) {
- static char cur_system_time[24] = { 0 };
- time_t timep;
- struct tm *p;
- time(&timep);
- p = localtime(&timep);
- if (p == NULL) {
- return "";
- }
- snprintf(cur_system_time, 18, "%02d-%02d %02d:%02d:%02d", p->tm_mon + 1, p->tm_mday,
- p->tm_hour, p->tm_min, p->tm_sec);
- return cur_system_time;
- }
- /**
- * get current process name interface
- *
- * @return current process name
- */
- const char *elog_port_get_p_info(void) {
- static char cur_process_info[10] = { 0 };
- snprintf(cur_process_info, 10, "pid:%04d", getpid());
- return cur_process_info;
- }
- /**
- * get current thread name interface
- *
- * @return current thread name
- */
- const char *elog_port_get_t_info(void) {
- static char cur_thread_info[10] = { 0 };
- snprintf(cur_thread_info, 10, "tid:%04ld", pthread_self());
- return cur_thread_info;
- }
复制代码
- elog_cfg.h
- #ifndef _ELOG_CFG_H_
- #define _ELOG_CFG_H_
- /* enable log output. default open this macro */
- #define ELOG_OUTPUT_ENABLE
- /* setting static output log level */
- #define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE
- /* enable assert check */
- #define ELOG_ASSERT_ENABLE
- /* buffer size for every line's log */
- #define ELOG_LINE_BUF_SIZE 512
- /* output line number max length */
- #define ELOG_LINE_NUM_MAX_LEN 5
- /* output filter's tag max length */
- #define ELOG_FILTER_TAG_MAX_LEN 16
- /* output filter's keyword max length */
- #define ELOG_FILTER_KW_MAX_LEN 16
- /* output newline sign */
- #define ELOG_NEWLINE_SIGN "n"
- /* enable log color */
- #define ELOG_COLOR_ENABLE
- /* enable asynchronous output mode */
- #define ELOG_ASYNC_OUTPUT_ENABLE
- /* buffer size for asynchronous output mode */
- #define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 100)
- /* each asynchronous output's log which must end with newline sign */
- //#define ELOG_ASYNC_LINE_OUTPUT
- /* asynchronous output mode using POSIX pthread implementation */
- #define ELOG_ASYNC_OUTPUT_USING_PTHREAD
- #endif /* _ELOG_CFG_H_ */
复制代码
2.3、编写测试函数
- main.c
- #define LOG_TAG "main"
- #include
- #include
- #include
- #include
- static void test_elog(void);
- int main(void) {
- /* close printf buffer */
- setbuf(stdout, NULL);
- /* initialize EasyLogger */
- elog_init();
- /* set EasyLogger log format */
- elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
- elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
- elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
- elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
- elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
- elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
- #ifdef ELOG_COLOR_ENABLE
- elog_set_text_color_enabled(true);
- #endif
- /* start EasyLogger */
- elog_start();
- /* dynamic set enable or disable for output logs (true or false) */
- // elog_set_output_enabled(false);
- /* dynamic set output logs's level (from ELOG_LVL_ASSERT to ELOG_LVL_VERBOSE) */
- // elog_set_filter_lvl(ELOG_LVL_WARN);
- /* dynamic set output logs's filter for tag */
- // elog_set_filter_tag("test");
- /* dynamic set output logs's filter for keyword */
- // elog_set_filter_kw("word");
- /* test logger output */
- test_elog();
- return EXIT_SUCCESS;
- }
- /**
- * EasyLogger demo
- */
- void test_elog(void) {
- while(true) {
- /* test log output for all level */
- log_a("Hello EasyLogger!");
- log_e("Hello EasyLogger!");
- log_w("Hello EasyLogger!");
- log_i("Hello EasyLogger!");
- log_d("Hello EasyLogger!");
- log_v("Hello EasyLogger!");
- elog_d("test","hello word!");
- elog_raw("Hello EasyLogger!");
- sleep(5);
- }
- }
复制代码
make.sh
- #!/bin/bash
- mkdir out
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "easylogger/src/elog.c" -o "out/elog.o"
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "easylogger/src/elog_async.c" -o "out/elog_async.o"
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "easylogger/src/elog_buf.c" -o "out/elog_buf.o"
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "easylogger/src/elog_utils.c" -o "out/elog_utils.o"
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "elog_port.c" -o "out/elog_port.o"
- gcc -I "easylogger/inc" -O0 -g3 -Wall -c "main.c" -o "out/main.o"
- gcc -o out/EasyLoggerLinuxDemo "out/elog.o" "out/elog_async.o" "out/elog_buf.o" "out/elog_port.o" "out/elog_utils.o" "out/main.o" -lpthread
复制代码
3、执行./make.sh编译脚本
3、执行./ out/EasyLoggerLinuxDemo
|