From 95f99e32610cf721bab15ee0f773f21102edcbf3 Mon Sep 17 00:00:00 2001 From: zzy <2450266535@qq.com> Date: Sun, 29 Oct 2023 10:48:19 +0800 Subject: [PATCH] dev log 0.1 --- .gitignore | 10 +-- include/llog.h | 149 ++++++++++++++++++++++++++++++++++++++++ test/log/CMakeLists.txt | 16 +++++ test/log/log.c | 20 ++++++ 4 files changed, 187 insertions(+), 8 deletions(-) create mode 100644 test/log/CMakeLists.txt create mode 100644 test/log/log.c diff --git a/.gitignore b/.gitignore index e1f308b..d75b649 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,5 @@ !*/ !include/* !doc/* -!test/client/client.c -!test/client/CMakeLists.txt -!test/server/server.c -!test/server/CMakeLists.txt -!test/thread/thread.c -!test/thread/CMakeLists.txt -!test/bkfifo/bkfifo.c -!test/bkfifo/CMakeLists.txt \ No newline at end of file +!src/* +!test/*/* diff --git a/include/llog.h b/include/llog.h index e69de29..7441921 100644 --- a/include/llog.h +++ b/include/llog.h @@ -0,0 +1,149 @@ +#ifndef _LLOG_H_ +#define _LLOG_H_ + +#include +#include +#include +#include +#include +#include +#include +typedef uint16_t log_mask_t; + +#define LOG_MASK_ENDLINE (1 << 0) +#define LOG_MASK_COLORS (1 << 1) +#define LOG_MASK_LEVEL (1 << 2) +#define LOG_MASK_FILE (1 << 3) +#define LOG_MASK_FUNC (1 << 4) +#define LOG_MASK_LINE (1 << 5) + +#define LOG_MASK_SECOND (1 << 8) +#define LOG_MASK_MINUTE (1 << 9) +#define LOG_MASK_HOUR (1 << 10) +#define LOG_MASK_DAY (1 << 11) +#define LOG_MASK_MONTH (1 << 12) +#define LOG_MASK_YEAR (1 << 13) + +#define LOG_MASK_TIME_HMS (LOG_MASK_SECOND | LOG_MASK_MINUTE | LOG_MASK_HOUR) +#define LOG_MASK_TIME_YMD (LOG_MASK_DAY | LOG_MASK_MONTH | LOG_MASK_YEAR) +#define LOG_MASK_TIME_ALL (LOG_MASK_TIME_HMS | LOG_MASK_TIME_YMD) + +#define LOG_MASK_BASE_DETAIL (LOG_MASK_LEVEL | LOG_MASK_FILE | LOG_MASK_FUNC | LOG_MASK_LINE) +#define LOG_MASK_BASE_STDOUT (LOG_MASK_COLORS | LOG_MASK_BASE_DETAIL | LOG_MASK_TIME_HMS) +#define LOG_MASK_BASE_FILE (LOG_MASK_BASE_DETAIL | LOG_MASK_TIME_ALL) +#define LOG_MASK_BASE_DEFAULT (LOG_MASK_COLORS | LOG_MASK_BASE_DETAIL | LOG_MASK_TIME_ALL) + +#ifdef __cplusplus +extern "C" { +#endif + +enum { _LOG_TRACE, _LOG_DEBUG, _LOG_INFO, _LOG_WARN, _LOG_ERROR, _LOG_FATAL }; + +static const char* _log_level_strings[] = { + "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" +}; + +static const char* _log_level_colors[] = { + "\033[94m", "\033[36m", "\033[32m", "\033[33m", "\033[31m", "\033[35m" +}; + +#define log_head_trace(log, szlog) log_fill_head_str(_LOG_TRACE, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head_debug(log, szlog) log_fill_head_str(_LOG_DEBUG, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head_info(log, szlog) log_fill_head_str(_LOG_INFO, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head_warn(log, szlog) log_fill_head_str(_LOG_WARN, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head_error(log, szlog) log_fill_head_str(_LOG_ERROR, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head_fatal(log, szlog) log_fill_head_str(_LOG_FATAL, log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) +#define log_head(level, log, szlog) log_fill_head_str(level , log, szlog, LOG_MASK_BASE_DEFAULT, __FILE__, __func__, __LINE__) + +#define log_head_trace_ex(log, szlog, mask) log_fill_head_str(_LOG_TRACE, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_debug_ex(log, szlog, mask) log_fill_head_str(_LOG_DEBUG, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_info_ex(log, szlog, mask) log_fill_head_str(_LOG_INFO, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_warn_ex(log, szlog, mask) log_fill_head_str(_LOG_WARN, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_error_ex(log, szlog, mask) log_fill_head_str(_LOG_ERROR, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_fatal_ex(log, szlog, mask) log_fill_head_str(_LOG_FATAL, log, szlog, mask, __FILE__, __func__, __LINE__) +#define log_head_ex(level, log, szlog, mask) log_fill_head_str(level , log, szlog, mask, __FILE__, __func__, __LINE__) + +#define _LOG_MAX_HEAD_BUF_SIZE 128 +static inline size_t log_fill_head_str(int level, char* log, size_t szlog, + log_mask_t mask, const char* file, const char* func, int line) { + size_t szbuf = 0; + char buf[_LOG_MAX_HEAD_BUF_SIZE] = { 0 }; + + time_t t = time(NULL); + struct tm* time = localtime(&t); + + if (LOG_MASK_TIME_YMD & mask) { + if (LOG_MASK_YEAR & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, "%Y", time); + } + else { + sprintf(buf + szbuf, "Y"); + szbuf += 1; + } + if (LOG_MASK_MONTH & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, "-%m", time); + } + else { + sprintf(buf + szbuf, "-M"); + szbuf += 1; + } + if (LOG_MASK_DAY & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, "-%d", time); + } + else { + sprintf(buf + szbuf, "-D"); + szbuf += 1; + } + } + + if (LOG_MASK_TIME_HMS & mask) { + if (LOG_MASK_HOUR & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, " %H", time); + } + else { + sprintf(buf + szbuf, " h"); + szbuf += 2; + } + if (LOG_MASK_MINUTE & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, ":%M", time); + } + else { + sprintf(buf + szbuf, ":m"); + szbuf += 1; + } + if (LOG_MASK_SECOND & mask) { + szbuf += strftime(buf + szbuf, _LOG_MAX_HEAD_BUF_SIZE - szbuf, ":%S", time); + } + else { + sprintf(buf + szbuf, " :s"); + szbuf += 1; + } + } + + if (LOG_MASK_COLORS & mask) { + sprintf(buf + szbuf, " %s%-5s\033[0m \033[90m%.64s:%.24s:%d:\033[0m ", + _log_level_colors[level], + (LOG_MASK_LEVEL & mask) ? _log_level_strings[level] : "nan", + (LOG_MASK_FILE & mask) ? file : "file", + (LOG_MASK_FUNC & mask) ? func : "func", + (LOG_MASK_LINE & mask) ? line : 0); + } + else { + sprintf(buf + szbuf, " %-5s %.64s:%.24s:%d: ", + (LOG_MASK_LEVEL & mask) ? _log_level_strings[level] : "nan", + (LOG_MASK_FILE & mask) ? file : "file", + (LOG_MASK_FUNC & mask) ? func : "func", + (LOG_MASK_LINE & mask) ? line : 0); + } + + if (LOG_MASK_ENDLINE & mask) sprintf(buf, "\n"); + if (szlog <= strlen(buf)) return 0; + strcpy(log, buf); + return strlen(buf); +} + +#ifdef __cplusplus +} +#endif + +#endif /*_LLOG_H_*/ \ No newline at end of file diff --git a/test/log/CMakeLists.txt b/test/log/CMakeLists.txt new file mode 100644 index 0000000..47e8e8b --- /dev/null +++ b/test/log/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.22.1) + +project(log) + +set(EXECUTABLE_OUTPUT_PATH ../) +set(CMAKE_C_STANDARD 99) +set(SRC_FILE log.c) + +include_directories(../../include) +add_executable(${PROJECT_NAME} ${SRC_FILE}) + +if(WIN32) + target_link_libraries(${PROJECT_NAME} wsock32 ws2_32) +endif() +# cmake .. +# cmake --build . \ No newline at end of file diff --git a/test/log/log.c b/test/log/log.c new file mode 100644 index 0000000..d04dfbc --- /dev/null +++ b/test/log/log.c @@ -0,0 +1,20 @@ +#include + +int main() { + char log[128] = { 0 }; + size_t szlog = sizeof(log); + log_head_trace(log, szlog); + printf("%s\n", log); + log_head_debug(log, szlog); + printf("%s\n", log); + log_head_info(log, szlog); + printf("%s\n", log); + log_head_warn(log, szlog); + printf("%s\n", log); + log_head_error(log, szlog); + printf("%s\n", log); + log_head_fatal(log, szlog); + printf("%s\n", log); + getchar(); + return 0; + } \ No newline at end of file