mirror of
https://github.com/weechat/weechat.git
synced 2026-06-30 06:46:38 +02:00
logger: add option logger.file.flush_delay (task #11118)
This commit is contained in:
@@ -93,6 +93,7 @@ logger_buffer_add (struct t_gui_buffer *buffer, int log_level)
|
||||
new_logger_buffer->log_enabled = 1;
|
||||
new_logger_buffer->log_level = log_level;
|
||||
new_logger_buffer->write_start_info_line = 1;
|
||||
new_logger_buffer->flush_needed = 0;
|
||||
|
||||
new_logger_buffer->prev_buffer = last_logger_buffer;
|
||||
new_logger_buffer->next_buffer = NULL;
|
||||
@@ -228,6 +229,8 @@ logger_buffer_add_to_infolist (struct t_infolist *infolist,
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "write_start_info_line", logger_buffer->write_start_info_line))
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "flush_needed", logger_buffer->flush_needed))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ struct t_logger_buffer
|
||||
int log_level; /* log level (0..9) */
|
||||
int write_start_info_line; /* 1 if start info line must be */
|
||||
/* written in file */
|
||||
int flush_needed; /* flush needed? */
|
||||
struct t_logger_buffer *prev_buffer; /* link to previous buffer */
|
||||
struct t_logger_buffer *next_buffer; /* link to next buffer */
|
||||
};
|
||||
|
||||
@@ -42,6 +42,7 @@ struct t_config_option *logger_config_look_backlog;
|
||||
/* logger config, file section */
|
||||
|
||||
struct t_config_option *logger_config_file_auto_log;
|
||||
struct t_config_option *logger_config_file_flush_delay;
|
||||
struct t_config_option *logger_config_file_name_lower_case;
|
||||
struct t_config_option *logger_config_file_path;
|
||||
struct t_config_option *logger_config_file_mask;
|
||||
@@ -68,6 +69,49 @@ logger_config_change_file_option_restart_log (void *data,
|
||||
logger_adjust_log_filenames ();
|
||||
}
|
||||
|
||||
/*
|
||||
* logger_config_flush_delay_change: called when flush delay is changed
|
||||
*/
|
||||
|
||||
void
|
||||
logger_config_flush_delay_change (void *data,
|
||||
struct t_config_option *option)
|
||||
{
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
(void) option;
|
||||
|
||||
if (logger_config_loading)
|
||||
return;
|
||||
|
||||
if (logger_timer)
|
||||
{
|
||||
if (weechat_logger_plugin->debug)
|
||||
{
|
||||
weechat_printf_tags (NULL,
|
||||
"no_log",
|
||||
"%s: stopping timer", LOGGER_PLUGIN_NAME);
|
||||
}
|
||||
weechat_unhook (logger_timer);
|
||||
logger_timer = NULL;
|
||||
}
|
||||
|
||||
if (weechat_config_integer (logger_config_file_flush_delay) > 0)
|
||||
{
|
||||
if (weechat_logger_plugin->debug)
|
||||
{
|
||||
weechat_printf_tags (NULL,
|
||||
"no_log",
|
||||
"%s: starting timer (interval: %d seconds)",
|
||||
LOGGER_PLUGIN_NAME,
|
||||
weechat_config_integer (logger_config_file_flush_delay));
|
||||
}
|
||||
logger_timer = weechat_hook_timer (weechat_config_integer (logger_config_file_flush_delay) * 1000,
|
||||
0, 0,
|
||||
&logger_timer_cb, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* logger_config_level_change: called when a level option is changed
|
||||
*/
|
||||
@@ -352,6 +396,13 @@ logger_config_init ()
|
||||
N_("automatically save content of buffers to files (unless a buffer "
|
||||
"disables log)"),
|
||||
NULL, 0, 0, "on", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
logger_config_file_flush_delay = weechat_config_new_option (
|
||||
logger_config_file, ptr_section,
|
||||
"flush_delay", "integer",
|
||||
N_("number of seconds between flush of log files (0 = write in log "
|
||||
"files immediately for each line printed)"),
|
||||
NULL, 0, 3600, "120", NULL, 0, NULL, NULL,
|
||||
&logger_config_flush_delay_change, NULL, NULL, NULL);
|
||||
logger_config_file_name_lower_case = weechat_config_new_option (
|
||||
logger_config_file, ptr_section,
|
||||
"name_lower_case", "boolean",
|
||||
@@ -442,6 +493,8 @@ logger_config_read ()
|
||||
rc = weechat_config_read (logger_config_file);
|
||||
logger_config_loading = 0;
|
||||
|
||||
logger_config_flush_delay_change (NULL, NULL);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ WEECHAT_PLUGIN_LICENSE(WEECHAT_LICENSE);
|
||||
|
||||
struct t_weechat_plugin *weechat_logger_plugin = NULL;
|
||||
|
||||
struct t_hook *logger_timer = NULL; /* timer to flush log files */
|
||||
char *logger_buf_write = NULL; /* buffer for writing a line */
|
||||
|
||||
|
||||
@@ -588,6 +589,7 @@ logger_write_line (struct t_logger_buffer *logger_buffer,
|
||||
"%s\n", (message) ? message : logger_buf_write);
|
||||
if (message)
|
||||
free (message);
|
||||
logger_buffer->flush_needed = 1;
|
||||
}
|
||||
logger_buffer->write_start_info_line = 0;
|
||||
}
|
||||
@@ -601,9 +603,15 @@ logger_write_line (struct t_logger_buffer *logger_buffer,
|
||||
|
||||
fprintf (logger_buffer->log_file,
|
||||
"%s\n", (message) ? message : logger_buf_write);
|
||||
fflush (logger_buffer->log_file);
|
||||
if (message)
|
||||
free (message);
|
||||
logger_buffer->flush_needed = 1;
|
||||
|
||||
if (!logger_timer)
|
||||
{
|
||||
fflush (logger_buffer->log_file);
|
||||
logger_buffer->flush_needed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1200,6 +1208,40 @@ logger_print_cb (void *data, struct t_gui_buffer *buffer, time_t date,
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* logger_timer_cb: callback for logger timer
|
||||
*/
|
||||
|
||||
int
|
||||
logger_timer_cb (void *data, int remaining_calls)
|
||||
{
|
||||
struct t_logger_buffer *ptr_logger_buffer;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
(void) remaining_calls;
|
||||
|
||||
for (ptr_logger_buffer = logger_buffers; ptr_logger_buffer;
|
||||
ptr_logger_buffer = ptr_logger_buffer->next_buffer)
|
||||
{
|
||||
if (ptr_logger_buffer->log_file && ptr_logger_buffer->flush_needed)
|
||||
{
|
||||
if (weechat_logger_plugin->debug >= 2)
|
||||
{
|
||||
weechat_printf_tags (NULL,
|
||||
"no_log",
|
||||
"%s: flush file %s",
|
||||
LOGGER_PLUGIN_NAME,
|
||||
ptr_logger_buffer->log_filename);
|
||||
}
|
||||
fflush (ptr_logger_buffer->log_file);
|
||||
ptr_logger_buffer->flush_needed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* weechat_plugin_init: initialize logger plugin
|
||||
*/
|
||||
@@ -1285,6 +1327,12 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
|
||||
/* make C compiler happy */
|
||||
(void) plugin;
|
||||
|
||||
if (logger_timer)
|
||||
{
|
||||
weechat_unhook (logger_timer);
|
||||
logger_timer = NULL;
|
||||
}
|
||||
|
||||
logger_config_write ();
|
||||
|
||||
logger_stop_all (1);
|
||||
|
||||
@@ -28,8 +28,11 @@
|
||||
|
||||
extern struct t_weechat_plugin *weechat_logger_plugin;
|
||||
|
||||
extern struct t_hook *logger_timer;
|
||||
|
||||
extern void logger_start_buffer_all (int write_info_line);
|
||||
extern void logger_stop_all (int write_info_line);
|
||||
extern void logger_adjust_log_filenames ();
|
||||
extern int logger_timer_cb (void *data, int remaining_calls);
|
||||
|
||||
#endif /* __WEECHAT_LOGGER_H */
|
||||
|
||||
Reference in New Issue
Block a user