mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05: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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "glib.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "log.h"
|
||||
#include "preferences.h"
|
||||
|
||||
#define PROF "prof"
|
||||
|
||||
#ifdef _WIN32
|
||||
// replace 'struct stat' and 'stat()' for windows
|
||||
#define stat _stat
|
||||
#endif
|
||||
|
||||
static FILE *logp;
|
||||
|
||||
static GTimeZone *tz;
|
||||
static GDateTime *dt;
|
||||
static log_level_t level_filter;
|
||||
|
||||
static GString *_get_log_file(void);
|
||||
static void _rotate_log_file(void);
|
||||
|
||||
void
|
||||
log_debug(const char * const msg, ...)
|
||||
{
|
||||
@ -89,10 +101,7 @@ log_init(log_level_t filter)
|
||||
{
|
||||
level_filter = filter;
|
||||
tz = g_time_zone_new_local();
|
||||
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");
|
||||
GString *log_file = _get_log_file();
|
||||
logp = fopen(log_file->str, "a");
|
||||
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)
|
||||
{
|
||||
if (level >= level_filter) {
|
||||
struct stat st;
|
||||
int result;
|
||||
GString *log_file = _get_log_file();
|
||||
dt = g_date_time_new_now(tz);
|
||||
|
||||
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);
|
||||
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();
|
||||
}
|
||||
|
||||
gint
|
||||
prefs_get_max_log_size(void)
|
||||
{
|
||||
/* TODO: make command and field in config file */
|
||||
return PREFS_MAX_LOG_SIZE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
prefs_get_vercheck(void)
|
||||
{
|
||||
|
@ -34,6 +34,8 @@
|
||||
#include <ncurses/ncurses.h>
|
||||
#endif
|
||||
|
||||
#define PREFS_MAX_LOG_SIZE 1048580
|
||||
|
||||
void prefs_load(void);
|
||||
void prefs_close(void);
|
||||
|
||||
@ -67,6 +69,7 @@ void prefs_set_notify_typing(gboolean value);
|
||||
gboolean prefs_get_notify_typing(void);
|
||||
void prefs_set_notify_remind(gint period);
|
||||
gint prefs_get_notify_remind(void);
|
||||
gint prefs_get_max_log_size(void);
|
||||
|
||||
void prefs_add_login(const char *jid);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user