From 1a79c9c18234fd8329e2315dec862cf7c32db8b3 Mon Sep 17 00:00:00 2001
From: Jonathan Rose <jrose@digium.com>
Date: Wed, 12 Sep 2012 17:13:02 +0000
Subject: [PATCH] logger: Add rotatestrategy option of 'none' which does not
 perform rotations

With this option in use, it may be necessary to regulate your log files
externally.

(closes issue ASTERISK-20189)
Reported by: Jaco Kroon
Patches:
    asterisk-logger-norotate-trunk.patch uploaded by Jaco Kroon (license 5671)



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372976 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 configs/logger.conf.sample | 3 +++
 main/logger.c              | 8 +++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/configs/logger.conf.sample b/configs/logger.conf.sample
index 1fdac70301..406d6d8202 100644
--- a/configs/logger.conf.sample
+++ b/configs/logger.conf.sample
@@ -40,6 +40,9 @@
 ;queue_log_name = queue_log
 ;
 ; Log rotation strategy:
+; none:  Do not perform any logrotation at all.  You should make
+;        very sure to set up some external logrotate mechanism
+;        as the asterisk logs can get very large, very quickly.
 ; sequential:  Rename archived logs in order, such that the newest
 ;              has the highest sequence number [default].  When
 ;              exec_after_rotate is set, ${filename} will specify
diff --git a/main/logger.c b/main/logger.c
index e85676857b..5ff3080099 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -92,6 +92,7 @@ struct ast_callid {
 AST_THREADSTORAGE_CUSTOM(unique_callid, NULL, unique_callid_cleanup);
 
 static enum rotatestrategy {
+	NONE = 0,                /* Do not rotate log files at all, instead rely on external mechanisms */
 	SEQUENTIAL = 1 << 0,     /* Original method - create a new file, in order */
 	ROTATE = 1 << 1,         /* Rotate all files, such that the oldest file has the highest suffix */
 	TIMESTAMP = 1 << 2,      /* Append the epoch timestamp onto the end of the archived file */
@@ -427,6 +428,8 @@ static void init_logger_chain(int locked, const char *altconf)
 			rotatestrategy = ROTATE;
 		} else if (strcasecmp(s, "sequential") == 0) {
 			rotatestrategy = SEQUENTIAL;
+		} else if (strcasecmp(s, "none") == 0) {
+			rotatestrategy = NONE;
 		} else {
 			fprintf(stderr, "Unknown rotatestrategy: %s\n", s);
 		}
@@ -610,6 +613,9 @@ static int rotate_file(const char *filename)
 	char *suffixes[4] = { "", ".gz", ".bz2", ".Z" };
 
 	switch (rotatestrategy) {
+	case NONE:
+		/* No rotation */
+		break;
 	case SEQUENTIAL:
 		for (x = 0; ; x++) {
 			snprintf(new, sizeof(new), "%s.%d", filename, x);
@@ -810,7 +816,7 @@ static int reload_logger(int rotate, const char *altconf)
 		}
 		if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) {
 			int rotate_this = 0;
-			if (ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
+			if (rotatestrategy != NONE && ftello(f->fileptr) > 0x40000000) { /* Arbitrarily, 1 GB */
 				/* Be more proactive about rotating massive log files */
 				rotate_this = 1;
 			}
-- 
GitLab