1
0
mirror of https://github.com/haiwen/ccnet-server.git synced 2025-04-28 10:33:20 +00:00
ccnet-server/net/common/log.c
2016-08-19 13:54:34 +08:00

170 lines
3.8 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
#include "common.h"
#include <stdio.h>
#include <glib.h>
#include <string.h>
#include "log.h"
#include "utils.h"
#include "session.h"
#include "message.h"
#include "message-manager.h"
extern CcnetSession *session;
/* message with greater log levels will be ignored */
static int ccnet_log_level;
static char *logfile;
static FILE *logfp;
static void
ccnet_log (const gchar *log_domain, GLogLevelFlags log_level,
const gchar *message, gpointer user_data)
{
time_t t;
struct tm *tm;
char buf[256];
/* CcnetMessage *ccnet_message; */
int len;
if (log_level > ccnet_log_level)
return;
t = time(NULL);
tm = localtime(&t);
len = strftime (buf, 256, "[%x %X] ", tm);
fputs (buf, logfp);
fputs (message, logfp);
fflush (logfp);
/* Note, log module starts earlier than session, only
* send syslog when session exists */
if (log_level <= G_LOG_LEVEL_MESSAGE && session) {
int n = strlen (message);
int max = 256 - len - 1;
if (n > max) n = max;
memcpy (buf + len, message, n);
buf[len + n] = '\0';
}
/*
if (log_level < G_LOG_LEVEL_MESSAGE) {
g_on_error_stack_trace (NULL);
}
*/
}
static int
get_debug_level(const char *str, int default_level)
{
if (strcmp(str, "debug") == 0)
return G_LOG_LEVEL_DEBUG;
if (strcmp(str, "info") == 0)
return G_LOG_LEVEL_INFO;
if (strcmp(str, "warning") == 0)
return G_LOG_LEVEL_WARNING;
return default_level;
}
int
ccnet_log_init (const char *_logfile, const char *debug_level_str)
{
g_log_set_handler (NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL
| G_LOG_FLAG_RECURSION, ccnet_log, NULL);
/* write all warnings from lib/ into ccnet.log */
g_log_set_handler ("Ccnet", G_LOG_LEVEL_WARNING, ccnet_log, NULL);
/* record all log message */
ccnet_log_level = get_debug_level(debug_level_str, G_LOG_LEVEL_INFO);
if (strcmp(_logfile, "-") == 0) {
logfp = stdout;
logfile = g_strdup (_logfile);
}
else {
logfile = ccnet_expand_path (_logfile);
if ((logfp = g_fopen (logfile, "a+")) == NULL) {
ccnet_message ("Failed to open file %s\n", logfile);
return -1;
}
}
return 0;
}
int
ccnet_log_reopen ()
{
FILE *fp, *oldfp;
if (strcmp(logfile, "-") == 0)
return 0;
if ((fp = g_fopen (logfile, "a+")) == NULL) {
ccnet_message ("Failed to open file %s\n", logfile);
return -1;
}
//TODO: check file's health
oldfp = logfp;
logfp = fp;
if (fclose(oldfp) < 0) {
ccnet_message ("Failed to close file %s\n", logfile);
return -1;
}
return 0;
}
static CcnetDebugFlags debug_flags = 0;
static GDebugKey debug_keys[] = {
{ "Peer", CCNET_DEBUG_PEER },
{ "Processor", CCNET_DEBUG_PROCESSOR },
{ "Netio", CCNET_DEBUG_NETIO },
{ "Message", CCNET_DEBUG_MESSAGE },
{ "Connection", CCNET_DEBUG_CONNECTION },
{ "Other", CCNET_DEBUG_OTHER },
};
gboolean
ccnet_debug_flag_is_set (CcnetDebugFlags flag)
{
return (debug_flags & flag) != 0;
}
void
ccnet_debug_set_flags (CcnetDebugFlags flags)
{
ccnet_message ("Set debug flags %#x\n", flags);
debug_flags |= flags;
}
void
ccnet_debug_set_flags_string (const gchar *flags_string)
{
guint nkeys = G_N_ELEMENTS (debug_keys);
if (flags_string)
ccnet_debug_set_flags (
g_parse_debug_string (flags_string, debug_keys, nkeys));
}
void
ccnet_debug_impl (CcnetDebugFlags flag, const gchar *format, ...)
{
if (flag & debug_flags) {
va_list args;
va_start (args, format);
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args);
va_end (args);
}
}