You can not rotate logs with out dropping calls, and if logs get a little over 2Gbs Asterisk will crashes...
Why not? Why are the logfiles kept open for the entire life of Asterisk? Hell even my heavily loaded qmail server isn't this braindead in that
regard.
If * can be patched to open, write, close for every log write it is trivial to rotate logs:
mv /path/to/logfile /path/to/logfile.old while fuser -s /path/to/logfile.old ; do sleep 1 ; done bzip2 -1 /path/to/logfile.old
and you're done. mv does not change the inode, so asterisk does not notice it if it _is_ in the middle of a write, and the fuser do/while loop waits patiently until asterisk is done with the file. Next time Asterisk tries to open the file it will fail (since it doesn't exist) and will recreate it. Piece of cake.
Regards, Andrew
Whoever said that Asterisk cannot rotate it's logfile without dropping calls was incorrect. There is a command built into Asterisk as of last month called "logger reload" - try:
asterisk -rx "logger reload"
See: http://bugs.digium.com/bug_view_page.php?bug_id=0000265
Or:
From: [EMAIL PROTECTED] To: [EMAIL PROTECTED] Subject: [Asterisk-cvs] asterisk logger.c,1.4,1.5 Date: Thu, 2 Oct 2003 02:38:59 -0400 (EDT)
Update of /usr/cvsroot/asterisk In directory mongoose.digium.com:/tmp/cvs-serv31710
Modified Files: logger.c Log Message: Add "logger reload" CLI (bug #345)
Index: logger.c =================================================================== RCS file: /usr/cvsroot/asterisk/logger.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- logger.c 8 Sep 2003 16:48:06 -0000 1.4 +++ logger.c 2 Oct 2003 06:40:10 -0000 1.5 @@ -21,6 +21,7 @@ #include <asterisk/channel.h> #include <asterisk/config.h> #include <asterisk/term.h> +#include <asterisk/cli.h> #include <string.h> #include <stdlib.h> #include <errno.h> @@ -173,22 +174,22 @@
}
-static struct verb {
- void (*verboser)(const char *string, int opos, int replacelast, int complete);
- struct verb *next;
-} *verboser = NULL;
-
-int init_logger(void)
+int reload_logger(void)
{
char tmp[AST_CONFIG_MAX_PATH];
+ ast_mutex_lock(&loglock);
+ if (eventlog)
+ fclose(eventlog);
mkdir((char *)ast_config_AST_LOG_DIR, 0755);
snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
eventlog = fopen((char *)tmp, "a");
+ ast_mutex_unlock(&loglock);
+
if (eventlog) {
init_logger_chain();
- ast_log(LOG_EVENT, "Started Asterisk Event Logger\n");
+ ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n");
if (option_verbose)
- ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp);
+ ast_verbose("Asterisk Event Logger restarted\n");
return 0;
} else
ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
@@ -196,28 +197,55 @@
return -1;
}
-int reload_logger(void)
+static int handle_logger_reload(int fd, int argc, char *argv[])
+{
+ if(reload_logger())
+ {
+ ast_cli(fd, "Failed to reloadthe logger\n");
+ return RESULT_FAILURE;
+ }
+ else
+ return RESULT_SUCCESS;
+}
+
+static struct verb {
+ void (*verboser)(const char *string, int opos, int replacelast, int complete);
+ struct verb *next;
+} *verboser = NULL;
+
+
+static char logger_reload_help[] =
+"Usage: logger reload\n"
+" Reopens the log files. Use after a rotating the log files\n";
+
+static struct ast_cli_entry reload_logger_cli =
+ { { "logger", "reload", NULL },
+ handle_logger_reload, "Reopens the log files",
+ logger_reload_help };
+
+
+int init_logger(void)
{
char tmp[AST_CONFIG_MAX_PATH];
- ast_mutex_lock(&loglock);
- if (eventlog)
- fclose(eventlog);
+
+ /* register the relaod logger cli command */
+ ast_cli_register(&reload_logger_cli);
+
mkdir((char *)ast_config_AST_LOG_DIR, 0755);
snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG);
eventlog = fopen((char *)tmp, "a");
- ast_mutex_unlock(&loglock);
-
if (eventlog) {
init_logger_chain();
- ast_log(LOG_EVENT, "Restarted Asterisk Event Logger\n");
+ ast_log(LOG_EVENT, "Started Asterisk Event Logger\n");
if (option_verbose)
- ast_verbose("Asterisk Event Logger restarted\n");
+ ast_verbose("Asterisk Event Logger Started %s\n",(char *)tmp);
return 0;
} else
ast_log(LOG_ERROR, "Unable to create event log: %s\n", strerror(errno));
init_logger_chain();
return -1;
}
+
extern void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
{
JT _______________________________________________ Asterisk-Users mailing list [EMAIL PROTECTED] http://lists.digium.com/mailman/listinfo/asterisk-users
