Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions examples/log/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,21 @@ add_executable(log-simple simple.c)
target_link_libraries(log-simple bfdev)
add_test(log-simple log-simple)

add_executable(log-date date.c)
target_link_libraries(log-date bfdev)
add_test(log-date log-date)

if(${CMAKE_PROJECT_NAME} STREQUAL "bfdev")
install(FILES
simple.c
date.c
DESTINATION
${CMAKE_INSTALL_DOCDIR}/examples/log
)

install(TARGETS
log-simple
log-date
DESTINATION
${CMAKE_INSTALL_DOCDIR}/bin
)
Expand Down
46 changes: 46 additions & 0 deletions examples/log/date.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright(c) 2023 John Sanpe <sanpeqf@gmail.com>
*/

#define MODULE_NAME "log-date"
#define bfdev_log_fmt(fmt) MODULE_NAME ": " fmt

#include <bfdev/log.h>
#include <bfdev/scnprintf.h>
#include <time.h>
#include <unistd.h>

static int
log_hook_date(bfdev_log_message_t *msg, void *pdata)
{
struct tm *tm_info;
time_t timestamp;
char buff[64];

time(&timestamp);
tm_info = localtime(&timestamp);
strftime(buff, sizeof(buff), "%a %b %d %H:%M:%S %p %Z %Y", tm_info);

return bfdev_msg_append(msg, "<%s> ", buff);
}

static bfdev_log_chain_t
log_chain_date = {
.func = log_hook_date,
.priority = 0,
};

int
main(int argc, const char *argv[])
{
unsigned int count;

bfdev_log_hook_register(&bfdev_log_default, &log_chain_date);
for (count = 0; count < 3; ++count) {
bfdev_log_info("Hello World!\n");
sleep(1);
}

return 0;
}
31 changes: 30 additions & 1 deletion include/bfdev/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include <bfdev/types.h>
#include <bfdev/stddef.h>
#include <bfdev/stdarg.h>
#include <bfdev/errno.h>
#include <bfdev/ilist.h>
#include <bfdev/level.h>
#include <bfdev/bits.h>
#include <bfdev/bitflags.h>
Expand All @@ -25,8 +27,12 @@ BFDEV_BEGIN_DECLS
#endif

typedef struct bfdev_log bfdev_log_t;
typedef struct bfdev_log_chain bfdev_log_chain_t;
typedef struct bfdev_log_message bfdev_log_message_t;

typedef int (*bfdev_log_hook_t)
(bfdev_log_message_t *msg, void *pdata);

typedef int (*bfdev_log_write_t)
(bfdev_log_message_t *msg, void *pdata);

Expand All @@ -38,22 +44,33 @@ enum bfdev_log_flags {
BFDEV_LOG_LEVEL = BFDEV_BIT(__BFDEV_LOG_LEVEL),
};

struct bfdev_log_chain {
bfdev_ilist_node_t list;
bfdev_log_hook_t func;
int priority;
};

struct bfdev_log {
unsigned int default_level;
unsigned int record_level;
unsigned long flags;

bfdev_ilist_head_t prefix_hooks;
bfdev_ilist_head_t suffix_hooks;

bfdev_log_write_t write;
void *pdata;
};

struct bfdev_log_message {
unsigned int level;
char *buff;
bfdev_size_t length;
char *buff;
};

#define BFDEV_LOG_STATIC(HEAD, DEFAULT, RECORD, FLAGS, WRITE, PDATA) { \
.prefix_hooks = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->prefix_hooks), \
.suffix_hooks = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->suffix_hooks), \
.default_level = (DEFAULT), .record_level = (RECORD), \
.flags = (FLAGS), .write = (WRITE), .pdata = (PDATA), \
}
Expand Down Expand Up @@ -95,6 +112,18 @@ bfdev_vlog_core(bfdev_log_t *log, const char *fmt, bfdev_va_list args);
extern __bfdev_printf(2, 3) int
bfdev_log_core(bfdev_log_t *log, const char *fmt, ...);

extern __bfdev_printf(2, 0) int
bfdev_msg_vappend(bfdev_log_message_t *msg, const char *fmt, bfdev_va_list args);

extern __bfdev_printf(2, 3) int
bfdev_msg_append(bfdev_log_message_t *msg, const char *fmt, ...);

extern int
bfdev_log_hook_register(bfdev_log_t *log, bfdev_log_chain_t *hook);

extern void
bfdev_log_hook_unregister(bfdev_log_t *log, bfdev_log_chain_t *hook);

/**
* bfdev_log_fmt - used by the bfdev_log_*() macros to generate the bfdev_log format string
* @fmt: format string passed from a bfdev_log_*() macro
Expand Down
2 changes: 2 additions & 0 deletions src/log/build.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@
set(BFDEV_SOURCE
${BFDEV_SOURCE}
${CMAKE_CURRENT_LIST_DIR}/log.c
${CMAKE_CURRENT_LIST_DIR}/color.c
${CMAKE_CURRENT_LIST_DIR}/level.c
)
17 changes: 11 additions & 6 deletions src/log/color.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
* Copyright(c) 2024 John Sanpe <sanpeqf@gmail.com>
*/

#include <base.h>
#include "log.h"
#include <bfdev/log.h>
#include <export.h>

#define COLOR_BLACK 0
#define COLOR_RED 1
#define COLOR_GREEN 2
Expand All @@ -29,20 +34,20 @@ level_color[] = {
[BFDEV_LEVEL_DEFAULT] = COLOR_FG(COLOR_DEFAULT),
};

static void
int
log_color_prefix(bfdev_log_t *log, bfdev_log_message_t *msg)
{
if (!bfdev_log_color_test(log))
return;
return -BFDEV_ENOERR;

log_scnprintf(msg, "\e[%dm", level_color[msg->level]);
return bfdev_msg_append(msg, "\e[%dm", level_color[msg->level]);
}

static void
int
log_color_suffix(bfdev_log_t *log, bfdev_log_message_t *msg)
{
if (!bfdev_log_color_test(log))
return;
return -BFDEV_ENOERR;

log_scnprintf(msg, "\e[0m");
return bfdev_msg_append(msg, "\e[0m");
}
13 changes: 9 additions & 4 deletions src/log/level.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
* Copyright(c) 2024 John Sanpe <sanpeqf@gmail.com>
*/

#include <base.h>
#include "log.h"
#include <bfdev/log.h>
#include <export.h>

static const char * const
level_name[] = {
[BFDEV_LEVEL_EMERG ] = "emerg",
Expand All @@ -16,11 +21,11 @@ level_name[] = {
[BFDEV_LEVEL_DEFAULT] = "default",
};

static void
log_level(bfdev_log_t *log, bfdev_log_message_t *msg)
int
log_level_prefix(bfdev_log_t *log, bfdev_log_message_t *msg)
{
if (!bfdev_log_level_test(log))
return;
return -BFDEV_ENOERR;

log_scnprintf(msg, "[%s] ", level_name[msg->level]);
return bfdev_msg_append(msg, "[%s] ", level_name[msg->level]);
}
Loading
Loading