分享⼀个⽇志系统源码(C语⾔)
代码路径:
这是⼀个简单、⾼效和轻量级C语⾔写的的⽇志系统,linux下不需要第三⽅库安装。⽬前主要是在linux下编写和测试,通⽤分⽀()为⼀个基于Apache的(⼀个C语⾔跨平台的开源库)编写的跨平台版本,由于精⼒有限只基于最简单的⽇志打印功能进⾏了改写,仅供参考。
⽇志系统⽀持多线程多句柄、印级别控制、IO缓存设置、备份控制、⽇志⽂件⼤⼩控制、异常退出堆栈打印、加密(AES-128)、压缩(lz4)和散列校验(MD5)。所有配置和接⼝都在log.h内。堆栈打印是接收所有异常退出信号时打印堆栈,输出⽂件名通过TRACE_PRINT_PATH宏控制,在其信号处理时还对所有⽇志句柄进⾏刷新处理,减少⽇志丢失可能。下⾯介绍下接⼝使⽤:
⽇志创建:
//log_filename:输出⽂件名。
//max_file_size:每个⽂件最⼤上限。
//max_file_bak:最⼤备份⽂件数量,备份⽂件名为输出⽂件名末尾+备份序号,如有其它需要可⾃⾏修改。
//max_iobuf_size:IO缓存⼤⼩,可以设为0⽆缓存。
//cflag:三个宏选项,NORMALIZE, ENCRYPT, COMPRESS 或者 ENCRYPT|COMPRESS,分别对应正常,只加密/压缩,加密和压缩。
//password:密码,在cflag有设ENCRYPT时⽣效。
//返回为⼀个log句柄,可以创建多个,数量最⼤值由MAX_HANDLE_NUM宏控制。
log_t* log_create(const char *log_filename, size_t max_file_size, size_t max_file_bak, size_t max_iobuf_size, int cflag, const char *password);
刷新和销毁为:
//刷新是将IO缓存内数据刷新到⽂件内,lh为创建返回的句柄指针。
void log_flush(log_t *lh);
void log_destory(log_t *lh);
⽇志打印:
/*⽇志内容可以是任意类型,由format控制(类似printf函数的format)。⽇志等级设置为四个宏LOG_DEBUG、
LOG_INFO、LOG_WARN和LOG_ERROR(如有需要更多细分可以很⽅便添加扩展),代码中低于此等级的打印不会⽣效,LOG_CLOSE为关闭⽇志功能,所有打印在编译期间过滤不影响效率。LOG_DEBUG会额外输出:时间⽂件名【⾏号】线程号: ***(⽇志内容)。*/
#define log_debug(lh, format, ...)
#define log_info(lh, format, ...)
#define log_warn(lh, format, ...)
#define log_error(lh, format, ...)
⽇志解密、解压和散列:
//in_filename:待解密⽂件名,解密完成不删除
//out_filename:解密后⽂件名
//password:对应创建log句柄的密码
//返回0-成功,其他-失败。
int log_decipher(const char *in_filename, const char *out_filename, const char *password);
//src_filename:带解压⽂件,解压完不删除
//dst_filename:解压后⽂件名
//返回0-成功,其他-失败。解缩内部有校验。
//注意加密是在每条⽇志写⼊IO缓存前进⾏的,压缩是备份时整个⽂件进⾏压缩的,所以如果同时加密压缩,先解压再解密
免费分享源码大全 int log_uncompress(const char *src_filename, const char *dst_filename);
//filename:待散列⽂件名
//digest:输出转化为32个⼗六进制字符,如果digest为NULL,内部会⾃动申请内存,否则其size⾄少应为33(32加尾部'\0')
//返回:digest
char* log_md5(const char *filename, char *digest);
所有具体使⽤有个简单测试例⼦在sample⽂件夹内,直接make就可以⽣成,详细可看代码,内部还有⼀个多线程安全时间计时器可以精确到纳秒,计数器个数可以由TIMEKEEPER_NUM这个宏控制,详细功能可以看。
最后欢迎提问和反馈问题,不胜感激!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论