`ejabberdctl start` nukes old logs
Environment
- ejabberd version: 25.08
- Erlang version:
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 15.2.6 - OS: Linux OpenBSD
- Installed from: distro package
Configuration (only if needed): grep -Ev '^$|^\s*#' ejabberd.yml
loglevel: info
log_rotate_size: infinity
log_rotate_count: 10
Errors from error.log/crash.log
No errors
Bug description
When I start ejabberd via ejabberdctl start it remoes all old log files:
mx2$ ls -l /var/log/ejabberd/
total 528
-rw-r--r-- 1 _ejabberd _ejabberd 23210 Aug 22 17:46 ejabberd.log
-rw-r--r-- 1 _ejabberd _ejabberd 26588 Aug 22 15:00 ejabberd.log.0.gz
-rw-r--r-- 1 _ejabberd _ejabberd 28603 Aug 21 15:00 ejabberd.log.1.gz
-rw-r--r-- 1 _ejabberd _ejabberd 26600 Aug 20 15:00 ejabberd.log.2.gz
-rw-r--r-- 1 _ejabberd _ejabberd 30291 Aug 19 15:00 ejabberd.log.3.gz
-rw-r--r-- 1 _ejabberd _ejabberd 28371 Aug 18 15:00 ejabberd.log.4.gz
-rw-r--r-- 1 _ejabberd _ejabberd 26942 Aug 17 15:00 ejabberd.log.5.gz
-rw-r--r-- 1 _ejabberd _ejabberd 33254 Aug 16 15:00 ejabberd.log.6.gz
-rw-r--r-- 1 _ejabberd _ejabberd 215 Jun 27 05:47 error.log
mx2$ doas ejabberdctl stop
mx2$ ls -l /var/log/ejabberd/
total 544
-rw-r--r-- 1 _ejabberd _ejabberd 25111 Aug 22 17:47 ejabberd.log
-rw-r--r-- 1 _ejabberd _ejabberd 26588 Aug 22 15:00 ejabberd.log.0.gz
-rw-r--r-- 1 _ejabberd _ejabberd 28603 Aug 21 15:00 ejabberd.log.1.gz
-rw-r--r-- 1 _ejabberd _ejabberd 26600 Aug 20 15:00 ejabberd.log.2.gz
-rw-r--r-- 1 _ejabberd _ejabberd 30291 Aug 19 15:00 ejabberd.log.3.gz
-rw-r--r-- 1 _ejabberd _ejabberd 28371 Aug 18 15:00 ejabberd.log.4.gz
-rw-r--r-- 1 _ejabberd _ejabberd 26942 Aug 17 15:00 ejabberd.log.5.gz
-rw-r--r-- 1 _ejabberd _ejabberd 33254 Aug 16 15:00 ejabberd.log.6.gz
-rw-r--r-- 1 _ejabberd _ejabberd 215 Jun 27 05:47 error.log
mx2$ doas ejabberdctl start
mx2$ ls -l /var/log/ejabberd/
total 80
-rw-r--r-- 1 _ejabberd _ejabberd 25351 Aug 22 17:47 ejabberd.log
-rw-r--r-- 1 _ejabberd _ejabberd 215 Jun 27 05:47 error.log
mx2$
This is reproducible in ejabberd 25.08, also 24.02 and probably any older releases that use logger instead of lagger.
Reproduction steps:
make relive
# press control+g and q
cd _build/relive
./ejabberdctl start && ./ejabberdctl started
./ejabberdctl stop && ./ejabberdctl stopped
(cd logs; cp ejabberd.log ejabberd.log.0.gz; ls)
# It shows: ejabberd.log ejabberd.log.0.gz error.log
echo "log_rotate_size: infinity" >> conf/ejabberd.yml
./ejabberdctl start && ./ejabberdctl started
ls logs
./ejabberdctl stop && ./ejabberdctl stopped
# It shows: ejabberd.log error.log
The value of ejabberd's option log_rotate_size is passed to Logger's option max_no_bytes.
Logger is implemented in the Kernel library in OTP, seems it was first announced in Kernel 6.3 (included in Erlang/OTP 21.3)
The option max_no_bytes is documented in
https://www.erlang.org/docs/28/apps/kernel/logger_std_h.html#content
https://www.erlang.org/docs/28/apps/kernel/logger_disk_log_h.html#content
I couldn't find any explicit mention in the documentation that the old log files are removed. Maybe it makes sense somehow or is implicit after reading how the feature works...
Looks like its explicit action in logger: https://github.com/erlang/otp/blob/master/lib/kernel/src/logger_std_h.erl#L707C18-L707C26 and looks like it was here from start. I also don't see any flag that could change that. Maybe worth filling bug in otp?