Spring Boot中Servlet独立端口注册及日志无输出问题排查
解决Spring Boot中自定义Servlet独立端口及日志不输出问题
先来解决最直观的日志不打印问题,再搞定多端口的配置:
一、为什么日志没输出?
大概率是你的ServletConfig没被Spring Boot正确加载,或者日志配置有问题:
1. 检查Spring组件扫描范围
Spring Boot主类的@SpringBootApplication默认只扫描主类所在包及其子包。如果你的ServletConfig在这个范围外,Spring不会加载这个配置类,自然不会执行里面的代码,日志也就打不出来。
- 解决办法:要么把
ServletConfig移到主类的包/子包下,要么在主类上加上@ComponentScan(basePackages = "com.your.servlet.package")(替换成你的Servlet配置类所在包路径)。
2. 检查日志配置
确保你已经正确配置了目标类的日志级别:
在application.properties里添加:
# 替换成你的ServletConfig和MyServlet所在的包路径 logging.level.com.yourpackage=INFO
如果用application.yml:
logging: level: com.yourpackage: INFO
另外,Spring Boot默认集成SLF4J+Logback,只要你没手动排除相关依赖,基础日志功能是正常的;如果自己替换了日志实现,要确保依赖引入正确。
二、让自定义Servlet跑在独立端口
Spring Boot默认只有一个Web服务器实例(比如Tomcat),只能绑定一个端口。要让Servlet和@RestController用不同端口,需要启动第二个Web服务器,专门处理你的Servlet请求:
1. 配置自定义端口
先在application.properties里添加自定义Servlet的端口:
# 默认RestController的端口(默认8080,可按需修改) server.port=8080 # 自定义Servlet的独立端口 custom.servlet.port=8081
2. 创建第二个Web服务器配置
新建一个配置类,注册独立的ServletWebServerFactory,并把你的MyServlet绑定到这个服务器上:
@Configuration public class CustomServletServerConfig { private static final Logger LOGGER = LoggerFactory.getLogger(CustomServletServerConfig.class); @Value("${custom.servlet.port}") private int customPort; @Bean public ServletWebServerFactory customServletServer() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.setPort(customPort); // 把自定义Servlet注册到这个独立服务器 factory.addServletRegistrations(servletRegistrationBean()); LOGGER.info("自定义Servlet服务器启动,端口:{}", customPort); return factory; } private ServletRegistrationBean<MyServlet> servletRegistrationBean() { ServletRegistrationBean<MyServlet> bean = new ServletRegistrationBean<>(new MyServlet(), "/endpoint"); bean.setLoadOnStartup(1); LOGGER.info("MyServlet已注册到自定义端口的服务器"); return bean; } }
注意:原来的
ServletConfig可以删除了,因为我们把Servlet注册逻辑移到了这个新配置类里,专门绑定到第二个独立服务器。
3. 验证效果
启动应用后,你会看到两个服务器启动的日志:
- 默认端口8080:处理你的
@RestController接口请求 - 自定义端口8081:处理
/endpoint的POST请求(对应你的MyServlet)
三、额外注意点
- 确保
MyServlet的依赖类(AbstractXServlet、ServletHandlerr)逻辑正常:这些自定义类的初始化和请求处理逻辑如果有问题,即使Servlet注册成功也可能无法正常工作。 - 如果用Jetty替代Tomcat,只需把
TomcatServletWebServerFactory换成JettyServletWebServerFactory即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者AR17
相关产品推荐
相关产品推荐

