How to rotate the tomcat localhost log?

teon picture teon · Jun 8, 2011 · Viewed 53.1k times · Source

I am using tomcat 6x in a Linux system. It prints a localhost log file like localhost.2011-06-07, localhost.2011-06-08 on a daily basis. I want to rotate the localhost when it reaches 1MB.

I can rotate log files in log4j for my web apps. But this localhost log file of tomcat, I couldn't get it to rotate. Has any got a solution other than using logrotate?

Answer

Lambart picture Lambart · Jul 31, 2012

Do you not want to use logrotate, or does your sys admin not allow you to?

Given that restriction, I'm afraid (from what I have been able to learn from the documentation) that there is no automatic way to do what you want (rotate log files based on the size alone).

If you merely want to stop Tomcat's default behavior of creating a new log every day (which I find extremely annoying for a development environment or low-traffic site), you can certainly do this by changing the fileDateFormat property of the Access Log "Valve", which on Ubuntu Server is defined in /etc/tomcat7/server.xml. It's probably in a similar location for Tomcat 6.

Since you mention a restrictive sys admin, I gather that this server is not under your control, so that path is irrelevant. If you do have the ability to modify Tomcat's log configuration, hopefully you know where to find the appropriate file.

In that .xml file, look for the Valve entity with className set to "org.apache.catalina.valves.AccessLogValve" in the section which configures the "Catalina" Engine for the appropriate host for your site (localhost in my case). Although the Tomcat 6 documentation doesn't mention it, one can deduce that the default fileDateFormat is "yyyy-MM-dd". Including the day in the log filename tells Tomcat (by implication) that you also want the log rotated every day. If you wanted it to be rotated, say, only once a month, just change the fileDateFormat to "yyyy-MM".

On my server, the default Logging Valve definition was this:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

To change this to monthly log rotation, I would just add the appropriate fileDateFormat attribute:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           fileDateFormat="yyyy-MM" prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

Since I am able (and willing) to use logrotate, I have turned off Tomcat's built-in log rotation and date-based file naming completely, and simply use logrotate to rotate the logs whenever the log reaches 1MB.

Edit To answer dgrant's question, the changes were to /etc/tomcat7/server.xml, and the actual valve configuration I'm using is this:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       pattern="combined" rotatable="false"
       prefix="access_log" />

Note that the 'combined' pattern is equivalent (at least for Tomcat 7) to the explicit pattern definition in the original configuration. All this is well-covered in my original documentation link if you want to read more. Just look for the section on the rotatable attribute.