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

如何按文件大小而不是日期旋转Tomcat访问日志文件,tomcat,logging,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 ="fa

目前我的访问日志文件(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"/>

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

默认情况下,Tomcat不支持按大小旋转文件,您可以自己修改$Tomcat_HOME/conf/logging.properties。请参阅或其他文章

2017年8月30日更新 解决方案是使用Tomcat阀芯。下面是使用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());
    }
}

我在Tomcat v8.5.20中测试了它,但在阅读了org.apache.catalina.valves.AccessLogValve的源代码后,它也可以在6.x/7.x/8.x上运行。访问日志不是通过日志API写入的,因此更改日志配置不起作用。请参考更新的答案。谢谢beckyang。它正在工作。@beckyang在你的答案中你定义了公共方法AL。它正确吗?因为我得到的错误是缺少返回类型。它不适用于tomcat 8.5.20。我不知道我的代码出了什么问题。@Hkachhia,我在tomcatv8.5.20中测试后更正了答案中的一些错误。如果TOMCAT启动后不存在
%TOMCAT\u HOME/logs/access\u log.txt
,请验证
9access.java.util.logging.FileHandler
是否已添加到
%TOMCAT\u HOME/conf/logging.properties
中的
处理程序中。
#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