FreeBSD uses a log rotator called newsyslog.
The following line in /etc/newsyslog.conf appears to do the right thing:
/home/bitcoin/debug.log bitcoin:bitcoin 644 5 100 * JR /home/bitcoin/sighup.sh
The fields are separated by white-space. They are: 'logfile_name', 'owner:group', 'mode', 'count' (number of archives to keep), 'size' (in kb), 'when' (chose anytime), 'flags' (J->Bzip2, R-> Treat next field as as shell command to run), 'path_to_pid_cmd_file' (filename containing daemon's PID, must start with /), 'signal_number' (optional, omitted in example).
I first tried appending "killall -HUP bitcoind" directly, but the arguments were interpreted as an invalid signal number. With the size limited to 100 kB, the logs get rotated every hour (because they they grow faster than that).
sighup.sh is just a simple shell-script:
#!/bin/sh
#Sends bitcoind a Sighup.
killall -HUP bitcoind
I was not able to find any 'copytruncate', setting, but it appears to do the right thing.