SpringBoot的日志管理

SpringBoot關(guān)于日志的官方文檔

1、簡述

SpringBoot官方文檔關(guān)于日志的整體說明

本博客基于SpringBoot_1.3.6
大家請先簡單看下這篇英文的官方文檔,文中有說 SpringBoot 內(nèi)部日志系統(tǒng)使用的是 Commons Logging 并且 SpringBootJDKLogging , Log4j2(Log4j也是支持的) , Logback 都提供了默認配置,并且如果使用了 Starters ,那么默認使用 Logback
那么什么是這個這個 Starters 呢灶平?大家請看我的pom文件:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lunqi</groupId>
    <artifactId>springbootstart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot</name>
    <description>SpringBootDemo</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <!-- 
            Spring Boot應用啟動器Starter-parent:
            官方推薦
            其中集成了:
            1、使用java6編譯級別
            2箍土、使用utf-8編碼
            3逢享、實現(xiàn)了通用的測試框架 (JUnit, Hamcrest, Mockito).
            4、智能資源過濾
            5吴藻、智能的插件配置(exec plugin, surefire, Git commit ID, shade).
        -->
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
        <relativePath />
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version>
    </properties>
    <dependencies>
        <dependency>
            <!-- 
            Spring Boot應用啟動器Starter-web:
            支持全棧式Web開發(fā)瞒爬,包括Tomcat和spring-webmvc
             -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

簡單的說,只要你的 pom 文件中使用了 spring-boot-starter 就代表著你使用了 SpringBootStarters 。相信各位玩 SpringBoot 的朋友肯定是看到了自己的 pom 文件中有這個了侧但,因為矢空,Starters(啟動器)SpringBoot 最核心的部件之一,沒有了啟動器禀横, SpringBoot 就幾乎廢掉了屁药。

2、使用

SpringBoot 招人喜歡的一大特點就是配置方便燕侠,配置日志的相關(guān)參數(shù)也只需要寫在 application.properties 中就可以了者祖,當然,這僅僅是基本的配置绢彤,如果需要高級的配置,還是需要添加依賴所選擇日志系統(tǒng)的配置文件蜓耻。

SpringBoot官方文檔關(guān)于配置Log級別的說明

官方文檔中有提到茫舶, SpringBootLogging 配置的級別有7個:
** TRACE , DEBUG , INFO , WARN , ERROR , FATAL , OFF **

配置格式:
logging.level.=LEVEL*

舉例:

#root日志以WARN級別輸出
logging.level.root=WARN
#springframework.web日志以DEBUG級別輸出
logging.level.org.springframework.web=DEBUG
#hibernate日志以ERROR級別輸出
logging.level.org.hibernate=ERROR

在進行了這樣的配置后,就可以在控制臺打印Log信息了刹淌!

但是很有人又會問了饶氏,在生產(chǎn)環(huán)境中,日志往往要以文件形式存放到本地有勾,那么 SpringBoot 的默認配置文件能夠?qū)崿F(xiàn)嗎疹启?答案是可以的,我們繼續(xù)看官方文檔:

文檔中對 SpringBoot 日志的文件輸出有明確的說明蔼卡,上面說到:
在默認情況下喊崖,SpringBoot僅僅在控制臺打印log信息的,如果我們需要將log信息記錄到文件雇逞,那么就需要在 application.properties 中配置 logging.file 或者 logging.path注意啊荤懂,是或者,不是并且塘砸!
而且官方文檔有明確說明节仿,配置 logging.file 的話是可以定位到自定義的文件的,使用 logging.path 的話掉蔬,日志文件將使用 spring.log 來命名廊宪。
而且日志文件會在10Mb大小的時候被截斷,產(chǎn)生新的日志文件女轿,默認級別為:ERROR箭启、WARN、INFO

這時候又會有很多同學問了谈喳,那如果我要自定義輸出格式怎么辦呢册烈?其實在 application.properties 也是可以辦到的。繼續(xù)看官方文檔:

SpringBoot官方文檔關(guān)于日志配置的說明

但是要注意:這兩個配置項是只對默認的日志系統(tǒng)Logback起作用的

舉例(application.properties):

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.file=/log/log/my.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

結(jié)果(Console部分):

2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'systemEnvironment': no URL paths identified
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry': no URL paths identified
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'messageSource': no URL paths identified
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'servletContext': no URL paths identified
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'contextParameters': no URL paths identified
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'contextAttributes': no URL paths identified
2016/09/22-17:36:06 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36:06 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver- Looking for exception mappings: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@15ef3ab: startup date [Thu Sep 22 17:36:04 GMT+08:00 2016]; root of context hierarchy
2016/09/22-17:36:06 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.resource.ResourceUrlProvider- Looking for resource handler mappings
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.resource.ResourceUrlProvider- Found resource handler mapping: URL pattern="/**/favicon.ico", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@b1df4d]
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.resource.ResourceUrlProvider- Found resource handler mapping: URL pattern="/webjars/**", locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@164e13b]
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.servlet.resource.ResourceUrlProvider- Found resource handler mapping: URL pattern="/**", locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@1fefcb1]
2016/09/22-17:36:06 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding [server.ports] PropertySource with highest search precedence

結(jié)果(File部分):

2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry': no URL paths identified
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'messageSource': no URL paths identified
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'servletContext': no URL paths identified
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'contextParameters': no URL paths identified
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'contextAttributes': no URL paths identified
2016/09/22-17:36 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver- Looking for exception mappings: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@15ef3ab: startup date [Thu Sep 22 17:36:04 GMT+08:00 2016]; root of context hierarchy
2016/09/22-17:36 [main] INFO  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping- Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016/09/22-17:36 [main] DEBUG org.springframework.web.servlet.resource.ResourceUrlProvider- Looking for resource handler mappings

好了,這時候大家已經(jīng)對 application.properties 中配置Log有了了解赏僧,但是這時候又會發(fā)現(xiàn)一個問題大猛, application.properties 中的配置有的時候不能滿足我們的要求,或者我們要使用其他的集成進SpringBoot的日志系統(tǒng)淀零,該怎么辦呢挽绩?官方文檔又給了我們答案:

SpringBoot官方文檔關(guān)于使用指定日志配置的說明

我們能從中知道:
1.通過將適當?shù)膸焯砑拥絚lasspath,可以激活各種日志系統(tǒng)驾中。然后在 classpath 的根目錄 (root) 或通過 Spring Environmentapplication.properties)的 logging.config 屬性指定的位置提供一個合適的配置文件來達到進一步的定制(注意由于日志是在ApplicationContext被創(chuàng)建之前初始化的唉堪,所以不可能在Spring的@Configuration文件中,通過@PropertySources控制日志肩民。系統(tǒng)屬性和平常的Spring Boot外部配置文件能正常工作)唠亚。
2.如果我們使用指定日志系統(tǒng)的配置文件, application.properties 中相關(guān)的日志配置是可以不要的持痰。
3.支持的三種日志系統(tǒng)( Logback , Log4j2Log4j 也是支持的), JDKLogging )所識別的配置文件名灶搜。

好了,接下來我們就要學習如何在 SpringBoot 中玩這些指定的日志系統(tǒng)了工窍。

3割卖、擴展

#######3.1使用Logback的指定配置文件實現(xiàn)更高級的日志配置:
如果我們的確要使用 Logback 的指定配置文件的話,那么說明 application.properties 中的配置功能已經(jīng)不滿足我們需求了患雏,所以 application.properties 中關(guān)于日志記錄的可以不要了鹏溯,因為我們啟用了 Logback 自己的配置文件,啟用的方式很簡單淹仑,在 classpathresources 下新建 logback.xml 文件丙挽。這樣就可以了。
具體配置和說明這里有個簡單的介紹:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- 控制臺打印日志的相關(guān)配置 --> 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- 日志格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern>
    </encoder>
    <!-- 日志級別過濾器 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 過濾的級別 -->
      <level>WARN</level>
      <!-- 匹配時的操作:接收(記錄) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配時的操作:拒絕(不記錄) -->
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
  
  <!-- 文件保存日志的相關(guān)配置 --> 
  <appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <!-- 保存日志文件的路徑 -->
    <file>/logs/error.log</file>
    <!-- 日志格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
    </encoder>
    <!-- 日志級別過濾器 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!-- 過濾的級別 -->
      <level>ERROR</level>
      <!-- 匹配時的操作:接收(記錄) -->
      <onMatch>ACCEPT</onMatch>
      <!-- 不匹配時的操作:拒絕(不記錄) -->
      <onMismatch>DENY</onMismatch>
    </filter>
    <!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志文件名格式 -->
      <fileNamePattern>error.%d{yyyy-MM-dd}.log</fileNamePattern>
      <!-- 最大保存時間:30天-->
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>
  
  <!-- 基于dubug處理日志:具體控制臺或者文件對日志級別的處理還要看所在appender配置的filter取试,如果沒有配置filter,則使用root配置 -->
  <root level="debug">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="ERROR-OUT" />
  </root>
</configuration>

#######3.2使用Log4j的指定配置文件實現(xiàn)更高級的日志配置:
1.更改pom文件:
在創(chuàng)建 SpringBoot 工程時怀吻,我們引入了 spring-boot-starter瞬浓,其中包含了 spring-boot-starter-logging ,該依賴內(nèi)容就是 SpringBoot 默認的日志框架 Logback 蓬坡,所以我們在引入 log4j 之前猿棉,需要先排除該包的依賴,再引入 log4j 的依賴屑咳。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

之后我們可以使用 application.properties萨赁,其中的配置項之前有說,同樣也是適用 Log4J 的兆龙。
如果需要更高級的配置選擇杖爽,必須要添加 Log4j 的配置文件了。我們在 classpathresources下新建 log4j.properties 文件,這里簡單示例一下:

# 日志級別慰安,日志追加程序列表...
log4j.rootLogger=DEBUG,ServerDailyRollingFile,stdout
#文件保存日志
log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
#文件保存日志日期格式
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd_HH
#文件保存日志文件路徑
log4j.appender.ServerDailyRollingFile.File=/mnt/lunqi/demo/log4j.log
#文件保存日志布局程序
log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
#文件保存日志布局格式
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
#文件保存日志需要向后追加(false是測試的時候日志文件就清空腋寨,true的話就是在之前基礎(chǔ)上往后寫)
log4j.appender.ServerDailyRollingFile.Append=false
#控制臺日志
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#控制臺日志布局程序
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#控制臺日志布局格式
log4j.appender.stdout.layout.ConversionPattern=%d yyyy-MM-dd HH:mm:ss %p [%c] %m%n

#######3.3使用Log4j2的指定配置文件實現(xiàn)更高級的日志配置:
1.更改pom文件:
跟引入Log4j一樣,我們也需要排除 spring-boot-starter-logging 化焕,再引入Log4j2的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2.跟Log4j一樣萄窜,我們可以使用 application.properties ,如果需要更高級的配置選擇撒桨,必須要添加 Log4j2 的配置文件了查刻。我們在 classpathresources下新建** log4j2.xml** 文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration> 
    <appenders> 
        <Console name="Console" target="SYSTEM_OUT"> 
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> 
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </Console>
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </File> 
        <RollingFile name="RollingFile" fileName="logs/spring.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
            <SizeBasedTriggeringPolicy size="50MB" />
        </RollingFile>
    </appenders> 

    <loggers> 
        <root level="trace">
            <appender-ref ref="RollingFile" />
            <appender-ref ref="Console" />
        </root>
    </loggers>
</configuration>

這里所有的配置信息和配置項在說Logback和Log4j的時候都有說過,所以Log4j2的配置文件肯定是能看懂的凤类。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穗泵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谜疤,更是在濱河造成了極大的恐慌火欧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茎截,死亡現(xiàn)場離奇詭異,居然都是意外死亡赶盔,警方通過查閱死者的電腦和手機企锌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來于未,“玉大人撕攒,你說我怎么就攤上這事『嫫郑” “怎么了抖坪?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闷叉。 經(jīng)常有香客問我擦俐,道長,這世上最難降的妖魔是什么握侧? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任蚯瞧,我火速辦了婚禮,結(jié)果婚禮上品擎,老公的妹妹穿的比我還像新娘埋合。我一直安慰自己,他們只是感情好萄传,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布甚颂。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪振诬。 梳的紋絲不亂的頭發(fā)上蹭睡,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音贷揽,去河邊找鬼棠笑。 笑死,一個胖子當著我的面吹牛禽绪,可吹牛的內(nèi)容都是我干的蓖救。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼印屁,長吁一口氣:“原來是場噩夢啊……” “哼循捺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雄人,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤从橘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后础钠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰力,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年旗吁,在試婚紗的時候發(fā)現(xiàn)自己被綠了踩萎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡很钓,死狀恐怖香府,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情码倦,我是刑警寧澤企孩,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站袁稽,受9級特大地震影響勿璃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜运提,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一蝗柔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧民泵,春花似錦癣丧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厢钧。三九已至,卻和暖如春嬉橙,著一層夾襖步出監(jiān)牢的瞬間早直,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工市框, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霞扬,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓枫振,卻偏偏與公主長得像喻圃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粪滤,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容