Skip to content

Commit d2def5c

Browse files
authored
Merge pull request #673 from sanpeqf/feat-log
Feat log
2 parents 939d7fd + 7d9ba8b commit d2def5c

9 files changed

Lines changed: 223 additions & 35 deletions

File tree

examples/log/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,21 @@ add_executable(log-simple simple.c)
77
target_link_libraries(log-simple bfdev)
88
add_test(log-simple log-simple)
99

10+
add_executable(log-date date.c)
11+
target_link_libraries(log-date bfdev)
12+
add_test(log-date log-date)
13+
1014
if(${CMAKE_PROJECT_NAME} STREQUAL "bfdev")
1115
install(FILES
1216
simple.c
17+
date.c
1318
DESTINATION
1419
${CMAKE_INSTALL_DOCDIR}/examples/log
1520
)
1621

1722
install(TARGETS
1823
log-simple
24+
log-date
1925
DESTINATION
2026
${CMAKE_INSTALL_DOCDIR}/bin
2127
)

examples/log/date.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* SPDX-License-Identifier: GPL-2.0-or-later */
2+
/*
3+
* Copyright(c) 2023 John Sanpe <sanpeqf@gmail.com>
4+
*/
5+
6+
#define MODULE_NAME "log-date"
7+
#define bfdev_log_fmt(fmt) MODULE_NAME ": " fmt
8+
9+
#include <bfdev/log.h>
10+
#include <bfdev/scnprintf.h>
11+
#include <time.h>
12+
#include <unistd.h>
13+
14+
static int
15+
log_hook_date(bfdev_log_message_t *msg, void *pdata)
16+
{
17+
struct tm *tm_info;
18+
time_t timestamp;
19+
char buff[64];
20+
21+
time(&timestamp);
22+
tm_info = localtime(&timestamp);
23+
strftime(buff, sizeof(buff), "%a %b %d %H:%M:%S %p %Z %Y", tm_info);
24+
25+
return bfdev_msg_append(msg, "<%s> ", buff);
26+
}
27+
28+
static bfdev_log_chain_t
29+
log_chain_date = {
30+
.func = log_hook_date,
31+
.priority = 0,
32+
};
33+
34+
int
35+
main(int argc, const char *argv[])
36+
{
37+
unsigned int count;
38+
39+
bfdev_log_hook_register(&bfdev_log_default, &log_chain_date);
40+
for (count = 0; count < 3; ++count) {
41+
bfdev_log_info("Hello World!\n");
42+
sleep(1);
43+
}
44+
45+
return 0;
46+
}

include/bfdev/log.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include <bfdev/types.h>
1111
#include <bfdev/stddef.h>
1212
#include <bfdev/stdarg.h>
13+
#include <bfdev/errno.h>
14+
#include <bfdev/ilist.h>
1315
#include <bfdev/level.h>
1416
#include <bfdev/bits.h>
1517
#include <bfdev/bitflags.h>
@@ -25,8 +27,12 @@ BFDEV_BEGIN_DECLS
2527
#endif
2628

2729
typedef struct bfdev_log bfdev_log_t;
30+
typedef struct bfdev_log_chain bfdev_log_chain_t;
2831
typedef struct bfdev_log_message bfdev_log_message_t;
2932

33+
typedef int (*bfdev_log_hook_t)
34+
(bfdev_log_message_t *msg, void *pdata);
35+
3036
typedef int (*bfdev_log_write_t)
3137
(bfdev_log_message_t *msg, void *pdata);
3238

@@ -38,22 +44,33 @@ enum bfdev_log_flags {
3844
BFDEV_LOG_LEVEL = BFDEV_BIT(__BFDEV_LOG_LEVEL),
3945
};
4046

47+
struct bfdev_log_chain {
48+
bfdev_ilist_node_t list;
49+
bfdev_log_hook_t func;
50+
int priority;
51+
};
52+
4153
struct bfdev_log {
4254
unsigned int default_level;
4355
unsigned int record_level;
4456
unsigned long flags;
4557

58+
bfdev_ilist_head_t prefix_hooks;
59+
bfdev_ilist_head_t suffix_hooks;
60+
4661
bfdev_log_write_t write;
4762
void *pdata;
4863
};
4964

5065
struct bfdev_log_message {
5166
unsigned int level;
52-
char *buff;
5367
bfdev_size_t length;
68+
char *buff;
5469
};
5570

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

115+
extern __bfdev_printf(2, 0) int
116+
bfdev_msg_vappend(bfdev_log_message_t *msg, const char *fmt, bfdev_va_list args);
117+
118+
extern __bfdev_printf(2, 3) int
119+
bfdev_msg_append(bfdev_log_message_t *msg, const char *fmt, ...);
120+
121+
extern int
122+
bfdev_log_hook_register(bfdev_log_t *log, bfdev_log_chain_t *hook);
123+
124+
extern void
125+
bfdev_log_hook_unregister(bfdev_log_t *log, bfdev_log_chain_t *hook);
126+
98127
/**
99128
* bfdev_log_fmt - used by the bfdev_log_*() macros to generate the bfdev_log format string
100129
* @fmt: format string passed from a bfdev_log_*() macro

src/log/build.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@
66
set(BFDEV_SOURCE
77
${BFDEV_SOURCE}
88
${CMAKE_CURRENT_LIST_DIR}/log.c
9+
${CMAKE_CURRENT_LIST_DIR}/color.c
10+
${CMAKE_CURRENT_LIST_DIR}/level.c
911
)

src/log/color.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
* Copyright(c) 2024 John Sanpe <sanpeqf@gmail.com>
44
*/
55

6+
#include <base.h>
7+
#include "log.h"
8+
#include <bfdev/log.h>
9+
#include <export.h>
10+
611
#define COLOR_BLACK 0
712
#define COLOR_RED 1
813
#define COLOR_GREEN 2
@@ -29,20 +34,20 @@ level_color[] = {
2934
[BFDEV_LEVEL_DEFAULT] = COLOR_FG(COLOR_DEFAULT),
3035
};
3136

32-
static void
37+
int
3338
log_color_prefix(bfdev_log_t *log, bfdev_log_message_t *msg)
3439
{
3540
if (!bfdev_log_color_test(log))
36-
return;
41+
return -BFDEV_ENOERR;
3742

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

41-
static void
46+
int
4247
log_color_suffix(bfdev_log_t *log, bfdev_log_message_t *msg)
4348
{
4449
if (!bfdev_log_color_test(log))
45-
return;
50+
return -BFDEV_ENOERR;
4651

47-
log_scnprintf(msg, "\e[0m");
52+
return bfdev_msg_append(msg, "\e[0m");
4853
}

src/log/level.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
* Copyright(c) 2024 John Sanpe <sanpeqf@gmail.com>
44
*/
55

6+
#include <base.h>
7+
#include "log.h"
8+
#include <bfdev/log.h>
9+
#include <export.h>
10+
611
static const char * const
712
level_name[] = {
813
[BFDEV_LEVEL_EMERG ] = "emerg",
@@ -16,11 +21,11 @@ level_name[] = {
1621
[BFDEV_LEVEL_DEFAULT] = "default",
1722
};
1823

19-
static void
20-
log_level(bfdev_log_t *log, bfdev_log_message_t *msg)
24+
int
25+
log_level_prefix(bfdev_log_t *log, bfdev_log_message_t *msg)
2126
{
2227
if (!bfdev_log_level_test(log))
23-
return;
28+
return -BFDEV_ENOERR;
2429

25-
log_scnprintf(msg, "[%s] ", level_name[msg->level]);
30+
return bfdev_msg_append(msg, "[%s] ", level_name[msg->level]);
2631
}

0 commit comments

Comments
 (0)