嵌入式linux下的c语言简易日志log模块,带颜色显示(一)
时间:2022-07-22
本文章向大家介绍嵌入式linux下的c语言简易日志log模块,带颜色显示(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
示例:
Log(DEBUG,"this is debugn"); Log(INFO,"this is infon"); Log(ERROR,"this is errorn"); Log(WARN,"this is warnn");
一个log.c文件和一个log.h文件
使用时包含log.h文件即可。暂时支持四个级别和红绿黄蓝四种颜色,若要增加或扩展,自行更改。
不支持存储日志到文件,以及对日志文件的按日期,按大小等的切割,如有需要,可自行扩展。
计划增加以下内容:
1.增加是否启用日志输出到文件开关,可以选择把日志保存到文件中(写文件属于耗时操作,这块可考虑发送事件或消息给线程去写日志,操做日志的切割)。
2.按日期生成日志文件,可配置保留多少天,超过设定的天数则自动清除超过天数的日志。
3.可增加参数设定限制日志文件的大小,超过限制大小可选择是从头覆盖还是删除重记,还是不在记录。
log.c文件内容:
/**
日志打印示例。
使用:
Log(DEBUG, "This is debug infon");
结果:
[2018-07-22 23:37:27:172] [DEBUG] [main.cpp:5] This is debug info
默认打印当前时间(精确到毫秒)、文件名称、行号。
*/
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "log.h"
#ifndef LOGLEVEL
#define LOGLEVEL DEBUG
#endif
// 使用了GNU C扩展语法,只在gcc(C语言)生效,
// g++的c++版本编译不通过
static const char* s_loginfo[] = {
[ERROR] = "ERROR",
[WARN] = "WARN",
[INFO] = "INFO",
[DEBUG] = "DEBUG",
};
static void get_timestamp(char *buffer)
{
time_t t;
struct tm *p;
struct timeval tv;
int len;
int millsec;
t = time(NULL);
p = localtime(&t);
gettimeofday(&tv, NULL);
millsec = (int)(tv.tv_usec / 1000);
/* 时间格式:[2011-11-15 12:47:34:888] */
len = snprintf(buffer, 32, "[%04d-%02d-%02d %02d:%02d:%02d:%03d] ",
p->tm_year+1900, p->tm_mon+1,
p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, millsec);
buffer[len] = ' ';
}
void mylog1(const char* filename, int line, enum LogLevel level, const char* fmt, ...)
{
if(level > LOGLEVEL)
return;
va_list arg_list;
char buf[1024];
memset(buf, 0, 1024);
va_start(arg_list, fmt);
vsnprintf(buf, 1024, fmt, arg_list);
char time[32] = {0};
// 去掉*可能*存在的目录路径,只保留文件名
const char* tmp = strrchr(filename, '/');
if (!tmp) tmp = filename;
else tmp++;
get_timestamp(time);
switch(level){
case DEBUG:
//绿色
printf(" 33[1;32m%s[%s] [%s:%d] %sn 33[0m", time, s_loginfo[level], tmp, line, buf);
break;
case INFO:
//蓝色
printf(" 33[1;34m%s[%s] [%s:%d] %sn 33[0m", time, s_loginfo[level], tmp, line, buf);
break;
case ERROR:
//红色
printf(" 33[1;31m%s[%s] [%s:%d] %sn 33[0m", time, s_loginfo[level], tmp, line, buf);
break;
case WARN:
//黄色
printf(" 33[1;33m%s[%s] [%s:%d] %sn 33[0m", time, s_loginfo[level], tmp, line, buf);
break;
}
va_end(arg_list);
}
log.h头文件内容:
#ifndef LOG_H_
#define LOG_H_
#ifdef __cplusplus
extern "C" {
#endif
enum LogLevel
{
ERROR = 1,
WARN = 2,
INFO = 3,
DEBUG = 4,
};
void mylog1(const char* filename, int line, enum LogLevel level, const char* fmt, ...) __attribute__((format(printf,4,5)));
#define Log(level, format, ...) mylog1(__FILE__, __LINE__, level, format, ## __VA_ARGS__)
#ifdef __cplusplus
};
#endif
#
- PHP验证手机号码和归属地 PHP函数代码
- 浅谈PHP 5中垃圾回收算法的演化
- POJ 2484 A Funny Game(智商博弈)
- php pathinfo()的用法
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 微信公众平台开发
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- 洛谷P2252 取石子游戏(威佐夫博弈)
- HDU 3032 Nim or not Nim?(Multi-Nim)
- POJ 2311 Cutting Game(二维SG+Multi-Nim)
- js去掉html标签和去掉字符串文本的所有的空格
- php操作memcache的使用测试总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go 语言学习之流程控制
- MinGW 安装
- 实践 | 目前最快精度最高检测框架(EfficientDet)
- 解决拉取github仓库报错“gnutls_handshake() failed”问题
- HTML 学习
- Go 语言学习之数组
- 坐姿不对,屏幕就变模糊!小姐姐教你用TensorFlow做一款“隐形背背佳”
- 七日Python之路--第九天(blog与Django)
- Python数据可视化-seaborn Iris鸢尾花数据
- pythonGUI -- pyside安装与初试
- TS 设计模式02 - 建造者模式
- 艺术鬼才!Unicode 字符还能这么玩?
- TS 设计模式03 - 单例模式
- MySQL 案例:Limit 分页查询优化
- 白话Xavier | 神经网络初始化的工程选择