GVKun编程网logo

您如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到stdout?(springboot内嵌tomcat启动原理)

6

对于您如何告诉SpringBoot将嵌入式Tomcat的访问日志发送到stdout?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解springboot内嵌tomcat启动原理,并且为您提供

对于您如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到stdout?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解springboot内嵌tomcat启动原理,并且为您提供关于java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确、java – spring-boot w /嵌入式tomcat不会向控制器发送请求、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat的宝贵知识。

本文目录一览:

您如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到stdout?(springboot内嵌tomcat启动原理)

您如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到stdout?(springboot内嵌tomcat启动原理)

在独立的Spring Boot Web应用程序(可执行jar)中,如何告诉Spring
Boot我们希望将嵌入式Tomcat实例的HTTP访问日志发送到stdout?

答案1

小编典典

如果使用Logback,则可以使用logback-access。

添加依赖 ch.qos.logback:logback-access

可选的Javaconfig添加TeeFilter(请求和响应日志记录):

@Bean(name = "TeeFilter")public Filter teeFilter() {    return new ch.qos.logback.access.servlet.TeeFilter();}

嵌入式tomcat的Javaconfig:

@Beanpublic EmbeddedServletContainerFactory servletContainer() {    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();    // put logback-access.xml in src/main/resources/conf    tomcat.addContextValves(new LogbackValve());    return tomcat;}

的内容logback-access.xml(保存在中src/main/resources/conf

<configuration>  <appender name="STDOUT">    <encoder>      <Pattern>combined</Pattern>      <Pattern>%fullRequest%n%n%fullResponse</Pattern>    </encoder>  </appender>  <appender-ref ref="STDOUT" /></configuration>

java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确

java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确

更新 – >添加Security.addProvider(new BouncyCastleProvider());解决了这个问题

将ActiveMQ broker添加到我的配置中会导致以下错误.如果我删除了JMS配置,则此错误消失.

java.security.UnrecoverableKeyException: Failed to decrypt safe contents entry:
    javax.crypto.BadPaddingException: pad block corrupted

Spring Boot 2.1.1.RELEASE
嵌入式Tomcat与SSL
ActiveMQ的
@EnableJMS

更新:我从应用程序中删除了我的JMSConfiguration.class,一切都开始工作了. @EnableJMS必须做一些覆盖某事的事情.我将系统地评论该配置类中的bean,直到找到确切的罪魁祸首.我从未想过我的JMS Active MQ配置会与我的嵌入式Tomcat服务器的SSL配置发生冲突.

我已将其缩小到以下与原因相关的JMS相关bean.如果我完全摆脱了JMS配置,那么我不会得到密码错误.看起来这些东西是无关的,但它们是某种程度的.

@Bean
public brokerService broker() throws Exception {
    final brokerService broker = new brokerService();

使用下面的配置,我在启动Spring Boot时出错.如果我删除所有的@Configuration类并启动Spring Boot,这个配置工作正常.我已经尝试过PKCS,JKS和我尝试过的文件:我已经移动了文件,没有任何乐趣.我知道密码是正确的,因为它会正常启动,如果我删除我的配置类,我可以使用443 / ssl命中服务器…

server.contextpath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store:classpath:local-keystore.jks
server.ssl.key-store-password:password
server.ssl.keyStoreType:JKS
server.ssl.keyAlias:tomcat

遇到错误

org.apache.catalina.LifecycleException: Protocol handler start Failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1001)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPrevIoUslyRemovedConnectors(TomcatWebServer.java:259)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:311)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:164)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at com.jjkane.Application.main(Application.java:65)
Caused by: java.lang.IllegalArgumentException: keystore password was incorrect
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224)
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1067)
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1149)
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:561)
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:998)
    ... 14 common frames omitted
Caused by: java.io.IOException: keystore password was incorrect
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2108)
    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243)
    at java.base/java.security.KeyStore.load(KeyStore.java:1479)
    at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:179)
    at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)
    at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:203)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112)
    ... 20 common frames omitted
 java.security.UnrecoverableKeyException: Failed to decrypt safe contents entry:
        javax.crypto.BadPaddingException: pad block corrupted

更新:此修改后出现相同的错误…

server.contextpath=/my
server.tomcat.additional-tld-skip-patterns=*.jar
server.compression.enabled=true
server.port=443
server.ssl.key-store=classpath:local-keystore.p12
server.ssl.key-store-password=tomcat
server.ssl.key-password=tomcat
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat

解决方法

您可能正在使用JDK 8u161之前的Java版本,在这种情况下,可以通过将Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files添加到Java的安装来解决此异常.当使用更长的密钥大小完成加密/解密时,通常会出现问题.充气城堡也是这个问题的解决方案.
有关JCE文件的更多详细信息,请参阅oracle站点 https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

另一种解决方案是将您的java升级到上述或更高版本.

java – spring-boot w /嵌入式tomcat不会向控制器发送请求

java – spring-boot w /嵌入式tomcat不会向控制器发送请求

我有一个使用 spring-boot和嵌入式Tomcat容器的应用程序.

据我所知,我的代码与spring-boot sample project相同.但是,当我运行测试时,我得到一个404而不是200(在我尝试发布的情况下,而不是收到一个405,与Tomcat正确设置一致):

Failed tests:
UserControllerTest.testMethod:45 Status expected:<200> but was:<404>

我的基于Java的配置(省略了一些配置类):

@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({ ServiceConfig.class,DefaultRepositoryConfig.class })
public class ApplicationConfig {

    private static Log logger = LogFactory.getLog(ApplicationConfig.class);

    public static void main(String[] args) {
        SpringApplication.run(ApplicationConfig.class);
    }

    @Bean
    protected servletcontextlistener listener() {
        return new servletcontextlistener() {
            @Override
            public void contextinitialized(ServletContextEvent sce) {
                logger.info("ServletContext initialized");
            }

            @Override
            public void contextDestroyed(ServletContextEvent sce) {
                logger.info("ServletContext destroyed");
            }
        };
    }
}

UserController.java:

@RestController
@RequestMapping("/")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<String> testMethod() {
        return new ResponseEntity<>("Success!",HttpStatus.OK);
    }
}

UserControllerTest.java:

RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfig.class})
public class UserControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private mockmvc mockmvc;

    @Before
    public void setUp() throws Exception {
        this.mockmvc = mockmvcBuilders.webAppContextSetup(this.webApplicationContext).build();
    }

    @Test
    public void testMethod() throws Exception {
        this.mockmvc.perform(get("/")).andExpect(status().isOk());
    }
}

有没有什么基本的我失踪了?我没有提供自己的Mvc配置,我没有碰到Spring MVC dispatcherServlet,所以我认为spring-boot会自动配置Tomcat.

解决方法

结果是组件扫描配置的问题.即使使用了@ComponentScan注释,控制器也在一个单独的包中,所以Spring从未将它包含在调度程序中.

添加@ComponentScan(basePackages =“com.my.controller”))解决了我的问题.

Spring Boot-替换默认的嵌入式Tomcat连接器

Spring Boot-替换默认的嵌入式Tomcat连接器

我需要将AJP连接器添加到嵌入式Tomcat并 禁用(或替换) 侦听8080 的默认连接器

我尝试使用EmbeddedServletContainerCustomizer对此进行自定义,但是我无法获得Tomcat对象的句柄来替换在那里创建的默认连接器。结果,除了AJP端口之外,我最终还使用了8080上的http端口。

接下来,我尝试扩展TomcatEmbeddedServletContainerFactory并覆盖其getTomcatEmbeddedServletContainer方法。对于JavaDoc,这似乎是替换默认连接器的理想之地,但最终仍被启用(也不会创建我的AJP连接器)。有什么想法可能会丢失吗?我已经通过调试器验证了我的配置正在运行。

根据下面的答案,这是最干净的解决方案:

@Bean
public EmbeddedServletContainerFactory tomcat() {
    TomcatEmbeddedServletContainerFactory myFactory = new TomcatEmbeddedServletContainerFactory();
    myFactory.setProtocol("AJP/1.3");
    myFactory.setPort(9000);
    return myFactory;
}

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer2() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                    connector.setRedirectPort(9001);
                }
            });
        }
    };
}

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

Spring Boot启用/禁用带有配置文件的嵌入式Tomcat

我正在编写一个Spring
Boot应用程序,该应用程序使用几个@Configuration类之一,具体取决于文件中@Profile设置的类application.properties

这些配置类之一使用REST接口,因此,我将其包括spring-boot-starter-web为依赖项。

这将启动嵌入式Tomcat实例,这很好。

问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入消息而不是REST)。

有没有什么方法可以阻止@SpringBootApplicationTomcat在默认情况下启动,而仅将其用于REST
Configuration类?例如,通过用@EnableWebMVC

这是我的@Configuration课程的示例:

休息:

@Profile({"REST"})
@Configuration
@EnableWebMvc
public class HttpConfiguration{
 .
 .
 .
}

JMS:

@Profile({"JMS"})
@Configuration
@EnableJms
public class JMSConfiguration{
 .
 .
 .
}

谢谢

关于您如何告诉Spring Boot将嵌入式Tomcat的访问日志发送到stdout?springboot内嵌tomcat启动原理的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于java – Spring Boot 2.1嵌入式Tomcat – 密钥库密码不正确、java – spring-boot w /嵌入式tomcat不会向控制器发送请求、Spring Boot-替换默认的嵌入式Tomcat连接器、Spring Boot启用/禁用带有配置文件的嵌入式Tomcat等相关内容,可以在本站寻找。

本文标签: