需求:實現logback日誌寫入資料庫,並且logback關於資料庫連結使用yml已有的資料來源資訊
在logback.xml改造如下
<!-- 將日誌儲存到oracle資料庫中 -->
<appender name="db-classic-oracle" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
</connectionSource>
</appender>
<!-- 日誌輸出級別 -->
<root level="ERROR">
<appender-ref ref="console" />
<appender-ref ref="db-classic-oracle" />
</root>
正常上述appender部分需要設定資料來源引數,類似
<url>jdbc:oracle:thin:@XX:1521:orcl</url>
<user>d</user>
<password>111111</password>
但這部分內容實際上應用的主yml已經存在,所以想辦法從yml已有的值去替換。logback本身應該能獲取yml 引數。
類似
<springProperty scope="context" name="dataUrl" source="spring.datasource.username"
defaultValue="localhost"/>
但實驗了很多次,未成功,不知道為何。所以採取修改DriverManagerConnectionSource原始碼的方式去解決。
檢視原始碼發現下圖設計的原始碼存在建立conn 的情況,所以已後面的程式碼形式去讀取yml,資料庫連線的相關引數即可。
兩種程式碼都能解決。
//讀取yml的方式1
YamlPropertiesFactoryBean yamlMapFactoryBean = new YamlPropertiesFactoryBean();
yamlMapFactoryBean.setResources(new ClassPathResource("application.yml"));
Properties properties = yamlMapFactoryBean.getObject();
String username1=properties.getProperty("spring.datasource.username");
//讀取yml的方式2
ClassPathResource resource = new ClassPathResource("application.yml");
InputStream inputStream = resource.getInputStream();
Map map = null;
Yaml yaml = new Yaml();
map = (Map) yaml.load(inputStream);