From e1cbe753babe180cb22cf504e3a1f3a55000a46c Mon Sep 17 00:00:00 2001 From: yuqing Date: Thu, 7 Aug 2014 14:18:14 +0800 Subject: [PATCH] logger can take over stderr and stdout --- src/logger.c | 42 ++++++++++++++++++++++++++++++++++++++++-- src/logger.h | 24 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/logger.c b/src/logger.c index 261b806..38a5480 100644 --- a/src/logger.c +++ b/src/logger.c @@ -63,6 +63,18 @@ int log_init() return log_init_ex(&g_log_context); } +int log_init2() +{ + int result; + if ((result=log_init()) != 0) { + return result; + } + + log_take_over_stderr(); + log_take_over_stdout(); + return 0; +} + int log_init_ex(LogContext *pContext) { int result; @@ -97,17 +109,33 @@ static int log_open(LogContext *pContext) O_CREAT | O_APPEND, 0644)) < 0) { fprintf(stderr, "open log file \"%s\" to write fail, " \ - "errno: %d, error info: %s", \ + "errno: %d, error info: %s\n", \ pContext->log_filename, errno, STRERROR(errno)); pContext->log_fd = STDERR_FILENO; return errno != 0 ? errno : EACCES; } + if (pContext->take_over_stderr) { + if (dup2(pContext->log_fd, STDERR_FILENO) < 0) { + fprintf(stderr, "file: "__FILE__", line: %d, " + "call dup2 fail, errno: %d, error info: %s\n", + __LINE__, errno, STRERROR(errno)); + } + } + + if (pContext->take_over_stdout) { + if (dup2(pContext->log_fd, STDOUT_FILENO) < 0) { + fprintf(stderr, "file: "__FILE__", line: %d, " + "call dup2 fail, errno: %d, error info: %s\n", + __LINE__, errno, STRERROR(errno)); + } + } + pContext->current_size = lseek(pContext->log_fd, 0, SEEK_END); if (pContext->current_size < 0) { fprintf(stderr, "lseek file \"%s\" fail, " \ - "errno: %d, error info: %s", \ + "errno: %d, error info: %s\n", \ pContext->log_filename, errno, STRERROR(errno)); return errno != 0 ? errno : EACCES; } @@ -182,6 +210,16 @@ void log_set_header_callback(LogContext *pContext, LogHeaderCallback header_call } } +void log_take_over_stderr_ex(LogContext *pContext) +{ + pContext->take_over_stderr = true; +} + +void log_take_over_stdout_ex(LogContext *pContext) +{ + pContext->take_over_stdout = true; +} + void log_destroy_ex(LogContext *pContext) { if (pContext->log_fd >= 0 && pContext->log_fd != STDERR_FILENO) diff --git a/src/logger.h b/src/logger.h index 48050e0..cf5ed8e 100644 --- a/src/logger.h +++ b/src/logger.h @@ -61,6 +61,12 @@ typedef struct log_context /* if rotate the access log */ bool rotate_immediately; + /* if stderr to the log file */ + bool take_over_stderr; + + /* if stdout to the log file */ + bool take_over_stdout; + /* time precision */ char time_precision; @@ -88,6 +94,11 @@ extern LogContext g_log_context; */ int log_init(); +/** init function using global log context, take over stderr and stdout + * return: 0 for success, != 0 fail +*/ +int log_init2(); + #define log_set_prefix(base_path, filename_prefix) \ log_set_prefix_ex(&g_log_context, base_path, filename_prefix) @@ -96,6 +107,9 @@ int log_init(); #define log_set_cache(bLogCache) log_set_cache_ex(&g_log_context, bLogCache) +#define log_take_over_stderr() log_take_over_stderr_ex(&g_log_context) +#define log_take_over_stdout() log_take_over_stdout_ex(&g_log_context) + #define log_destroy() log_destroy_ex(&g_log_context) /** init function, use stderr for output by default @@ -164,6 +178,16 @@ void log_set_keep_days(LogContext *pContext, const int keep_days); */ void log_set_header_callback(LogContext *pContext, LogHeaderCallback header_callback); +/** set take_over_stderr to true + * return: none +*/ +void log_take_over_stderr_ex(LogContext *pContext); + +/** set take_over_stdout to true + * return: none +*/ +void log_take_over_stdout_ex(LogContext *pContext); + /** destroy function * parameters: * pContext: the log context