64

I have a crontab like this on a LAMP setup:

0 0 * * * /some/path/to/a/file.php > $HOME/cron.log 2>&1

This writes the output of the file to cron.log. However, when it runs again, it overwrites whatever was previously in the file.

How can I get cron to output to a file with a timestamp in its filename?

An example filename would be something like this: 2010-02-26-000000-cron.log

I don't really care about the format, as long as it has a timestamp of some kind.

Thanks in advance.

Philip Morton
  • 763
  • 1
  • 5
  • 7

6 Answers6

117

Try:

0 0 * * * /some/path/to/a/file.php > $HOME/`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1

Play around with the date format, if you like; just be sure to escape any % like \%, as above.

fission
  • 3,506
  • 2
  • 20
  • 27
  • 1
    And let me generally suggest an approach to file names like `0 0 * * * /some/path/to/a/file.php > $HOME/scriptname-`date +\%Y\%m\%d\%H\%M\%S`.log` – Kristian Oct 17 '15 at 11:14
  • If you need it a little more human readable try: `date +\%Y\ \%m\ \%d\ \%H:\%M:\%S`-cron.log – DevilCode Apr 04 '16 at 13:35
  • 8
    @DevilCode, yes, although spaces in filenames aren't very conventional in Unix. Hyphens or underscores might be a better option: `date +\%Y-\%m-\%d_\%H:\%M:\%S-cron.log`. – fission Apr 04 '16 at 23:47
  • 3
    Those freaking escape characters always get me. Thanks for the reminder! – Tony-Caffe Oct 08 '19 at 00:21
  • 1
    This Note saved my life. "Play around with the date format, if you like; just be sure to escape any % like \%, as above." – khalidmehmoodawan Jul 14 '22 at 10:18
17

I would highly recommend that you save everything into the same file, using timestamp, as explained on Abdullah Diab’s Blog.

remove

2>&1

... and run it through the timestamping script before saving it to log file.

timestamp.sh script:

#!/bin/bash
while read x; do
    echo -n `date +%d/%m/%Y\ %H:%M:%S`;
    echo -n " ";
    echo $x;
done

Remember to chmod +x timestamp.sh to make it executable.

Then edit the cron job line using crontab -e to be like this:

/path/to/my/command.sh 2>&1 | /path/to/timestap.sh >> /var/log/cron/my_log.log
sysadmin1138
  • 131,083
  • 18
  • 173
  • 296
tony gil
  • 299
  • 2
  • 6
7

You can also append your output to the log file by doing it like this:

0 0 * * * /some/path/to/a/file.php >> $HOME/cron.log 2>&1
Dennis Williamson
  • 60,515
  • 14
  • 113
  • 148
2

I modified the script like this:

`/bin/date +\%Y\%m\%d`.log
Nisse Engström
  • 208
  • 2
  • 5
Ardhy
  • 21
  • 1
-1

I solved this problem; just add the date path (/bin/date) before the date command.

-1
@daily /some/path/to/a/file.php 2>&1 > $HOME/$(date +\%Y\%m\%d\%H\%M\%S)-cron.log
Ivan Kovtun
  • 111
  • 1