* #将拦截器改名为过滤器,更加接近职能
This commit is contained in:
youmetme
2024-11-23 08:47:48 +08:00
committed by GitHub
parent f0c3a5d56a
commit 064881c0ad
16 changed files with 166 additions and 160 deletions

View File

@@ -48,7 +48,7 @@ int main() {
int main() { int main() {
Logger *logger = newDefaultLogger("testLogger", LOG_DEBUG); Logger *logger = newDefaultLogger("testLogger", LOG_DEBUG);
logger->addHandler(loggingFileHandler("test1", 1024*1024)); logger->addHandler(loggingHandlerFile("test1", 1024*1024));
log_info("This is an info message"); log_info("This is an info message");
log_error("This is an error message%s", "123"); log_error("This is an error message%s", "123");
@@ -61,9 +61,9 @@ int main() {
} }
``` ```
### Logging Interceptor ### Logging filter
> Support adding custom interceptors, currently with built-in substring interceptors > Support adding custom interceptors, currently with built-in substring interceptors
> The function of an interceptor is to redirect intercepted logs to the interceptor's dedicated processor > The function of an filter is to redirect intercepted logs to the filter's dedicated processor
#### example #### example
@@ -83,16 +83,16 @@ int main() {
char *test1[] = {"123", "tt", NULL}; char *test1[] = {"123", "tt", NULL};
log_Interceptor *tint = loggingSubStringInterceptor( log_filter *tint = loggingFilterSubStr(
test1, test1,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor", 1024 * 1024), loggingHandlerFile("test_interceptor", 1024 * 1024),
true); true);
logger->addInterceptor(tint); logger->addFilter(tint);
printf("\n"); printf("\n");
printf("Interceptor added\n"); printf("filter added\n");
printf("\n"); printf("\n");
log_info("This is an info message"); log_info("This is an info message");
@@ -124,26 +124,26 @@ int main() {
char *test1[] = {"This",NULL}; char *test1[] = {"This",NULL};
log_Interceptor *tint = loggingSubStringInterceptor( log_filter *tint = loggingFilterSubStr(
test1, test1,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor", 1024 * 1024), loggingHandlerFile("test_interceptor", 1024 * 1024),
false); false);
logger->addInterceptor(tint); logger->addFilter(tint);
char *test2[] = {"123",NULL}; char *test2[] = {"123",NULL};
log_Interceptor *tint1 = loggingSubStringInterceptor( log_filter *tint1 = loggingFilterSubStr(
test2, test2,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor1", 1024 * 1024), loggingHandlerFile("test_interceptor1", 1024 * 1024),
true); true);
logger->addInterceptor(tint1); logger->addFilter(tint1);
printf("\n"); printf("\n");
printf("Interceptor added\n"); printf("filter added\n");
printf("\n"); printf("\n");
log_info("This is an info message"); log_info("This is an info message");

View File

@@ -51,7 +51,7 @@ int main() {
int main() { int main() {
Logger *logger = newDefaultLogger("testLogger", LOG_DEBUG); Logger *logger = newDefaultLogger("testLogger", LOG_DEBUG);
logger->addHandler(loggingFileHandler("test1", 1024*1024)); logger->addHandler(loggingHandlerFile("test1", 1024*1024));
log_info("This is an info message"); log_info("This is an info message");
log_error("This is an error message%s", "123"); log_error("This is an error message%s", "123");
@@ -87,16 +87,16 @@ int main() {
char *test1[] = {"123", "tt", NULL}; char *test1[] = {"123", "tt", NULL};
log_Interceptor *tint = loggingSubStringInterceptor( log_filter *tint = loggingFilterSubStr(
test1, test1,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor", 1024 * 1024), loggingHandlerFile("test_interceptor", 1024 * 1024),
true); true);
logger->addInterceptor(tint); logger->addFilter(tint);
printf("\n"); printf("\n");
printf("Interceptor added\n"); printf("filter added\n");
printf("\n"); printf("\n");
log_info("This is an info message"); log_info("This is an info message");
@@ -128,26 +128,26 @@ int main() {
char *test1[] = {"This",NULL}; char *test1[] = {"This",NULL};
log_Interceptor *tint = loggingSubStringInterceptor( log_filter *tint = loggingFilterSubStr(
test1, test1,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor", 1024 * 1024), loggingHandlerFile("test_interceptor", 1024 * 1024),
false); false);
logger->addInterceptor(tint); logger->addFilter(tint);
char *test2[] = {"123",NULL}; char *test2[] = {"123",NULL};
log_Interceptor *tint1 = loggingSubStringInterceptor( log_filter *tint1 = loggingFilterSubStr(
test2, test2,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor1", 1024 * 1024), loggingHandlerFile("test_interceptor1", 1024 * 1024),
true); true);
logger->addInterceptor(tint1); logger->addFilter(tint1);
printf("\n"); printf("\n");
printf("Interceptor added\n"); printf("filter added\n");
printf("\n"); printf("\n");
log_info("This is an info message"); log_info("This is an info message");

View File

@@ -5,7 +5,7 @@ import os
class loggingRecipe(ConanFile): class loggingRecipe(ConanFile):
name = "logging" name = "logging"
version = "0.4.1" version = "0.5.0"
license = "MIT" license = "MIT"
author = "321640253@qq.com" author = "321640253@qq.com"
url = "https://github.com/WangZhongDian/logging.git" url = "https://github.com/WangZhongDian/logging.git"

View File

@@ -5,8 +5,8 @@
#include <stdbool.h> #include <stdbool.h>
#include "logging/logging-core.h" #include "logging/logging-core.h"
#include "logging/logging-filter.h"
#include "logging/logging-handler.h" #include "logging/logging-handler.h"
#include "logging/logging-interceptor.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -15,10 +15,10 @@ extern "C" {
typedef struct Logger { typedef struct Logger {
log_level level; log_level level;
log_Handler *handler; log_Handler *handler;
log_Interceptor *interceptor; log_filter *filter;
const char *name; const char *name;
bool (*addHandler)(log_Handler *handler); bool (*addHandler)(log_Handler *handler);
bool (*addInterceptor)(log_Interceptor *Interceptor); bool (*addFilter)(log_filter *filter);
} Logger; } Logger;
void log_fatal(const char *format, ...); void log_fatal(const char *format, ...);

View File

@@ -0,0 +1,41 @@
#ifndef __LOGGING_INTERCEPTOR_H__
#define __LOGGING_INTERCEPTOR_H__
#include "logging-core.h"
#include "logging-handler.h"
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct log_filter {
log_level level;
log_Handler *handler;
bool jump_out;
bool (*_dispose)(struct log_filter *filter,
log_level level,
const char *message,
...);
void (*_free)(struct log_filter *filter);
struct log_filter *next;
} log_filter;
/**
* @brief 子字符串过滤器
* @param keywords: 关键字数组
* @param count: 关键字数组长度
* @param level: 过滤截日志等级
* @param handler: 日志处理器,用于处理过滤下来的日志
* @return log_filter *
*/
log_filter *loggingFilterSubStr(char *keywords[],
log_level level,
log_Handler *handler,
bool jump_out);
#ifdef __cplusplus
}
#endif
#endif // __LOGGING_INTERCEPTOR_H__

View File

@@ -14,8 +14,20 @@ typedef struct log_Handler {
void (*output)(struct log_Handler *handler, const char *message); void (*output)(struct log_Handler *handler, const char *message);
} log_Handler; } log_Handler;
log_Handler *loggingFileHandler(const char *name, unsigned int max_size); /**
log_Handler *loggingConsoleHandler(); * @brief 文件处理器
* @param name 文件名
* @param max_size 文件最大大小
* @return
*/
log_Handler *loggingHandlerFile(const char *name, unsigned int max_size);
/**
* @brief 控制台处理器
* @param
* @return
*/
log_Handler *loggingHandlerConsole();
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -1,49 +0,0 @@
#ifndef __LOGGING_INTERCEPTOR_H__
#define __LOGGING_INTERCEPTOR_H__
#include "logging-core.h"
#include "logging-handler.h"
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct log_Interceptor {
log_level level;
log_Handler *handler;
bool jump_out;
bool (*_dispose)(struct log_Interceptor *Interceptor,
log_level level,
const char *message,
...);
void (*_free)(struct log_Interceptor *Interceptor);
struct log_Interceptor *next;
} log_Interceptor;
/**
* @brief 子字符串拦截器
* @param keywords: 关键字数组
* @param count: 关键字数组长度
* @param level: 最低拦截日志等级
* @param handler: 日志处理器,用于处理拦截下来的日志
* @return log_Interceptor *
*/
log_Interceptor *loggingSubStringInterceptor(char *keywords[],
log_level level,
log_Handler *handler,
bool jump_out);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
}
#endif
#endif // __LOGGING_INTERCEPTOR_H__

View File

@@ -2,7 +2,7 @@ project(logging)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC) aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/handler SRC) aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/handler SRC)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/interceptor SRC) aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/filter SRC)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/utils SRC) aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/utils SRC)
if (SHARED) if (SHARED)

View File

@@ -1,4 +1,4 @@
#include "logging/logging-interceptor.h" #include "logging/logging-filter.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -55,20 +55,20 @@ static bool kmp_search(char *substr, char *master) {
return false; return false;
} }
static bool _disposeSubstring(log_Interceptor *interceptor, static bool _disposeSubstring(log_filter *filter,
log_level level, log_level level,
const char *message, const char *message,
...) { ...) {
int count = 0; int count = 0;
keywords_t *keyword = (keywords_t *)(interceptor + 1); keywords_t *keyword = (keywords_t *)(filter + 1);
if (keyword->key == NULL && keyword->next == NULL) { if (keyword->key == NULL && keyword->next == NULL) {
if (level <= interceptor->level) if (level <= filter->level)
return true; return true;
return false; return false;
} }
while (keyword != NULL && level <= interceptor->level) { while (keyword != NULL && level <= filter->level) {
if (kmp_search(keyword->key, (char *)message)) if (kmp_search(keyword->key, (char *)message))
return true; return true;
keyword = keyword->next; keyword = keyword->next;
@@ -77,9 +77,9 @@ static bool _disposeSubstring(log_Interceptor *interceptor,
return false; return false;
} }
static void _freeSubstring(log_Interceptor *interceptor) { static void _freeFilter(log_filter *filter) {
keywords_t *it_keyword = keywords_t *it_keyword =
(keywords_t *)(interceptor + 1); // it_keyword 不是起始地址请勿free (keywords_t *)(filter + 1); // it_keyword 不是起始地址请勿free
keywords_t *keyword = it_keyword->next; keywords_t *keyword = it_keyword->next;
keywords_t *next = NULL; keywords_t *next = NULL;
@@ -90,28 +90,29 @@ static void _freeSubstring(log_Interceptor *interceptor) {
keyword = next; keyword = next;
} }
if (interceptor->handler != NULL) { if (filter->handler != NULL) {
interceptor->handler->_free(interceptor->handler); filter->handler->_free(filter->handler);
} }
if (it_keyword->key != NULL) if (it_keyword->key != NULL)
free(it_keyword->key); free(it_keyword->key);
free(interceptor); free(filter);
} }
log_Interceptor *loggingSubStringInterceptor(char *keywords[], log_filter *loggingFilterSubStr(char *keywords[],
log_level level, log_level level,
log_Handler *handler, log_Handler *handler,
bool jump_out) { bool jump_out) {
log_Interceptor *interceptor = // 分配log_filter和keywords_t的连续内存
(log_Interceptor *)malloc(sizeof(log_Interceptor) + sizeof(keywords_t)); log_filter *filter =
interceptor->_dispose = _disposeSubstring; (log_filter *)malloc(sizeof(log_filter) + sizeof(keywords_t));
interceptor->handler = handler; filter->_dispose = _disposeSubstring;
interceptor->level = level; filter->handler = handler;
interceptor->jump_out = jump_out; filter->level = level;
interceptor->_free = _freeSubstring; filter->jump_out = jump_out;
filter->_free = _freeFilter;
keywords_t *keyword = (keywords_t *)(interceptor + 1); keywords_t *keyword = (keywords_t *)(filter + 1);
keyword->key = NULL; keyword->key = NULL;
int count = 0; int count = 0;
if (keywords[count] != NULL) { if (keywords[count] != NULL) {
@@ -128,5 +129,5 @@ log_Interceptor *loggingSubStringInterceptor(char *keywords[],
} }
keyword->next = NULL; keyword->next = NULL;
return interceptor; return filter;
} }

View File

@@ -2,19 +2,19 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
static void __freeConsoleHandler(log_Handler *handler) { free(handler); } static void __freeHandlerConsole(log_Handler *handler) { free(handler); }
static void outputConsoleHandler(log_Handler *handler, const char *message) { static void __outputHandlerConsole(log_Handler *handler, const char *message) {
fputs(message, handler->stream); fputs(message, handler->stream);
} }
log_Handler *loggingConsoleHandler() { log_Handler *loggingHandlerConsole() {
log_Handler *handler = (log_Handler *)malloc(sizeof(log_Handler)); log_Handler *handler = (log_Handler *)malloc(sizeof(log_Handler));
handler->stream = stdout; handler->stream = stdout;
handler->apply_color = true; handler->apply_color = true;
handler->_free = __freeConsoleHandler; handler->_free = __freeHandlerConsole;
handler->output = outputConsoleHandler; handler->output = __outputHandlerConsole;
return handler; return handler;
} }

View File

@@ -49,7 +49,7 @@ static void outputFileHandler(log_Handler *handler, const char *message) {
changeFile(handler); changeFile(handler);
} }
log_Handler *loggingFileHandler(const char *name, unsigned int max_size) { log_Handler *loggingHandlerFile(const char *name, unsigned int max_size) {
char new_file_name[FILE_NAME_MAX_SIZE]; char new_file_name[FILE_NAME_MAX_SIZE];
int suffix = 0; int suffix = 0;
unsigned int file_size; unsigned int file_size;

View File

@@ -38,23 +38,23 @@ static bool addHandler(log_Handler *handler) {
return true; return true;
} }
static bool addInterceptor(log_Interceptor *Interceptor) { static bool addFilter(log_filter *filter) {
if (G_LOGGER == NULL || Interceptor == NULL) { if (G_LOGGER == NULL || filter == NULL) {
return false; return false;
} }
if (G_LOGGER->interceptor == NULL) { if (G_LOGGER->filter == NULL) {
G_LOGGER->interceptor = Interceptor; G_LOGGER->filter = filter;
G_LOGGER->interceptor->next = NULL; G_LOGGER->filter->next = NULL;
return true; return true;
} }
log_Interceptor *it = G_LOGGER->interceptor; log_filter *it = G_LOGGER->filter;
while (it->next != NULL) { while (it->next != NULL) {
it = it->next; it = it->next;
} }
it->next = Interceptor; it->next = filter;
Interceptor->next = NULL; filter->next = NULL;
return true; return true;
} }
@@ -104,7 +104,7 @@ static void _builtin_cope(log_level level_e,
return; return;
} }
log_Interceptor *it = G_LOGGER->interceptor; log_filter *it = G_LOGGER->filter;
log_Handler *handler = G_LOGGER->handler; log_Handler *handler = G_LOGGER->handler;
while (it != NULL) { while (it != NULL) {
@@ -183,12 +183,12 @@ Logger *newDefaultLogger(const char *name, log_level level) {
Logger *logger = (Logger *)malloc(sizeof(Logger)); Logger *logger = (Logger *)malloc(sizeof(Logger));
logger->addHandler = addHandler; logger->addHandler = addHandler;
logger->addInterceptor = addInterceptor; logger->addFilter = addFilter;
logger->level = level; logger->level = level;
logger->handler = loggingConsoleHandler(); logger->handler = loggingHandlerConsole();
logger->name = name; logger->name = name;
logger->interceptor = NULL; logger->filter = NULL;
G_LOGGER = logger; G_LOGGER = logger;
return G_LOGGER; return G_LOGGER;
@@ -203,9 +203,9 @@ log_status destroyDefaultLogger(void) {
G_LOGGER->handler->_free(G_LOGGER->handler); G_LOGGER->handler->_free(G_LOGGER->handler);
} }
if (G_LOGGER->interceptor != NULL) { if (G_LOGGER->filter != NULL) {
log_Interceptor *it = G_LOGGER->interceptor; log_filter *it = G_LOGGER->filter;
log_Interceptor *next = NULL; log_filter *next = NULL;
while (it != NULL) { while (it != NULL) {
next = it->next; next = it->next;
it->_free(it); it->_free(it);

View File

@@ -1,11 +1,11 @@
#include "logging-utils.h" #include "logging-utils.h"
#include <time.h>
#include <string.h> #include <string.h>
#include <time.h>
/** /**
* @brief 获取当前时间字符串 * @brief 获取当前时间字符串
* @param timeStr 存储时间字符串缓冲区指针 * @param timeStr 存储时间字符串缓冲区指针
*/ */
void getTimeStr(char *timeStr) { void getTimeStr(char *timeStr) {
time_t t = time(NULL); time_t t = time(NULL);
struct tm *p = localtime(&t); struct tm *p = localtime(&t);

View File

@@ -3,7 +3,7 @@ project(test)
enable_testing() enable_testing()
#测试简单基本应用 #测试简单基本应用
add_executable(${PROJECT_NAME}simple test_simple.c) add_executable(${PROJECT_NAME}simple test-simple.c)
target_link_libraries(${PROJECT_NAME}simple logging) target_link_libraries(${PROJECT_NAME}simple logging)
if(UNIX) if(UNIX)
add_test(test_simple ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}simple) add_test(test_simple ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}simple)
@@ -12,10 +12,10 @@ elseif(WIN32)
endif() endif()
#测试拦截器 #测试拦截器
add_executable(${PROJECT_NAME}interceptor test_interceptor.c) add_executable(${PROJECT_NAME}filter test-filter.c)
target_link_libraries(${PROJECT_NAME}interceptor logging) target_link_libraries(${PROJECT_NAME}filter logging)
if(UNIX) if(UNIX)
add_test(test_interceptor ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}interceptor) add_test(test_filter ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}filter)
elseif(WIN32) elseif(WIN32)
add_test(test_interceptor ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}interceptor.exe) add_test(test_filter ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}filter.exe)
endif() endif()

View File

@@ -1,5 +1,6 @@
#include "logging.h" #include "logging.h"
#include "logging/logging-core.h" #include "logging/logging-core.h"
#include "logging/logging-filter.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
@@ -15,26 +16,26 @@ int main() {
char *test1[] = {"This", NULL}; char *test1[] = {"This", NULL};
log_Interceptor *tint = loggingSubStringInterceptor( log_filter *tint =
test1, loggingFilterSubStr(test1,
LOG_DEBUG, LOG_DEBUG,
loggingFileHandler("test_interceptor", 1024 * 1024), loggingHandlerFile("test_interceptor", 1024 * 1024),
false); false);
logger->addInterceptor(tint); logger->addFilter(tint);
char *test2[] = {"123", NULL}; char *test2[] = {"123", NULL};
log_Interceptor *tint1 = loggingSubStringInterceptor( log_filter *tint1 = loggingFilterSubStr(
test2, test2,
LOG_ERROR, LOG_ERROR,
loggingFileHandler("test_interceptor1", 1024 * 1024), loggingHandlerFile("test_interceptor1", 1024 * 1024),
true); true);
logger->addInterceptor(tint1); logger->addFilter(tint1);
printf("\n"); printf("\n");
printf("Interceptor added\n"); printf("filter added\n");
printf("\n"); printf("\n");
log_info("This is an info message"); log_info("This is an info message");