EasyLogger
EasyLogger copied to clipboard
有些代码并不是可跨平台移植的
Easylogger 一些代码并不是可跨平台移植的,导致可移植的代码和port之间界限不是很清晰
比如elog_file.c使用了libc fopen/fwrite这些函数,虽然libc是标准的,但实际情况是很多嵌入式平台上没有,而使用的如fatfs, littefs等FS接口。进而要求用户手动改elog_file.c文件,其中关于file rotation的部分比较容易出错。最近在一个平台上使用easylogger的时候做了一些修改,在elog_file.c中使用一组自定义的简单文件接口,而在elog_file_port.c中只需要实现这些接口即可
elog_file_port.h
#define ELOG_FILE_INVALID_HANDLE -1
typedef int ElogFileHandle;
/* file port */
ElogErrCode elog_file_port_init(void);
#ifdef ELOG_FILE_LOCK_ENABLE
void elog_file_port_lock(void);
void elog_file_port_unlock(void);
#define ELOG_FILE_LOCK() elog_file_port_lock()
#define ELOG_FILE_UNLOCK() elog_file_port_unlock()
#else
#define ELOG_FILE_LOCK()
#define ELOG_FILE_UNLOCK()
#endif
void elog_file_port_deinit(void);
ElogFileHandle elog_file_port_open_file_append_mode(const char *file_name);
bool elog_file_port_is_file_exist(const char *file_name);
size_t elog_file_port_get_file_size(ElogFileHandle handle);
size_t elog_file_port_write_file(ElogFileHandle handle, const uint8_t *buffer, size_t size);
void elog_file_port_remove_file(const char *file_name);
void elog_file_port_rename_file(const char* old_file_name, const char* new_file_name);
void elog_file_port_close_file(ElogFileHandle handle);
具体这些接口的命名和实现可以讨论, 如果认可这种方式,可以进一步讨论接口机命名,我可以进一步提供PR,包含几个常见文件系统port.
类似的情况还有elog_async.c中包含pthread的代码,如果不支持pthread,用户要修改elog_async.c,并理解async是怎么实现的。如果能有port层,无需理解实现只要按照接口要求实现线程、信号的操作即可。(这个我目前没有实现吗,只是拿出来举例)
- elog_file.c 使用的是标准的 libc 文件系统接口,其本身是跨平台的。应该说是 fatfs, littefs 没有按照标准来实现,这块你可以参考 RT-Thread 的 DFS 框架,底层兼容了各种文件系统,上层统一出来 libc/posix 的文件系统接口,而 elog 依赖的是这层接口
- elog_async.c 其实只是用 pthread 实现了一种异步日志形式的参考,在 https://github.com/armink/EasyLogger/blob/master/demo/os/rt-thread/stm32f10x/components/easylogger/port/elog_port.c 还有 RT-Thread 异步日志的实现示例,不同操作系统,参考这个实现一下就好了