Tomcat日志中静态资源加载问题解析
一 常见现象与日志特征
二 快速排查步骤
*.html,*.css,*.js),或在 Spring 配置中使用mvc:resources或mvc:default-servlet-handler/**放行静态资源。${pageContext.request.contextPath}/static/main.js),或将应用部署到webapps/ROOT以使用根路径。三 配置与代码修复示例
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<mvc:resources mapping="/static/**" location="/static/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:default-servlet-handler/>
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType image/jpeg</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.png</url-pattern>
</filter-mapping>
<Connector port="8080" protocol="HTTP/1.1"
compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json"
compressionMinSize="1024" />
<Resources cachingAllowed="true" cacheMaxSize="100000" />
四 用日志定位性能瓶颈与优化闭环
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="static_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D %{If-Modified-Since}i %{Cache-Control}o" />
awk '$10 > 500000 {print $7, $10/1000000 "s"}' static_access_log.2025-09-15.txt | sort -k2 -nr
awk '{print $7}' static_access_log.2025-09-15.txt | sort | uniq -c | sort -nr | head -10
awk 'BEGIN {total=0; cached=0} {total++; if($9 == 304 || ($9 == 200 && $8 == 0)) cached++} END {printf "缓存命中率: %.2f%%\n", (cached/total)*100}' static_access_log.2025-09-15.txt