logger can take over stderr and stdout

pull/1/head
yuqing 2014-08-07 14:18:14 +08:00
parent 4a66dbf4a6
commit e1cbe753ba
2 changed files with 64 additions and 2 deletions

View File

@ -63,6 +63,18 @@ int log_init()
return log_init_ex(&g_log_context); 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 log_init_ex(LogContext *pContext)
{ {
int result; int result;
@ -97,17 +109,33 @@ static int log_open(LogContext *pContext)
O_CREAT | O_APPEND, 0644)) < 0) O_CREAT | O_APPEND, 0644)) < 0)
{ {
fprintf(stderr, "open log file \"%s\" to write fail, " \ 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_filename, errno, STRERROR(errno));
pContext->log_fd = STDERR_FILENO; pContext->log_fd = STDERR_FILENO;
return errno != 0 ? errno : EACCES; 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); pContext->current_size = lseek(pContext->log_fd, 0, SEEK_END);
if (pContext->current_size < 0) if (pContext->current_size < 0)
{ {
fprintf(stderr, "lseek file \"%s\" fail, " \ fprintf(stderr, "lseek file \"%s\" fail, " \
"errno: %d, error info: %s", \ "errno: %d, error info: %s\n", \
pContext->log_filename, errno, STRERROR(errno)); pContext->log_filename, errno, STRERROR(errno));
return errno != 0 ? errno : EACCES; 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) void log_destroy_ex(LogContext *pContext)
{ {
if (pContext->log_fd >= 0 && pContext->log_fd != STDERR_FILENO) if (pContext->log_fd >= 0 && pContext->log_fd != STDERR_FILENO)

View File

@ -61,6 +61,12 @@ typedef struct log_context
/* if rotate the access log */ /* if rotate the access log */
bool rotate_immediately; 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 */ /* time precision */
char time_precision; char time_precision;
@ -88,6 +94,11 @@ extern LogContext g_log_context;
*/ */
int log_init(); 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) \ #define log_set_prefix(base_path, filename_prefix) \
log_set_prefix_ex(&g_log_context, 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_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) #define log_destroy() log_destroy_ex(&g_log_context)
/** init function, use stderr for output by default /** 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); 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 /** destroy function
* parameters: * parameters:
* pContext: the log context * pContext: the log context