mirror of
https://github.com/profanity-im/profanity.git
synced 2024-10-27 20:30:13 -04:00
introduce initial log rotate support
This commit is contained in:
parent
b4fd3b1b20
commit
291c6bc3d9
57
src/log.c
57
src/log.c
@ -22,20 +22,32 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "glib.h"
|
#include "glib.h"
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "preferences.h"
|
||||||
|
|
||||||
#define PROF "prof"
|
#define PROF "prof"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
// replace 'struct stat' and 'stat()' for windows
|
||||||
|
#define stat _stat
|
||||||
|
#endif
|
||||||
|
|
||||||
static FILE *logp;
|
static FILE *logp;
|
||||||
|
|
||||||
static GTimeZone *tz;
|
static GTimeZone *tz;
|
||||||
static GDateTime *dt;
|
static GDateTime *dt;
|
||||||
static log_level_t level_filter;
|
static log_level_t level_filter;
|
||||||
|
|
||||||
|
static GString *_get_log_file(void);
|
||||||
|
static void _rotate_log_file(void);
|
||||||
|
|
||||||
void
|
void
|
||||||
log_debug(const char * const msg, ...)
|
log_debug(const char * const msg, ...)
|
||||||
{
|
{
|
||||||
@ -89,10 +101,7 @@ log_init(log_level_t filter)
|
|||||||
{
|
{
|
||||||
level_filter = filter;
|
level_filter = filter;
|
||||||
tz = g_time_zone_new_local();
|
tz = g_time_zone_new_local();
|
||||||
GString *log_file = g_string_new(getenv("HOME"));
|
GString *log_file = _get_log_file();
|
||||||
g_string_append(log_file, "/.profanity/log");
|
|
||||||
create_dir(log_file->str);
|
|
||||||
g_string_append(log_file, "/profanity.log");
|
|
||||||
logp = fopen(log_file->str, "a");
|
logp = fopen(log_file->str, "a");
|
||||||
g_string_free(log_file, TRUE);
|
g_string_free(log_file, TRUE);
|
||||||
}
|
}
|
||||||
@ -114,6 +123,9 @@ void
|
|||||||
log_msg(log_level_t level, const char * const area, const char * const msg)
|
log_msg(log_level_t level, const char * const area, const char * const msg)
|
||||||
{
|
{
|
||||||
if (level >= level_filter) {
|
if (level >= level_filter) {
|
||||||
|
struct stat st;
|
||||||
|
int result;
|
||||||
|
GString *log_file = _get_log_file();
|
||||||
dt = g_date_time_new_now(tz);
|
dt = g_date_time_new_now(tz);
|
||||||
|
|
||||||
gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S");
|
gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S");
|
||||||
@ -122,6 +134,43 @@ log_msg(log_level_t level, const char * const area, const char * const msg)
|
|||||||
|
|
||||||
fflush(logp);
|
fflush(logp);
|
||||||
g_free(date_fmt);
|
g_free(date_fmt);
|
||||||
|
|
||||||
|
result = stat(log_file->str, &st);
|
||||||
|
if (result == 0 && st.st_size >= prefs_get_max_log_size()) {
|
||||||
|
_rotate_log_file();
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_free(log_file, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GString *
|
||||||
|
_get_log_file(void)
|
||||||
|
{
|
||||||
|
GString *log_file = g_string_new(getenv("HOME"));
|
||||||
|
g_string_append(log_file, "/.profanity/log");
|
||||||
|
create_dir(log_file->str);
|
||||||
|
g_string_append(log_file, "/profanity.log");
|
||||||
|
|
||||||
|
return log_file;
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
_rotate_log_file(void)
|
||||||
|
{
|
||||||
|
GString *log_file = _get_log_file();
|
||||||
|
size_t len = strlen(log_file->str);
|
||||||
|
char *log_file_new = malloc(len + 3);
|
||||||
|
|
||||||
|
strncpy(log_file_new, log_file->str, len);
|
||||||
|
log_file_new[len] = '.';
|
||||||
|
log_file_new[len+1] = '1';
|
||||||
|
log_file_new[len+2] = 0;
|
||||||
|
|
||||||
|
log_close();
|
||||||
|
rename(log_file->str, log_file_new);
|
||||||
|
log_init(log_get_filter());
|
||||||
|
|
||||||
|
free(log_file_new);
|
||||||
|
g_string_free(log_file, TRUE);
|
||||||
|
log_info("Log has been rotated");
|
||||||
|
}
|
||||||
|
@ -300,6 +300,13 @@ prefs_set_notify_remind(gint value)
|
|||||||
_save_prefs();
|
_save_prefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
prefs_get_max_log_size(void)
|
||||||
|
{
|
||||||
|
/* TODO: make command and field in config file */
|
||||||
|
return PREFS_MAX_LOG_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
prefs_get_vercheck(void)
|
prefs_get_vercheck(void)
|
||||||
{
|
{
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
#include <ncurses/ncurses.h>
|
#include <ncurses/ncurses.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define PREFS_MAX_LOG_SIZE 1048580
|
||||||
|
|
||||||
void prefs_load(void);
|
void prefs_load(void);
|
||||||
void prefs_close(void);
|
void prefs_close(void);
|
||||||
|
|
||||||
@ -67,6 +69,7 @@ void prefs_set_notify_typing(gboolean value);
|
|||||||
gboolean prefs_get_notify_typing(void);
|
gboolean prefs_get_notify_typing(void);
|
||||||
void prefs_set_notify_remind(gint period);
|
void prefs_set_notify_remind(gint period);
|
||||||
gint prefs_get_notify_remind(void);
|
gint prefs_get_notify_remind(void);
|
||||||
|
gint prefs_get_max_log_size(void);
|
||||||
|
|
||||||
void prefs_add_login(const char *jid);
|
void prefs_add_login(const char *jid);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user