12 Commits

15 changed files with 131 additions and 73 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@
.vscode/**
bin
build
CMakeUserPresets.json

View File

@@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.28...3.30)
project(logging)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_CLANG_TIDY "clang-tidy")
if(MSVC)
add_compile_options("/source-charset:utf-8")

View File

@@ -38,7 +38,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```
@@ -50,7 +50,7 @@ int main() {
int main() {
log_Handler *hander = loggingHandlerFile("test_log", 1024 * 1024 * 10);
addHandler(getDefaultLogger(), hander);
loggingAddHandler(loggingGetDefaultLogger(), hander);
Log_info("This is an info message");
Log_error("This is an error message%s", "123");
@@ -58,7 +58,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```
@@ -91,7 +91,7 @@ int main() {
loggingHandlerFile("test_interceptor", 1024 * 1024),
false);
addFilter(getDefaultLogger(), tint);
loggingAddFilter(loggingGetDefaultLogger(), tint);
char *test2[] = {"123", NULL};
@@ -101,7 +101,7 @@ int main() {
loggingHandlerFile("test_interceptor1", 1024 * 1024),
true);
addFilter(getDefaultLogger(), tint1);
loggingAddFilter(loggingGetDefaultLogger(), tint1);
printf("\n");
printf("filter added\n");
@@ -113,7 +113,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```

View File

@@ -23,7 +23,7 @@ conan create .
在你的项目的conanfile.txt中添加
```txt
[requires]
logging/0.5.0
logging/1.0.0
```
```shell
@@ -53,7 +53,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```
@@ -65,7 +65,7 @@ int main() {
int main() {
log_Handler *hander = loggingHandlerFile("test_log", 1024 * 1024 * 10);
addHandler(getDefaultLogger(), hander);
loggingAddHandler(loggingGetDefaultLogger(), hander);
Log_info("This is an info message");
Log_error("This is an error message%s", "123");
@@ -73,7 +73,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```
@@ -107,7 +107,7 @@ int main() {
loggingHandlerFile("test_interceptor", 1024 * 1024),
false);
addFilter(getDefaultLogger(), tint);
loggingAddFilter(loggingGetDefaultLogger(), tint);
char *test2[] = {"123", NULL};
@@ -117,7 +117,7 @@ int main() {
loggingHandlerFile("test_interceptor1", 1024 * 1024),
true);
addFilter(getDefaultLogger(), tint1);
loggingAddFilter(loggingGetDefaultLogger(), tint1);
printf("\n");
printf("filter added\n");
@@ -129,7 +129,7 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}
```

View File

@@ -5,7 +5,7 @@ import os
class loggingRecipe(ConanFile):
name = "logging"
version = "1.0.0"
version = "1.1.0"
license = "MIT"
author = "321640253@qq.com"
url = "https://github.com/WangZhongDian/logging.git"
@@ -17,7 +17,7 @@ class loggingRecipe(ConanFile):
default_options = {"shared": False, "fPIC": True,"test":True}
exports_sources = "include/*", "CMakeLists.txt", "src/*", "tests/*"
exports_sources = "include/*", "CMakeLists.txt", "src/*", "tests/*", "LICENSE"
def config_options(self):
if self.settings.os == "Windows":
@@ -47,12 +47,8 @@ class loggingRecipe(ConanFile):
def package(self):
copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
copy(self, pattern="*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include"))
copy(self, pattern="*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.lib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.dll", src=self.build_folder, dst=os.path.join(self.package_folder, "bin"), keep_path=False)
copy(self, pattern="*.dylib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
cmake = CMake(self)
cmake.install()
def package_info(self):
self.cpp_info.libs = ["logging"]

View File

@@ -15,27 +15,28 @@ extern "C" {
// 默认日志器宏
#define Log_fatal(format, ...) \
logMessage(NULL, LOG_FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(NULL, LOG_FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define Log_error(format, ...) \
logMessage(NULL, LOG_ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(NULL, LOG_ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define Log_warning(format, ...) \
logMessage(NULL, LOG_WARNING, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(NULL, LOG_WARNING, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define Log_info(format, ...) \
logMessage(NULL, LOG_INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(NULL, LOG_INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define Log_debug(format, ...) \
logMessage(NULL, LOG_DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(NULL, LOG_DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
// 日志器宏
#define log_fatal(logger, format, ...) \
logMessage(logger, LOG_FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(logger, LOG_FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define log_error(logger, format, ...) \
logMessage(logger, LOG_ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(logger, LOG_ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define log_warning(logger, format, ...) \
logMessage(logger, LOG_WARNING, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage( \
logger, LOG_WARNING, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define log_info(logger, format, ...) \
logMessage(logger, LOG_INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(logger, LOG_INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define log_debug(logger, format, ...) \
logMessage(logger, LOG_DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
loggingMessage(logger, LOG_DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
typedef struct Logger {
log_level level;
@@ -44,41 +45,48 @@ typedef struct Logger {
const char *name;
} Logger;
bool addHandler(Logger *logger, log_Handler *handler);
bool addFilter(Logger *logger, log_filter *filter);
bool loggingAddHandler(Logger *logger, log_Handler *handler);
bool loggingAddFilter(Logger *logger, log_filter *filter);
void logMessage(Logger *logger,
log_level level,
const char *file,
int line,
const char *message,
...);
void loggingMessage(Logger *logger,
log_level level,
const char *file,
int line,
const char *message,
...);
/**
* @brief 创建一个日志句柄对象
* @param name 日志器名称
* @return 日志句柄对象
*/
Logger *newLogger(const char *name);
Logger *loggingNewLogger(const char *name);
/**
* @brief 获取默认日志对象
* @return 默认日志对象
*/
Logger *getDefaultLogger(void);
Logger *loggingGetDefaultLogger(void);
Logger *getLogger(const char *name);
Logger *loggingGetLogger(const char *name);
/**
* @brief 销毁日志对象,该方法会销毁默认日志对象
*/
void destroyDefaultLogger(void);
void loggingDestroyAll(void);
/**
* @brief 销毁日志对象
* @param logger 日志对象
* @return void
*/
void destroyLogger(Logger *logger);
void loggingDestroyLogger(Logger *logger);
/**
* @brief 替换默认日志器
* @param logger 日志器
* @return
*/
bool loggingReplaceDefaultLogger(Logger *logger);
#ifdef __cplusplus
}

View File

@@ -1,6 +1,6 @@
[project]
name = "logging"
version = "1.0.0"
version = "1.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"

View File

@@ -6,7 +6,6 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define RED "\033[0;31m"
@@ -27,7 +26,7 @@ static Map *LOGGER_MAP = NULL; // 日志对象映射表
* @brief 为日志添加一个handler
* @param handler 处理器对象
*/
bool addHandler(Logger *logger, log_Handler *handler) {
bool loggingAddHandler(Logger *logger, log_Handler *handler) {
if (logger == NULL || handler == NULL) {
return false;
}
@@ -45,7 +44,7 @@ bool addHandler(Logger *logger, log_Handler *handler) {
* @brief 为日志添加一个filter
* @param filter 过滤器对象
*/
bool addFilter(Logger *logger, log_filter *filter) {
bool loggingAddFilter(Logger *logger, log_filter *filter) {
if (logger == NULL || filter == NULL) {
return false;
}
@@ -142,16 +141,16 @@ log_cope(Logger *logger, char *level, const char *color, const char *message) {
output_to_handler(logger, level, color, message);
}
void logMessage(Logger *logger,
log_level level,
const char *file,
int line,
const char *message,
...) {
void loggingMessage(Logger *logger,
log_level level,
const char *file,
int line,
const char *message,
...) {
Logger *_logger = NULL;
if (logger == NULL) {
if (ROOT_LOGGER == NULL) {
ROOT_LOGGER = newLogger("ROOT"); // 创建根日志对象
ROOT_LOGGER = loggingNewLogger("ROOT"); // 创建根日志对象
}
_logger = ROOT_LOGGER;
} else {
@@ -197,7 +196,7 @@ void logMessage(Logger *logger,
* @param name 日志器名称
* @return 日志器对象
*/
Logger *newLogger(const char *name) {
Logger *loggingNewLogger(const char *name) {
Logger *logger = (Logger *)malloc(sizeof(Logger));
if (logger == NULL) {
return NULL;
@@ -217,12 +216,12 @@ Logger *newLogger(const char *name) {
return logger;
}
Logger *getDefaultLogger(void) {
Logger *loggingGetDefaultLogger(void) {
if (ROOT_LOGGER != NULL) {
return ROOT_LOGGER;
}
ROOT_LOGGER = newLogger("ROOT");
ROOT_LOGGER = loggingNewLogger("ROOT");
return ROOT_LOGGER;
}
@@ -232,7 +231,7 @@ Logger *getDefaultLogger(void) {
* @param level 日志等级
* @return 日志器对象
*/
Logger *getLogger(const char *name) {
Logger *loggingGetLogger(const char *name) {
if (name == NULL) {
return NULL;
}
@@ -257,7 +256,15 @@ Logger *getLogger(const char *name) {
return logger;
}
void destroyLogger(Logger *logger) {
bool loggingReplaceDefaultLogger(Logger *logger) {
if (logger == NULL) {
return false;
}
ROOT_LOGGER = logger;
return true;
}
void loggingDestroyLogger(Logger *logger) {
if (logger != NULL) {
if (logger->handler != NULL) {
logger->handler->_free(logger->handler);
@@ -280,13 +287,13 @@ static void
__destroyLoggerForeach(const char *key, void *value, void *user_data) {
(void)user_data;
(void)key;
destroyLogger(*(Logger **)value);
loggingDestroyLogger(*(Logger **)value);
}
/**
* @brief 销毁日志对象
*/
void destroyDefaultLogger(void) {
void loggingDestroyAll(void) {
map_foreach(LOGGER_MAP, __destroyLoggerForeach, NULL);
map_destroy(LOGGER_MAP);
}

View File

@@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 3.28...3.30)
project(LoggingTest)
find_package(logging CONFIG REQUIRED)
#测试简单基本应用
add_executable(${PROJECT_NAME} src/testExmaple.c)
target_link_libraries(${PROJECT_NAME} logging::logging)

26
test_package/conanfile.py Normal file
View File

@@ -0,0 +1,26 @@
import os
from conan import ConanFile
from conan.tools.cmake import CMake, cmake_layout
from conan.tools.build import can_run
class LoggingTestConan(ConanFile):
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeDeps", "CMakeToolchain"
def requirements(self):
self.requires(self.tested_reference_str)
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def layout(self):
cmake_layout(self)
def test(self):
if can_run(self):
cmd = os.path.join(self.cpp.build.bindir, "LoggingTest")
self.run(cmd, env="conanrun")

View File

@@ -0,0 +1,12 @@
#include "logging.h"
int main() {
Log_info("This is an info message");
Log_error("This is an error message%s", "123");
Log_fatal("This is an fatal message");
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
loggingDestroyAll();
return 0;
}

View File

@@ -20,7 +20,7 @@ int main() {
loggingHandlerFile("test_interceptor", 1024 * 1024),
false);
addFilter(getDefaultLogger(), tint);
loggingAddFilter(loggingGetDefaultLogger(), tint);
char *test2[] = {"123", NULL};
@@ -30,7 +30,7 @@ int main() {
loggingHandlerFile("test_interceptor1", 1024 * 1024),
true);
addFilter(getDefaultLogger(), tint1);
loggingAddFilter(loggingGetDefaultLogger(), tint1);
printf("\n");
printf("filter added\n");
@@ -42,6 +42,6 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}

View File

@@ -3,7 +3,7 @@
int main() {
log_Handler *hander = loggingHandlerFile("test_log", 1024 * 1024 * 10);
addHandler(getDefaultLogger(), hander);
loggingAddHandler(loggingGetDefaultLogger(), hander);
Log_info("This is an info message");
Log_error("This is an error message%s", "123");
@@ -11,6 +11,6 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}

View File

@@ -3,13 +3,13 @@
#include <stdio.h>
int main() {
Logger *t1 = getLogger("Test1");
Logger *t1 = loggingGetLogger("Test1");
t1->level = LOG_ERROR;
Logger *t2 = getLogger("Test2");
Logger *t2 = loggingGetLogger("Test2");
t2->level = LOG_DEBUG;
Logger *t11 = getLogger("Test1");
Logger *t11 = loggingGetLogger("Test1");
if (t1 == t11) {
printf("t1 and t11 are the same\n");
@@ -19,6 +19,6 @@ int main() {
return 1;
}
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}

View File

@@ -7,6 +7,6 @@ int main() {
Log_debug("This is a debug message");
Log_warning("This is a warning message%s", "123");
destroyDefaultLogger();
loggingDestroyAll();
return 0;
}