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?
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 "%r" %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 "%r" %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.
Just so you know, I ended up replacing the default Tomcat logging (java.util.logging) with Log4J following the instructions on the Tomcat website: http://tomcat.apache.org/tomcat-6.0-doc/logging.html#Using_Log4j
This should be easy on Tomcat 7: see this docs
renameOnRotate attribute
By default for a rotatable log the active access log file name will
contain the current timestamp in fileDateFormat. During rotation the
file is closed and a new file with the next timestamp in the name is
created and used. When setting renameOnRotate to true, the timestamp
is no longer part of the active log file name. Only during rotation
the file is closed and then renamed to include the timestamp. This is
similar to the behavior of most log frameworks when doing time based
rotation. Default value: false