所以请投票给 jpt 的答案。
因为没有“
的提示
<property resource="application.yml" />
”(或该答案中的 .properties),我不会有任何工作。
但我的回答和贡献:我想添加它也适用于 application.yml。
我将尝试列出我在这里所做的一切:
设置3个环境变量。
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USER
SPRING_DATASOURCE_PASSWORD
application.yml 的内容(下)
spring:
datasource:
#SPRING_DATASOURCE_URL environment variable will be something like -> jdbc:sqlserver://MySqlServer\\MyInstance:1433;DatabaseName=MyDbName;
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
logging:
config: classpath:logback-spring.xml
注意,我使用的是“logback-spring.xml”文件。我不确定它是否有所作为(而不是仅仅使用“logback.xml”)
logback-spring.xml 的内容(下)
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<!-- THIS IS THE MAGIC LINE that JPT figured out -->
<property resource="application.yml" />
<springProperty name="humptydumptyurl" source="spring.datasource.url"/>
<springProperty name="humptydumptyusername" source="spring.datasource.username"/>
<springProperty name="humptydumptypassword" source="spring.datasource.password"/>
<appender name = "MyDbAppender" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClass>
<url>${humptydumptyurl}</url>
<user>${humptydumptyusername}</user>
<password>${humptydumptypassword}</password>
</connectionSource>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="MyDbAppender"/>
</root>
</configuration>
注意,我特意使用“humptydumpty”来避免歧义。您可能会使用更好的前缀,但我想显示映射的左侧可以是您想要的任何名称。
注意,我的 application.properties 文件是空的。我是 100% application.yml。
注意,您还可以设置/使用第四个环境变量(我认为它会起作用,我还没有测试过)
SPRING_DATASOURCE_DRIVER-CLASS-NAME
和它的两个伙伴
datasource:
driverClassName: ${SPRING_DATASOURCE_DRIVER-CLASS-NAME}
和
<springProperty name="humptydumptydriverclassname" source="spring.datasource.driver-class-name"/>
......
下面的一些 mssql-server 注释(可能对大多数用户来说并不重要)
我用过
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>7.0.0.jre8</version>
</dependency>
并且让它工作了。
我不得不对我的 DDL 进行一些调整,因为我在 INSERT 上遇到了“截断”错误。
-- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
--
-- The event_id column type was recently changed from INT to DECIMAL(40)
-- without testing.
DROP TABLE logging_event_property
DROP TABLE logging_event_exception
DROP TABLE logging_event
CREATE TABLE logging_event
(
timestmp DECIMAL(20) NOT NULL,
formatted_message VARCHAR(max) NOT NULL,
logger_name VARCHAR(512) NOT NULL,
level_string VARCHAR(512) NOT NULL,
thread_name VARCHAR(512),
reference_flag SMALLINT,
arg0 VARCHAR(512),
arg1 VARCHAR(512),
arg2 VARCHAR(512),
arg3 VARCHAR(512),
caller_filename VARCHAR(512) NOT NULL,
caller_class VARCHAR(512) NOT NULL,
caller_method VARCHAR(512) NOT NULL,
caller_line CHAR(16) NOT NULL,
event_id DECIMAL(38) NOT NULL identity,
PRIMARY KEY(event_id)
)
CREATE TABLE logging_event_property
(
event_id DECIMAL(38) NOT NULL,
mapped_key VARCHAR(512) NOT NULL,
mapped_value VARCHAR(1024),
PRIMARY KEY(event_id, mapped_key),
FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
)
CREATE TABLE logging_event_exception
(
event_id DECIMAL(38) NOT NULL,
i SMALLINT NOT NULL,
trace_line VARCHAR(512) NOT NULL,
PRIMARY KEY(event_id, i),
FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
)
最后,让我给出最重要的调试提示。
首先硬编码您的连接字符串值,让它工作...然后开始插入环境变量替换。
ch.qos.logback.classic.db.DBAppender 必须有一个良好且有效的连接字符串才能进行“检查”.....如果您输入错误的连接字符串,您将收到此类错误(以下)。我花了 4 个小时来追踪错误,这是因为我追踪了下面的错误,只是因为我的连接字符串工作不正常。同样,首先将正确/工作值硬编码到 logback-spring.xml 中,让它工作,然后返回并执行环境变量 spring-properties 替换 voodoo。
所以对于 db-appender,首先硬编码你的 url、用户名、密码,让它工作,然后慢慢开始替换......工作....
06:19:09,721 |-WARN in ch.qos.logback.classic.db.DBAppender[MyDbAppender] - Attempted to append to non started appender [MyDbAppender].
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:202)
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:75)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:347)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
Caused by: java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@68:16 - RuntimeException in Action for tag [appender] java.lang.IllegalStateException: DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method *and* without a specific SQL dialect
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithSpecificConfig(AbstractLoggingSystem.java:67)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:57)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:117)
at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:298)
只是为了完成所有内容的清单。
这些是我使用的 logback 版本:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>