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
9 changes: 6 additions & 3 deletions examples/log/modules.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@
int
main(int argc, const char *argv[])
{
BFDEV_DEFINE_LOG_CHAIN(log_localtime, bfdev_log_chain_localtime, -300, NULL);
BFDEV_DEFINE_LOG_CHAIN(log_hostname, bfdev_log_chain_hostname, -200, NULL);
BFDEV_DEFINE_LOG_CHAIN(log_pid, bfdev_log_chain_pid, -100, NULL);
unsigned int count;

bfdev_log_localtime_enable(&bfdev_log_default);
bfdev_log_hostname_enable(&bfdev_log_default);
bfdev_log_pid_enable(&bfdev_log_default);
bfdev_log_chain_register(&bfdev_log_default, &log_localtime);
bfdev_log_chain_register(&bfdev_log_default, &log_hostname);
bfdev_log_chain_register(&bfdev_log_default, &log_pid);

for (count = 0; count < 3; ++count) {
bfdev_log_info("Hello World!\n");
Expand Down
33 changes: 26 additions & 7 deletions include/bfdev/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ 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);
(bfdev_log_message_t *msg);

enum bfdev_log_flags {
__BFDEV_LOG_COLOR = 0,
Expand All @@ -48,29 +48,31 @@ struct bfdev_log_chain {
bfdev_ilist_node_t list;
bfdev_log_hook_t func;
int priority;
void *pdata;
};

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_ilist_head_t prefix_chain;
bfdev_ilist_head_t suffix_chain;

bfdev_log_write_t write;
void *pdata;
};

struct bfdev_log_message {
bfdev_log_t *log;
unsigned int level;
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), \
.prefix_chain = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->prefix_chain), \
.suffix_chain = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->suffix_chain), \
.default_level = (DEFAULT), .record_level = (RECORD), \
.flags = (FLAGS), .write = (WRITE), .pdata = (PDATA), \
}
Expand All @@ -81,6 +83,16 @@ struct bfdev_log_message {
#define BFDEV_DEFINE_LOG(name, default, record, flags, write, pdata) \
bfdev_log_t name = BFDEV_LOG_INIT(&name, default, record, flags, write, pdata)

#define BFDEV_LOG_CHAIN_STATIC(FUNC, PRIORITY, PDATA) { \
.func = (FUNC), .priority = (PRIORITY), .pdata = (PDATA), \
}

#define BFDEV_LOG_CHAIN_INIT(func, priority, pdata) \
(bfdev_log_chain_t) BFDEV_LOG_CHAIN_STATIC(func, priority, pdata)

#define BFDEV_DEFINE_LOG_CHAIN(name, func, priority, pdata) \
bfdev_log_chain_t name = BFDEV_LOG_CHAIN_INIT(func, priority, pdata)

BFDEV_BITFLAGS_STRUCT(
bfdev_log_color,
struct bfdev_log, flags,
Expand All @@ -103,6 +115,13 @@ bfdev_log_init(bfdev_log_t *log, unsigned int def, unsigned int record,
*log = BFDEV_LOG_INIT(log, def, record, flags, write, pdata);
}

static inline void
bfdev_log_chain_init(bfdev_log_chain_t *chain, bfdev_log_hook_t func,
int priority, void *pdata)
{
*chain = BFDEV_LOG_CHAIN_INIT(func, priority, pdata);
}

extern unsigned int
bfdev_log_level(const char *str, const char **endptr);

Expand All @@ -119,10 +138,10 @@ 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);
bfdev_log_chain_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_chain_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
Expand Down
25 changes: 5 additions & 20 deletions include/bfdev/modules/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,17 @@

BFDEV_BEGIN_DECLS

extern bfdev_log_chain_t
bfdev_log_chain_hostname;

extern bfdev_log_chain_t
bfdev_log_chain_localtime;

extern bfdev_log_chain_t
bfdev_log_chain_pid;

extern int
bfdev_log_localtime_enable(bfdev_log_t *log);

extern void
bfdev_log_localtime_disable(bfdev_log_t *log);
bfdev_log_chain_hostname(bfdev_log_message_t *msg, void *pdata);

extern int
bfdev_log_hostname_enable(bfdev_log_t *log);

extern void
bfdev_log_hostname_disable(bfdev_log_t *log);
bfdev_log_chain_localtime(bfdev_log_message_t *msg, void *pdata);

extern int
bfdev_log_pid_enable(bfdev_log_t *log);
bfdev_log_chain_pid(bfdev_log_message_t *msg, void *pdata);

extern void
bfdev_log_pid_disable(bfdev_log_t *log);
extern int
bfdev_log_write_syslog(bfdev_log_message_t *msg, void *pdata);

BFDEV_END_DECLS

Expand Down
7 changes: 1 addition & 6 deletions modules/build.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,4 @@
# Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
#

set(BFDEV_SOURCE
${BFDEV_SOURCE}
${CMAKE_CURRENT_LIST_DIR}/log-hostname.c
${CMAKE_CURRENT_LIST_DIR}/log-localtime.c
${CMAKE_CURRENT_LIST_DIR}/log-pid.c
)
include(${CMAKE_CURRENT_LIST_DIR}/log/build.cmake)
38 changes: 0 additions & 38 deletions modules/log-hostname.c

This file was deleted.

41 changes: 0 additions & 41 deletions modules/log-localtime.c

This file was deleted.

33 changes: 0 additions & 33 deletions modules/log-pid.c

This file was deleted.

24 changes: 24 additions & 0 deletions modules/log/build.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
#

set(BFDEV_SOURCE
${BFDEV_SOURCE}
${CMAKE_CURRENT_LIST_DIR}/chain-hostname.c
${CMAKE_CURRENT_LIST_DIR}/chain-localtime.c
${CMAKE_CURRENT_LIST_DIR}/chain-pid.c
${CMAKE_CURRENT_LIST_DIR}/write-syslog.c
)

check_header_and_exit("time.h")
check_header_and_exit("unistd.h")
check_header_and_exit("syslog.h")
check_header_and_exit("sys/utsname.h")

check_symbol_and_exit("time.h" "time")
check_symbol_and_exit("time.h" "localtime")
check_symbol_and_exit("time.h" "strftime")
check_symbol_and_exit("unistd.h" "getpid")
check_symbol_and_exit("syslog.h" "syslog")
check_symbol_and_exit("sys/utsname.h" "uname")
20 changes: 20 additions & 0 deletions modules/log/chain-hostname.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: LGPL-3.0-or-later */
/*
* Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
*/

#include <base.h>
#include <bfdev/modules/log.h>
#include <sys/utsname.h>
#include <export.h>

export int
bfdev_log_chain_hostname(bfdev_log_message_t *msg, void *pdata)
{
struct utsname sys_info;

if (uname(&sys_info) < 0)
return -BFDEV_EFAULT;

return bfdev_msg_append(msg, "%s ", sys_info.nodename);
}
23 changes: 23 additions & 0 deletions modules/log/chain-localtime.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* SPDX-License-Identifier: LGPL-3.0-or-later */
/*
* Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
*/

#include <base.h>
#include <bfdev/modules/log.h>
#include <time.h>
#include <export.h>

export int
bfdev_log_chain_localtime(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);
}
15 changes: 15 additions & 0 deletions modules/log/chain-pid.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* SPDX-License-Identifier: LGPL-3.0-or-later */
/*
* Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
*/

#include <base.h>
#include <bfdev/modules/log.h>
#include <unistd.h>
#include <export.h>

export int
bfdev_log_chain_pid(bfdev_log_message_t *msg, void *pdata)
{
return bfdev_msg_append(msg, "(pid: %d) ", getpid());
}
36 changes: 36 additions & 0 deletions modules/log/write-syslog.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/* SPDX-License-Identifier: LGPL-3.0-or-later */
/*
* Copyright(c) 2025 Zhenlin Wang <sanpeqf@gmail.com>
*/

#include <base.h>
#include <bfdev/modules/log.h>
#include <syslog.h>
#include <export.h>

static const int
syslog_level[] = {
[BFDEV_LEVEL_EMERG ] = LOG_EMERG,
[BFDEV_LEVEL_ALERT ] = LOG_ALERT,
[BFDEV_LEVEL_CRIT ] = LOG_CRIT,
[BFDEV_LEVEL_ERR ] = LOG_ERR,
[BFDEV_LEVEL_WARNING] = LOG_WARNING,
[BFDEV_LEVEL_NOTICE ] = LOG_NOTICE,
[BFDEV_LEVEL_INFO ] = LOG_INFO,
[BFDEV_LEVEL_DEBUG ] = LOG_DEBUG,
};

export int
bfdev_log_write_syslog(bfdev_log_message_t *msg, void *pdata)
{
int level, priority;

level = msg->level;
if (level >= BFDEV_ARRAY_SIZE(syslog_level))
level = BFDEV_LEVEL_INFO;

priority = syslog_level[level];
syslog(priority, "%.*s", (int)msg->length, msg->buff);

return msg->length;
}
Loading
Loading