During logroate, if there comes a log entry, where will this log entry goes? To the rotated file, lost, or to the newly created file?
It depends.
The logrotate process
In RHEL 6 (centos 6), logrotate works like below:
1. Rename the original file. For example, /var/log/messages –> /var/log/messages.1
2. Create a new file. In this example, create an empty /var/log/messages
3. Run post-rotate script. For rsyslog, it would send a HUP signal to rsyslogd.
Simulation
Let’s manually simulate the logrotate of rsyslog.
# Before logrotate
[root@rhel674 ~]# lsof | grep messages
rsyslogd 1717 root 1w REG 253,0 146 281379 /var/log/messages
# Simulate logrotate. Step1, rename file.
[root@rhel674 ~]# mv /var/log/messages /var/log/messages.1
[root@rhel674 ~]# lsof | grep messages
rsyslogd 1717 root 1w REG 253,0 146 281379 /var/log/messages.1
# Right after this step, there comes a log message
[root@rhel674 ~]# logger =======
[root@rhel674 ~]# cat /var/log/messages.1 | grep ===
Jun 28 15:44:23 rhel674 root: =======
[root@rhel674 ~]# lsof | grep messages
rsyslogd 1717 root 1w REG 253,0 184 281379 /var/log/messages.1
# Simulate logrotate. Step2, create a new file and reload rsyslog.
[root@rhel674 ~]# touch /var/log/messages
[root@rhel674 ~]# /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null`
[root@rhel674 ~]# lsof | grep messages
rsyslogd 1717 root 1w REG 253,0 146 280525 /var/log/messages
# Then logs will go to /var/log/messages as usual.
From the above simulation, we could see after logrotate renames file, but before post-rotate is run (send HUP), logs would send to /var/log/messages.1 during this period.
After post-rotate is finished, logs would then send to /var/log/messages as usual.
Why go to /var/log/messages.1 ?
Before sending HUP to rsyslogd, why would logs go to the renamed file /var/log/messages.1?
Because in that process, the FD hasn’t changed. Let’s do a simple test using python:
## 1. Create an empty file.
~$ touch /tmp/test.txt
## 2. Open a interact python shell, and open the above file.
>>> f = open('/tmp/test.txt', 'w+')
>>> f.write('hehe1\n')
>>> f.flush()
## 3. We can see this FD using lsof. (here FD=3)
~$ lsof | grep /tmp/test.txt
python 2868 feichashao 3u REG 8,1 xxx 8391852 /tmp/test.txt
~$ cat /tmp/test.txt
hehe1
## 4. Rename this file. (the corresponding FD still remain 3)
~$ mv /tmp/test.txt /tmp/test1.txt
~$ lsof | grep /tmp/test1.txt
python 2868 feichashao 3u REG 8,1 xxx 8391852 /tmp/test1.txt
## 5. Append something, the string would be written to /tmp/test1.txt
>>> f.write('hehe2\n')
>>> f.flush()
~$ cat /tmp/test1.txt
hehe1
hehe2