From a4a23fdf689608636e1d7fe049be081728f69e46 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 13 Apr 2014 20:41:11 +0100 Subject: [PATCH 1/3] Added /log rotate option --- src/command/command.c | 37 +++++++++++++++++++++++++++++-------- src/command/commands.c | 15 +++++++++++++-- src/config/preferences.c | 4 ++++ src/config/preferences.h | 3 ++- src/log.c | 8 +++++--- src/profanity.c | 2 +- src/ui/console.c | 4 ++++ 7 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/command/command.c b/src/command/command.c index d7cf67e3..89d3e376 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -69,6 +69,7 @@ static char * _connect_autocomplete(char *input, int *size); static char * _statuses_autocomplete(char *input, int *size); static char * _alias_autocomplete(char *input, int *size); static char * _join_autocomplete(char *input, int *size); +static char * _log_autocomplete(char *input, int *size); GHashTable *commands = NULL; @@ -639,11 +640,12 @@ static struct cmd_t command_defs[] = { "/log", cmd_log, parse_args, 2, 2, &cons_log_setting, - { "/log maxsize value", "Manage system logging settings.", - { "/log maxsize value", - "------------------", - "maxsize : When log file size exceeds this value it will be automatically", - " rotated (file will be renamed). Default value is 1048580 (1MB)", + { "/log [property] [value]", "Manage system logging settings.", + { "/log [property] [value]", + "-----------------------", + "Property may be one of:", + "rotate : 'on' or 'off', determines whether the log will be rotated, defaults to 'on'", + "maxsize : When log file size exceeds this value and rotate is enabled, it will be automatically be rotated, defaults to 1048580 (1MB)", NULL } } }, { "/reconnect", @@ -950,6 +952,7 @@ cmd_init(void) log_ac = autocomplete_new(); autocomplete_add(log_ac, "maxsize"); + autocomplete_add(log_ac, "rotate"); autoaway_ac = autocomplete_new(); autocomplete_add(autoaway_ac, "mode"); @@ -1468,8 +1471,8 @@ _cmd_complete_parameters(char *input, int *size) } } - gchar *cmds[] = { "/help", "/prefs", "/log", "/disco", "/close", "/wins" }; - Autocomplete completers[] = { help_ac, prefs_ac, log_ac, disco_ac, close_ac, wins_ac }; + gchar *cmds[] = { "/help", "/prefs", "/disco", "/close", "/wins" }; + Autocomplete completers[] = { help_ac, prefs_ac, disco_ac, close_ac, wins_ac }; for (i = 0; i < ARRAY_SIZE(cmds); i++) { result = autocomplete_param_with_ac(input, size, cmds[i], completers[i]); @@ -1481,7 +1484,7 @@ _cmd_complete_parameters(char *input, int *size) } autocompleter acs[] = { _who_autocomplete, _sub_autocomplete, _notify_autocomplete, - _autoaway_autocomplete, _theme_autocomplete, + _autoaway_autocomplete, _theme_autocomplete, _log_autocomplete, _account_autocomplete, _roster_autocomplete, _group_autocomplete, _bookmark_autocomplete, _autoconnect_autocomplete, _otr_autocomplete, _connect_autocomplete, _statuses_autocomplete, _alias_autocomplete, @@ -1674,6 +1677,24 @@ _autoaway_autocomplete(char *input, int *size) return NULL; } +static char * +_log_autocomplete(char *input, int *size) +{ + char *result = NULL; + + result = autocomplete_param_with_func(input, size, "/log rotate", + prefs_autocomplete_boolean_choice); + if (result != NULL) { + return result; + } + result = autocomplete_param_with_ac(input, size, "/log", log_ac); + if (result != NULL) { + return result; + } + + return NULL; +} + static char * _autoconnect_autocomplete(char *input, int *size) { diff --git a/src/command/commands.c b/src/command/commands.c index fd7523fa..884c26a4 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -2291,10 +2291,21 @@ cmd_log(gchar **args, struct cmd_help_t help) prefs_set_max_log_size(intval); cons_show("Log maxinum size set to %d bytes", intval); } - } else { - cons_show("Usage: %s", help.usage); + return TRUE; } + if (strcmp(subcmd, "rotate") == 0) { + if (value == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; + } else { + return _cmd_set_boolean_preference(value, help, + "Log rotate", PREF_LOG_ROTATE); + } + } + + cons_show("Usage: %s", help.usage); + /* TODO: make 'level' subcommand for debug level */ return TRUE; diff --git a/src/config/preferences.c b/src/config/preferences.c index 6f085ba3..7327cd8e 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -393,6 +393,7 @@ _get_group(preference_t pref) case PREF_CHLOG: case PREF_GRLOG: case PREF_OTR_LOG: + case PREF_LOG_ROTATE: return PREF_GROUP_LOGGING; case PREF_AUTOAWAY_CHECK: case PREF_AUTOAWAY_MODE: @@ -464,6 +465,8 @@ _get_key(preference_t pref) return "otr"; case PREF_OTR_WARN: return "otr.warn"; + case PREF_LOG_ROTATE: + return "rotate"; default: return NULL; } @@ -477,6 +480,7 @@ _get_default_boolean(preference_t pref) case PREF_TITLEBAR: case PREF_OTR_WARN: case PREF_AUTOAWAY_CHECK: + case PREF_LOG_ROTATE: return TRUE; default: return FALSE; diff --git a/src/config/preferences.h b/src/config/preferences.h index 2c783f4d..266fccc5 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -62,7 +62,8 @@ typedef enum { PREF_AUTOAWAY_MESSAGE, PREF_CONNECT_ACCOUNT, PREF_OTR_LOG, - PREF_OTR_WARN + PREF_OTR_WARN, + PREF_LOG_ROTATE } preference_t; typedef struct prof_alias_t { diff --git a/src/log.c b/src/log.c index 68ba476c..b0745392 100644 --- a/src/log.c +++ b/src/log.c @@ -154,9 +154,11 @@ log_msg(log_level_t level, const char * const area, const char * const msg) fflush(logp); g_free(date_fmt); - result = ftell(logp); - if (result != -1 && result >= prefs_get_max_log_size()) { - _rotate_log_file(); + if (prefs_get_boolean(PREF_LOG_ROTATE)) { + result = ftell(logp); + if (result != -1 && result >= prefs_get_max_log_size()) { + _rotate_log_file(); + } } } } diff --git a/src/profanity.c b/src/profanity.c index 540b6085..95355670 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -256,6 +256,7 @@ _init(const int disable_tls, char *log_level) signal(SIGPIPE, SIG_IGN); _create_directories(); log_level_t prof_log_level = log_level_from_string(log_level); + prefs_load(); log_init(prof_log_level); if (strcmp(PACKAGE_STATUS, "development") == 0) { #ifdef HAVE_GIT_VERSION @@ -268,7 +269,6 @@ _init(const int disable_tls, char *log_level) } chat_log_init(); groupchat_log_init(); - prefs_load(); accounts_load(); gchar *theme = prefs_get_string(PREF_THEME); theme_init(theme); diff --git a/src/ui/console.c b/src/ui/console.c index 86ee7909..aedb637d 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1223,6 +1223,10 @@ static void _cons_log_setting(void) { cons_show("Max log size (/log maxsize) : %d bytes", prefs_get_max_log_size()); + if (prefs_get_boolean(PREF_LOG_ROTATE)) + cons_show("Log rotation (/log rotate) : ON"); + else + cons_show("Log rotation (/log rotate) : OFF"); } static void From c3418a290959a6b128c6224ccd01562850ae98c0 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 13 Apr 2014 21:56:35 +0100 Subject: [PATCH 2/3] Added /log shared setting Issue #170 --- src/command/command.c | 11 +++++++++-- src/command/commands.c | 12 ++++++++++++ src/config/preferences.c | 4 ++++ src/config/preferences.h | 3 ++- src/log.c | 22 +++++++++++++++++----- src/log.h | 1 + src/ui/console.c | 6 ++++++ tests/log/mock_log.c | 1 + 8 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/command/command.c b/src/command/command.c index 89d3e376..240a4ad6 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -644,8 +644,9 @@ static struct cmd_t command_defs[] = { "/log [property] [value]", "-----------------------", "Property may be one of:", - "rotate : 'on' or 'off', determines whether the log will be rotated, defaults to 'on'", - "maxsize : When log file size exceeds this value and rotate is enabled, it will be automatically be rotated, defaults to 1048580 (1MB)", + "rotate : Rotate log, accepts 'on' or 'off', defaults to 'on'.", + "maxsize : With rotate enabled, specifies the max log size, defaults to 1048580 (1MB).", + "shared : Share logs between all instances, accepts 'on' or 'off', defaults to 'on'.", NULL } } }, { "/reconnect", @@ -953,6 +954,7 @@ cmd_init(void) log_ac = autocomplete_new(); autocomplete_add(log_ac, "maxsize"); autocomplete_add(log_ac, "rotate"); + autocomplete_add(log_ac, "shared"); autoaway_ac = autocomplete_new(); autocomplete_add(autoaway_ac, "mode"); @@ -1687,6 +1689,11 @@ _log_autocomplete(char *input, int *size) if (result != NULL) { return result; } + result = autocomplete_param_with_func(input, size, "/log shared", + prefs_autocomplete_boolean_choice); + if (result != NULL) { + return result; + } result = autocomplete_param_with_ac(input, size, "/log", log_ac); if (result != NULL) { return result; diff --git a/src/command/commands.c b/src/command/commands.c index 884c26a4..bebf9d3c 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -2304,6 +2304,18 @@ cmd_log(gchar **args, struct cmd_help_t help) } } + if (strcmp(subcmd, "shared") == 0) { + if (value == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; + } else { + gboolean result = _cmd_set_boolean_preference(value, help, + "Shared log", PREF_LOG_SHARED); + log_reinit(); + return result; + } + } + cons_show("Usage: %s", help.usage); /* TODO: make 'level' subcommand for debug level */ diff --git a/src/config/preferences.c b/src/config/preferences.c index 7327cd8e..9cc91cb6 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -394,6 +394,7 @@ _get_group(preference_t pref) case PREF_GRLOG: case PREF_OTR_LOG: case PREF_LOG_ROTATE: + case PREF_LOG_SHARED: return PREF_GROUP_LOGGING; case PREF_AUTOAWAY_CHECK: case PREF_AUTOAWAY_MODE: @@ -467,6 +468,8 @@ _get_key(preference_t pref) return "otr.warn"; case PREF_LOG_ROTATE: return "rotate"; + case PREF_LOG_SHARED: + return "shared"; default: return NULL; } @@ -481,6 +484,7 @@ _get_default_boolean(preference_t pref) case PREF_OTR_WARN: case PREF_AUTOAWAY_CHECK: case PREF_LOG_ROTATE: + case PREF_LOG_SHARED: return TRUE; default: return FALSE; diff --git a/src/config/preferences.h b/src/config/preferences.h index 266fccc5..310b9032 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -63,7 +63,8 @@ typedef enum { PREF_CONNECT_ACCOUNT, PREF_OTR_LOG, PREF_OTR_WARN, - PREF_LOG_ROTATE + PREF_LOG_ROTATE, + PREF_LOG_SHARED } preference_t; typedef struct prof_alias_t { diff --git a/src/log.c b/src/log.c index b0745392..cb346e6c 100644 --- a/src/log.c +++ b/src/log.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "glib.h" @@ -60,7 +61,7 @@ static char * _get_log_filename(const char * const other, const char * const log static char * _get_groupchat_log_filename(const char * const room, const char * const login, GDateTime *dt, gboolean create); static gchar * _get_chatlog_dir(void); -static gchar * _get_log_file(void); +static gchar * _get_main_log_file(void); static void _rotate_log_file(void); static char* _log_string_from_level(log_level_t level); @@ -117,11 +118,18 @@ log_init(log_level_t filter) { level_filter = filter; tz = g_time_zone_new_local(); - gchar *log_file = _get_log_file(); + gchar *log_file = _get_main_log_file(); logp = fopen(log_file, "a"); free(log_file); } +void +log_reinit(void) +{ + log_close(); + log_init(level_filter); +} + log_level_t log_get_filter(void) { @@ -183,7 +191,7 @@ log_level_from_string(char *log_level) static void _rotate_log_file(void) { - gchar *log_file = _get_log_file(); + gchar *log_file = _get_main_log_file(); size_t len = strlen(log_file); char *log_file_new = malloc(len + 3); @@ -518,11 +526,15 @@ _get_chatlog_dir(void) } static gchar * -_get_log_file(void) +_get_main_log_file(void) { gchar *xdg_data = xdg_get_data_home(); GString *logfile = g_string_new(xdg_data); - g_string_append(logfile, "/profanity/logs/profanity.log"); + g_string_append(logfile, "/profanity/logs/profanity"); + if (!prefs_get_boolean(PREF_LOG_SHARED)) { + g_string_append_printf(logfile, "%d", getpid()); + } + g_string_append(logfile, ".log"); gchar *result = strdup(logfile->str); free(xdg_data); g_string_free(logfile, TRUE); diff --git a/src/log.h b/src/log.h index fcb1a9f2..86d96392 100644 --- a/src/log.h +++ b/src/log.h @@ -41,6 +41,7 @@ typedef enum { void log_init(log_level_t filter); log_level_t log_get_filter(void); void log_close(void); +void log_reinit(void); void log_debug(const char * const msg, ...); void log_info(const char * const msg, ...); void log_warning(const char * const msg, ...); diff --git a/src/ui/console.c b/src/ui/console.c index aedb637d..ec9130cf 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1223,10 +1223,16 @@ static void _cons_log_setting(void) { cons_show("Max log size (/log maxsize) : %d bytes", prefs_get_max_log_size()); + if (prefs_get_boolean(PREF_LOG_ROTATE)) cons_show("Log rotation (/log rotate) : ON"); else cons_show("Log rotation (/log rotate) : OFF"); + + if (prefs_get_boolean(PREF_LOG_SHARED)) + cons_show("Shared log (/log shared) : ON"); + else + cons_show("Shared log (/log shared) : OFF"); } static void diff --git a/tests/log/mock_log.c b/tests/log/mock_log.c index a5e6a950..1d02c9d1 100644 --- a/tests/log/mock_log.c +++ b/tests/log/mock_log.c @@ -31,6 +31,7 @@ log_level_t log_get_filter(void) { return (log_level_t)mock(); } +void log_reinit(void) {} void log_close(void) {} void log_debug(const char * const msg, ...) {} void log_info(const char * const msg, ...) {} From 67a109927cbb70f48198f4516c330c157bfc209a Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 13 Apr 2014 22:20:15 +0100 Subject: [PATCH 3/3] Added /log where command --- src/command/command.c | 4 +++- src/command/commands.c | 22 ++++++++++++++-------- src/log.c | 9 +++++++++ src/log.h | 1 + src/ui/console.c | 2 ++ 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/command/command.c b/src/command/command.c index 240a4ad6..5175a16b 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -639,10 +639,11 @@ static struct cmd_t command_defs[] = NULL } } }, { "/log", - cmd_log, parse_args, 2, 2, &cons_log_setting, + cmd_log, parse_args, 1, 2, &cons_log_setting, { "/log [property] [value]", "Manage system logging settings.", { "/log [property] [value]", "-----------------------", + "where : Show the current log file location.", "Property may be one of:", "rotate : Rotate log, accepts 'on' or 'off', defaults to 'on'.", "maxsize : With rotate enabled, specifies the max log size, defaults to 1048580 (1MB).", @@ -955,6 +956,7 @@ cmd_init(void) autocomplete_add(log_ac, "maxsize"); autocomplete_add(log_ac, "rotate"); autocomplete_add(log_ac, "shared"); + autocomplete_add(log_ac, "where"); autoaway_ac = autocomplete_new(); autocomplete_add(autoaway_ac, "mode"); diff --git a/src/command/commands.c b/src/command/commands.c index bebf9d3c..0fc8574b 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -2287,6 +2287,10 @@ cmd_log(gchar **args, struct cmd_help_t help) int intval; if (strcmp(subcmd, "maxsize") == 0) { + if (value == NULL) { + cons_show("Usage: %s", help.usage); + return TRUE; + } if (_strtoi(value, &intval, PREFS_MIN_LOG_SIZE, INT_MAX) == 0) { prefs_set_max_log_size(intval); cons_show("Log maxinum size set to %d bytes", intval); @@ -2298,22 +2302,24 @@ cmd_log(gchar **args, struct cmd_help_t help) if (value == NULL) { cons_show("Usage: %s", help.usage); return TRUE; - } else { - return _cmd_set_boolean_preference(value, help, - "Log rotate", PREF_LOG_ROTATE); } + return _cmd_set_boolean_preference(value, help, "Log rotate", PREF_LOG_ROTATE); } if (strcmp(subcmd, "shared") == 0) { if (value == NULL) { cons_show("Usage: %s", help.usage); return TRUE; - } else { - gboolean result = _cmd_set_boolean_preference(value, help, - "Shared log", PREF_LOG_SHARED); - log_reinit(); - return result; } + gboolean result = _cmd_set_boolean_preference(value, help, "Shared log", PREF_LOG_SHARED); + log_reinit(); + return result; + } + + if (strcmp(subcmd, "where") == 0) { + char *logfile = get_log_file_location(); + cons_show("Log file: %s", logfile); + return TRUE; } cons_show("Usage: %s", help.usage); diff --git a/src/log.c b/src/log.c index cb346e6c..b30c68cb 100644 --- a/src/log.c +++ b/src/log.c @@ -37,6 +37,7 @@ #define PROF "prof" static FILE *logp; +GString *mainlogfile; static GTimeZone *tz; static GDateTime *dt; @@ -120,6 +121,7 @@ log_init(log_level_t filter) tz = g_time_zone_new_local(); gchar *log_file = _get_main_log_file(); logp = fopen(log_file, "a"); + mainlogfile = g_string_new(log_file); free(log_file); } @@ -130,6 +132,12 @@ log_reinit(void) log_init(level_filter); } +char * +get_log_file_location(void) +{ + return mainlogfile->str; +} + log_level_t log_get_filter(void) { @@ -139,6 +147,7 @@ log_get_filter(void) void log_close(void) { + g_string_free(mainlogfile, TRUE); g_time_zone_unref(tz); if (logp != NULL) { fclose(logp); diff --git a/src/log.h b/src/log.h index 86d96392..d9cd92e1 100644 --- a/src/log.h +++ b/src/log.h @@ -42,6 +42,7 @@ void log_init(log_level_t filter); log_level_t log_get_filter(void); void log_close(void); void log_reinit(void); +char * get_log_file_location(void); void log_debug(const char * const msg, ...); void log_info(const char * const msg, ...); void log_warning(const char * const msg, ...); diff --git a/src/ui/console.c b/src/ui/console.c index ec9130cf..d7bb1904 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -31,6 +31,7 @@ #include "command/command.h" #include "common.h" +#include "log.h" #include "roster_list.h" #include "config/preferences.h" #include "config/theme.h" @@ -1222,6 +1223,7 @@ _cons_show_chat_prefs(void) static void _cons_log_setting(void) { + cons_show("Log file location : %s", get_log_file_location()); cons_show("Max log size (/log maxsize) : %d bytes", prefs_get_max_log_size()); if (prefs_get_boolean(PREF_LOG_ROTATE))