ejabberd icon indicating copy to clipboard operation
ejabberd copied to clipboard

`ejabberdctl start` nukes old logs

Open catap opened this issue 4 months ago • 2 comments

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$

catap avatar Aug 22 '25 15:08 catap

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...

badlop avatar Aug 23 '25 15:08 badlop

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?

prefiks avatar Aug 27 '25 11:08 prefiks