log rotation tool that keeps only a specified amount of logs and discards everything else

I'm looking for a cronolog-like tool that will keep only last n lines or last x minutes of logs piped to it and discard everything else

Is there such a beast?

UPDATE:

I know about logrotate and it renames and zips old logfiles, which is not what I want.

I want to discard old log lines and keep only recent lines.

Like i.e. doing this every so often: tail -10000 logfile > logfile.new mv logfile.new logfile except that with this technique you will most certainly lose log lines and you have to restart or otherwise signal the logging application to reopen the logfile.


Logrotate can be made to only keep one copy of a logfile... If you RTFM you'll find the following bit regarding configuration settings:

rotate count
    Log files are rotated count times before being removed or mailed to the 
    address specified in a mail directive. If count is  0,  old  versions  
    are  removed  rather than rotated.

You can couple rotate with size, again from the logrotate(8) man page, to keep the file size small. While not by number of lines but by k, M, G size.

size size
    Log  files  are rotated when they grow bigger than size bytes. If size is 
    followed by M, the size if assumed to be in megabytes.  If the G suffix is 
    used, the size  is  in gigabytes.   If  the k is used, the size is in 
    kilobytes. So size 100, size 100k, and size 100M are all valid.

You can use logrotate and put

tail -10000 logfile.0 > logfile.0.new 
mv logfile.0.new > logfile.0

as part of postrotate command. logrotate allows you to specify postrotate commands.