如何按文件大小而不是按日期旋转Tomcat访问日志文件

时间:2016-04-14 05:34:19

标签: tomcat logging

目前我的访问日志文件(access_log.yyyy-MM-dd.log)每天都会生成(大文件),并且每天都在累积。 我希望按文件大小旋转访问日志文件。

我试过:

<Valve className="org.apache.catalina.valves.AccessLogValve"
         directory="${catalina.home}/../logs"  prefix="access_log." suffix=".txt"
         rotatable ="false"
         pattern="common" resolveHosts="false"/>

但它不适用于大小,它只生成一个文件并在同一文件中添加所有日期的日志。 如何按日志文件的大小旋转?

1 个答案:

答案 0 :(得分:2)

默认情况下,Tomcat不支持按大小旋转文件,您可以自己修改 $ TOMCAT_HOME / conf / logging.properties 。请参阅How To Configure Apache Tomcat 6.0/7.0 or tc Server to rotate log files by size with logging.properties或其他文章。

2017/8/30更新

解决方案是实现Tomcat Valve元素。以下是使用java.util.logging API编写访问日志的示例代码:

package org.mylog;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.util.logging.*;

public class CustomAccessLog extends org.apache.catalina.valves.AbstractAccessLogValve {
    public static class NoFormat extends Formatter {
        public synchronized String format(LogRecord record) {
            return record.getMessage();
        }   
    }

    private Logger log = Logger.getLogger("access_log");
    public CustomAccessLog() {
        log = Logger.getLogger("access_log");
        //not required, use the formatter that only print log message.
        Handler[] ha = log.getHandlers();
        for (int i = 0; i < ha.length; i++) {
            ha[i].setFormatter(new NoFormat());
        }
    }
    //@Override
    public void log(CharArrayWriter message) {
        log.info(message.append('\n').toString());
    }
}

将已编译的类打包到jar并将其复制到%TOMCAT_HOME / lib

修改%TOMCAT_HOME / conf / server.xml,替换

  

&lt; Valve className =“org.apache.catalina.valves.AccessLogValve”directory =“logs”... /&gt;

以下一个

  

&lt; Valve className =“org.mylog.CustomAccessLog”pattern =“%h%l%u%t&amp; quot;%r&amp; quot;%s%b”/&gt;

修改%TOMCAT_HOME / conf / logging.properties为CustomAccessLog添加日志配置。

#Remember to add 9access.java.util.logging.FileHandler to "handlers"
#for example:
#handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler, 9access.java.util.logging.FileHandler
9access.java.util.logging.FileHandler.level = FINE
9access.java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
9access.java.util.logging.FileHandler.pattern = ${catalina.base}/logs/access_log.%g.txt
9access.java.util.logging.FileHandler.limit = 1000000
9access.java.util.logging.FileHandler.count = 5
access_log.level = FINE
access_log.handlers = 9access.java.util.logging.FileHandler

我在Tomcat v8.5.20中测试它,但它也适用于6.x / 7.x / 8.x