【问题标题】:Springboot to store logs in h2-DB: Logback configuration error detectedSpringboot 将日志存储在 h2-DB 中:检测到 Logback 配置错误
【发布时间】:2020-01-03 04:26:24
【问题描述】:

我正在尝试实现一个POC,它使用 Springboot 将日志存储在数据库(H2-Db)中。我浏览了一些文件,最后找到了一个有合适细节的网站(https://medium.com/@chakrar27/storing-log-data-in-postgresql-using-logback-db-appender-292891a9918)。我按照该链接中提到的步骤操作,但收到 Logback configuration error detected 错误消息。以下是完整的错误信息。

Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.spi.Interpreter@1:66 - no applicable action for [appender], current ElementPath  is [[appender]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@3:62 - no applicable action for [connectionSource], current ElementPath  is [[appender][connectionSource]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:14 - no applicable action for [driverClass], current ElementPath  is [[appender][connectionSource][driverClass]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@5:6 - no applicable action for [url], current ElementPath  is [[appender][connectionSource][url]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@6:7 - no applicable action for [user], current ElementPath  is [[appender][connectionSource][user]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@7:11 - no applicable action for [password], current ElementPath  is [[appender][connectionSource][password]]
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:222)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:73)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118)
at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313)
at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:288)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:246)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:223)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at com.springboot.log.db.SpringbootLogDbApplication.main(SpringbootLogDbApplication.java:10)

下面是我的代码-sn-p:

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
    <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
        <driverClass>org.h2.Driver</driverClass>
        <url>jdbc:h2:mem:testdb</url>
        <user>sa</user>
        <password>password</password>
    </connectionSource>
</appender>

application.properties:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Enabling H2 Console
spring.h2.console.enabled=true
# Custom H2 Console URL
spring.h2.console.path=/h2
# create database schema from SQL files
spring.jpa.hibernate.ddl-auto=create

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.springboot.log.db</groupId>
<artifactId>springboot-log-db</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-log-db</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.0.13</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
</project>

【问题讨论】:

    标签: spring-boot logging h2 logback


    【解决方案1】:

    我通过更新 logback.xml 文件和在 H2-DB 中创建表解决了这个问题

    logback.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
            <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
                <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
                <encoder>
                    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
                    </pattern>
                </encoder>
            </appender>
            <appender name="db" class="ch.qos.logback.classic.db.DBAppender">
                <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
                    <driverClass>org.h2.Driver</driverClass>
                    <url>jdbc:h2:mem:testdb</url>
                    <user>sa</user>
                    <password>password</password> <!-- no password -->
                </connectionSource>
            </appender>
    
    <!-- the level of the root level is set to DEBUG by default. -->
        <root level="INFO">
            <appender-ref ref="stdout" />
            <appender-ref ref="db" />
        </root>
    </configuration>
    

    H2-DB 中的表:

    CREATE TABLE logging_event (
    timestmp BIGINT NOT NULL,
    formatted_message LONGVARCHAR NOT NULL,
    logger_name VARCHAR(256) NOT NULL,
    level_string VARCHAR(256) NOT NULL,
    thread_name VARCHAR(256),
    reference_flag SMALLINT,
    arg0 VARCHAR(256),
    arg1 VARCHAR(256),
    arg2 VARCHAR(256),
    arg3 VARCHAR(256),
    caller_filename VARCHAR(256), 
    caller_class VARCHAR(256), 
    caller_method VARCHAR(256), 
    caller_line CHAR(4),
    event_id IDENTITY NOT NULL);
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 2021-05-01
      • 2017-10-07
      • 1970-01-01
      • 2022-01-23
      • 2018-03-27
      • 2018-10-20
      • 2016-12-08
      • 2012-06-25
      相关资源
      最近更新 更多