This is probably because even though you truncate the file, the process writing to the file will continue writing at whichever offset it were at last. So what's happening is that logrotate truncates the file, size is zero, process writes to the file again, continuing at the offset it left off, and you now have a file with NULL-bytes up to the point where you truncated it plus the new entries written to the log.
od -c after truncate + sudden growth, generated output along the lines of:
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
33255657600 \0 C K B - s e r v e r [ h t t
33255657620 <more log output>
What this says is from offset 0 to 33255657600 your file consists of null bytes, and then some legible data. Getting to this state doesn't take the same amount of time it would take to actually write all those null-bytes. The ext{2,3,4} filesystems support something called sparse files, so if you seek past a region of a file that doesn't contain anything, that region will be assumed to contain null-bytes and won't take up space on disk. Those null bytes won't actually be written, just assumed to be there, hence the time it takes to go to 0 to 3.5GB don't take a lot of time to. (You can test the amount of time it takes by doing something like dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1
, this should generate a file of over 3GB in a few milliseconds).
If you run ls -ls
on your logfiles after they've been truncated and had a sudden growth again, it should now report a number at the beginning of the line which represents the actual size (in blocks occupied on disk), which probably is orders of magnitude smaller than the size reported by just ls -l
.
Fairly simple one that i have seen works like this.
Create a file in /etc/logrotate.d called tomcat containing the following:-
/var/log/tomcat/catalina.out {
copytruncate
daily
rotate 7
compress
missingok
}
This runs daily, compresses the file, and keeps 7 days worth (rotate 7). copytruncate means that it'll copy then truncate the original file so that there is no need to restart tomcat. missing ok will not error if it's not there.
The access.log Valve can be changed to not rotate by adding rotatable=false:-
<Valve className="org.apache.catalina.valves.AccessLogValve
...
...
suffix="log" rotatable="false" />
Best Answer
It has become a sort-of informal semi-standard among Unix daemons that they flush and/or rotate their log files, when you send them a hangup signal (
SIGHUP
). Nginx doesn't follow this convention to the letter, but it responds to theUSR1
signal the same way, as is documented on the Nginx website under the title Log Rotation.So, you could try something like