Hi,
it seems there is a bug in newsyslog when using the monitor flag in
conjunction with a time specification. Files are only monitored if
they're about to getting rotated (time's up).
Given the following line in newsyslog.conf:
# Rotate every week on Monday at 00:00 hr
/var/log/authlog root:wheel 640 7 * $W1 ZM root
and the following lines in root's crontab:
# Rotate log files every hour expect midnight
0 1-23 * * * /usr/bin/newsyslog
# Monitor and rotate log files at midnight
0 0 * * * /usr/bin/newsyslog -m; /usr/bin/newsyslog
I found that my logfile only got monitored once a week just before it
got trimmed instead of every midnight (given there were changes in the
logfile, of course).
I suspect this is because of lines 323 - 328 in newsyslog.c which are
always evaluated until the file needs actual trimming. Because of the
return, domonitor() in line 338 is not reached.
Please see attached a proposal patch. I must admit that I'm a C novice,
but it seems to fix the problem and doesn't introduce others. This patch
also adjusts the verbose output a little, so it matches the other
formats (eg. when rotating by size or interval).
Regards
André
Index: newsyslog.c
===================================================================
RCS file: /cvs/src/usr.bin/newsyslog/newsyslog.c,v
retrieving revision 1.91
diff -u -r1.91 newsyslog.c
--- newsyslog.c 5 Apr 2013 01:29:07 -0000 1.91
+++ newsyslog.c 4 Mar 2014 18:55:25 -0000
@@ -295,6 +295,7 @@
{
struct stat sb;
int modhours;
+ int notrim = 0;
off_t size;
if (lstat(ent->log, &sb) != 0)
@@ -323,11 +324,11 @@
if (ent->flags & CE_TRIMAT && !force) {
if (timenow < ent->trim_at ||
difftime(timenow, ent->trim_at) >= 60 * 60) {
- DPRINTF(("--> will trim at %s",
+ DPRINTF(("will trim at %.24s ",
ctime(&ent->trim_at)));
- return;
+ notrim = 1;
} else if (ent->hours <= 0) {
- DPRINTF(("--> time is up\n"));
+ DPRINTF(("time is up\n"));
}
}
if (ent->size > 0)
@@ -337,7 +338,7 @@
DPRINTF(("age (hr): %d [%d] ", modhours, ent->hours));
if (monitormode && (ent->flags & CE_MONITOR) && domonitor(ent))
DPRINTF(("--> monitored\n"));
- else if (!monitormode &&
+ else if (!monitormode && !notrim &&
(force || (ent->size > 0 && size >= ent->size) ||
(ent->hours <= 0 && (ent->flags & CE_TRIMAT)) ||
(ent->hours > 0 && (modhours >= ent->hours || modhours < 0)