日志管理
基本数据结构:
typedef struct {
GLogLevelFlags min_lvl; //glib中对应的日志级别,初始为critical,
//后改赋为message
gchar *log_filename; //日志文件名free
gint log_file_fd; //打开的日志文件对应的文件描述符
gboolean use_syslog; //是否使用系统日志
#ifdef _WIN32
HANDLE event_source_handle;
gboolean use_windows_applog;
#endif
gboolean rotate_logs; //如果此标志被设置,在写入日志时重新//打开日志文件
GString *log_ts_str; //经组装后要写入到日志中的信息free
gint log_ts_resolution; /*<< timestamp resolution (sec, ms) */
GString *last_msg; //记录最后写入的信息free
time_t last_msg_ts; //记录最后写入信息的时间
guint last_msg_count; //记录最后写入的相同信息的次数
} chassis_log;
在读取配置信息前,开启日志,将日志级别设置为G_LOG_LEVEL_MESSAGE,调用g_log_set_default_handler设置glib中日志处理函数为chassis_log_func,同时设置参数为chassis_log,同时将chassis_log赋给chassis中的log成员。
/* start the logging ... to stderr */
log = chassis_log_new();
log->min_lvl = G_LOG_LEVEL_MESSAGE; /* display messages while parsing or loading plugins */
g_log_set_default_handler(chassis_log_func, log);
...
srv->log = log; /* we need the log structure for the log-rotation */
此时日志文件未打开,也没有设置系统日志,所写的日志记录将会输出到标准错误;
log->log_filename = g_strdup_printf("%s/%s.log", frontend->log_path, frontend->instance_name);
frontend->pid_file = g_strdup_printf("%s/%s.pid", frontend->log_path, frontend->instance_name);
srv->log_path = g_strdup(frontend->log_path);
...
log->use_syslog = frontend->use_syslog;
if (log->log_filename && log->use_sys