需求:實現logback日誌寫入數據庫,而且logback關於數據庫連接使用yml已有的數據源信息
在logback.xml改造以下spring
<!-- 將日誌存儲到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 參數。
相似oracle
<springProperty scope="context" name="dataUrl" source="spring.datasource.username" defaultValue="localhost"/>
但實驗了不少次,未成功,不知道爲什麼。因此採起修改DriverManagerConnectionSource源碼的方式去解決。app
查看源碼發現下圖設計的源碼存在建立conn 的狀況,因此已後面的代碼形式去讀取yml,數據庫鏈接的相關參數便可。
兩種代碼都能解決。url
//讀取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);