日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log4j配置_是时候了解一下log4j2各种配置的含义了!

發布時間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log4j配置_是时候了解一下log4j2各种配置的含义了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:http://i7q.cn/54K3Uw

1.日志框架

日志接口(slf4j)

slf4j是對所有日志框架制定的一種規范、標準、接口,并不是一個框架的具體的實現,因為接口并不能獨立使用,需要和具體的日志框架實現配合使用(如log4j、logback)

日志實現(log4j、logback、log4j2)

  • log4j是apache實現的一個開源日志組件

  • logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現

  • log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡單靈活。

2.為什么需要日志接口,直接使用具體的實現不就行了嗎?

接口用于定制規范,可以有多個實現,使用時是面向接口的(導入的包都是slf4j的包而不是具體某個日志框架中的包),即直接和接口交互,不直接使用實現,所以可以任意的更換實現而不用更改代碼中的日志相關代碼。

比如:slf4j定義了一套日志接口,項目中使用的日志框架是logback,開發中調用的所有接口都是slf4j的,不直接使用logback,調用是 自己的工程調用slf4j的接口,slf4j的接口去調用logback的實現,可以看到整個過程應用程序并沒有直接使用logback,當項目需要更換更加優秀的日志框架時(如log4j2)只需要引入Log4j2的jar和Log4j2對應的配置文件即可,完全不用更改Java代碼中的日志相關的代碼logger.info(“xxx”),也不用修改日志相關的類的導入的包(import org.slf4j.Logger; import org.slf4j.LoggerFactory;)

使用日志接口便于更換為其他日志框架

log4j、logback、log4j2都是一種日志具體實現框架,所以既可以單獨使用也可以結合slf4j一起搭配使用。

本文使用Log4j2作為slf4j的具體實現,引入的包如下:

<dependency>
????<groupId>org.slf4jgroupId>
????<artifactId>slf4j-apiartifactId>
????<version>1.7.25version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-slf4j-implartifactId>
????<version>2.11.0version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-coreartifactId>
????<version>2.11.0version>
dependency>
<dependency>
????<groupId>org.apache.logging.log4jgroupId>
????<artifactId>log4j-apiartifactId>
????<version>2.11.0version>
dependency>

3.log4j2日志級別

從大到小依次是: off, fatal, error, warn, info, debug, trace, all

由于我們使用的是slf4j接口包,該接口包中只提供了未標有刪除線的日志級別的輸出。

4.log4j2配置文件的優先級

  • Log4j will inspect the log4j.configurationFile system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension.

  • If no system property is set the properties ConfigurationFactory will look for log4j2-test.properties in the classpath.

  • If no such file is found the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.

  • If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.

  • If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.

  • If a test file cannot be located the properties ConfigurationFactory will look for log4j2.properties on the classpath.

  • If a properties file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.

  • If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.

  • If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.

  • If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.

5.對于log4j2配置文件的理解

配置文件結構:

  • Appdenders部分

  • Appender

  • Filter

  • Layout

  • Policies

  • Strategy

  • Appender

  • Loggers部分

  • Logger

  • RootLogger

  • 6.對于Appender的理解

    簡單說Appender就是一個管道,定義了日志內容的去向(保存位置)。

    配置一個或者多個Filter,Filter的過濾機制和Servlet的Filter有些差別,下文會進行說明。

    • 配置Layout來控制日志信息的輸出格式。

    • 配置Policies以控制日志何時(When)進行滾動。

    • 配置Strategy以控制日志如何(How)進行滾動。

    7.對于Logger的理解

    簡單說Logger就是一個路由器,指定類、包中的日志信息流向哪個管道,以及控制他們的流量(日志級別)

    8.log4j2配置文件框架

    配置文件格式

    <?xml ?version="1.0"?encoding="UTF-8"?>

    <Configuration>

    ????<Appenders>

    ????????<Appender>
    ????????????<Filters>
    ????????????????<LevelRangeFilter?minLevel="..."?maxLevel="..."?onMatch="..."?onMismatch="..."/>
    ????????????Filters>

    ????????????<PatternLayout?pattern="..."?charset="..."/>

    ????????????<Policies>
    ????????????????<CronTriggeringPolicy?schedule="..."/>
    ????????????????<SizeBasedTriggeringPolicy?size="..."/>
    ????????????????<TimeBasedTriggeringPolicy?/>
    ????????????Policies>
    ????????Appender>

    ????????<Appender>
    ????????????//?...
    ????????Appender>

    ????Appenders>

    ????<Loggers>

    ????????<Logger>
    ????????????<AppenderRef?ref="...">
    ????????Logger>

    ????????<Root>
    ????????????<AppenderRef?ref="...">
    ????????Root>

    ????Loggers>

    Configuration>

    9.Appender標簽的實現類

    其實這些標簽都是類名或者類名去掉后綴。

    Appender的常用的實現類有:

    • ConsoleAppender(Console)

    • FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)

    • RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

    打開這些實現類的源碼,你一定會恍然大明白,括號中的是實現類在log4j2.xml配置文件中的標簽名。

    10.ConsoleAppender(Console)

    該實現類會把日志輸出到控制臺中。

    它有兩種輸出方式:

    • SYSTEM_OUT(System.out)

    • SYSTEM_ERR(System.err)

    如果不配置,默認使用SYSTEM_OUT進行輸出。括號中是調用的方法。

    簡單示例:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<Console?name="Console"?target="SYSTEM_OUT">
    ????????????
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
    ????????Console>

    ????Appenders>

    ????<Loggers>

    ????????
    ????????<Root?level="info">
    ????????????
    ????????????<AppenderRef?ref="RollingFile"/>
    ????????Root>

    ????Loggers>

    Configuration>

    其它屬性可以參見官方文檔:?

    http://logging.apache.org/log4j/2.x/manual/appenders.html#ConsoleAppender

    10-1.FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)

    相同點:寫入日志信息到文件

    不同點:使用的I/O實現類不同,前者使用FileOutputStream,后者使用RandomAccessFile。

    官方文檔說是在bufferedIO=true(默認是true)的情況下后者比前者性能提升20% ~ 200%,不明覺厲,就用后者吧。

    簡單示例:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RandomAccessFile?name="File"?fileName="logs/app.log"?immediateFlush="false">
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
    ????????RandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>

    常用屬性:

    • fileName:來指定文件位置,文件或目錄不存在則會自動創建。

    • immediateFlush:是否每次寫入都要立刻刷新到硬盤中。默認true,如果使用默認值可能會影響性能。

    其它屬性可以參見官方文檔:

    http://logging.apache.org/log4j/2.x/manual/appenders.html#RandomAccessFileAppender

    10-2.RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)

    這一對之間的區別與上一對之間的區別是一樣的。

    上一對的實現類不能進行日志滾動,所謂日志滾動就是當達到設定的條件后,日志文件進行切分。

    比如:工程師想讓系統中的日志按日進行切分,并且按月歸檔。

    這時候這一對的作用就體現出來了。

    簡單示例:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log"?>
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>

    ????????????<Policies>
    ????????????????
    ????????????????<CronTriggeringPolicy?schedule="0/5?*?*?*?*??"?/>
    ????????????????<SizeBasedTriggeringPolicy?size="10?MB"/>
    ????????????Policies>

    ????????????<DefaultRolloverStrategy?max="10"?/>

    ????????RollingRandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>

    1.filePattern:指定了日志滾動之后的文件命名格式,至于其中的{date:hh-mm}表達式下文介紹。

    2.DefaultRolloverStrategy:指定了如何(How)進行翻滾,并且指定了最大翻滾次數(影響%i參數值),超過次數之后會按照相應的規則刪除舊日志。

    3.Policies:?這里就是規定了何時進行滾動(When),可以有多個Policy。

    • CronTriggeringPolicy設置了每 5s 進行一次翻滾

    • SizeBasedTriggeringPolicy設置了的話,如果當前文件超過了10MB,但是文件的名字還沒有進行翻滾(建立新文件),那么就會用%i的方式進行翻滾。

    10-3.翻滾示例

    app.log

    第一次翻滾:app.log app.1.log // app.log -> app.1.log
    第二次翻滾:app.log app.1.log app.2.lop // app.log -> app.2.log
    第三次翻滾:app.log app.1.log app.2.lop app.3.lop // app.log -> app.3.log
    第四次翻滾:app.log app.1.log app.2.lop app.3.lop app.4.lop // app.log -> app.4.log

    一直到設定的翻滾次數10之后,會把舊的日志內容覆蓋。

    app.2.lop?->?app.1.lop
    app.3.lop?->?app.2.lop
    ...
    app.10.lop?->?app.9.lop
    app.log?->?app.10.lop

    一直這樣循環下去,直到創建新文件。

    11.Filters

    Filters決定日志事件能否被輸出。過濾條件有三個值:ACCEPT(接受),DENY(拒絕),NEUTRAL(中立)。

    11-1.常用的Filter實現類有

    • LevelRangeFilter

    • TimeFilter

    • ThresholdFilter

    11-2.上文中提到log4j2中的Filter與Servlet中的有差別。那么有什么差別呢?

    簡單說就是log4j2中的過濾器ACCEPT和DENY之后,后續的過濾器就不會執行了,只有在NEUTRAL的時候才會執行后續的過濾器。

    11-3.簡單示例

    測試代碼:

    public?class?LogMain?{

    ????private?static?Logger?logger?=?LoggerFactory.getLogger(LogMain.class);

    ????public?static?void?main(String[]?args)?throws?Exception?{

    ????????logger.trace("trace?Msg.");
    ????????logger.debug("debug?Msg.");
    ????????logger.info("info?Msg.");
    ????????logger.warn("warn?Msg.");
    ????????logger.error("error?Msg.");

    ????}

    }

    配置文件:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<Console?name="Console">

    ????????????
    ????????????<Filters>

    ????????????????
    ????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="NEUTRAL"?/>

    ????????????????
    ????????????????<TimeFilter?start="08:00:00"?end="08:30:00"?onMatch="ACCEPT"?onMismatch="DENY"?/>
    ????????????Filters>

    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
    ????????Console>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="Console"/>
    ????????Root>

    ????Loggers>

    Configuration>

    輸出結果:

    17:51:53.546?[main]?INFO??me.master.snail.log.LogMain?-?info?Msg.
    17:51:53.548?[main]?WARN??me.master.snail.log.LogMain?-?warn?Msg.
    17:51:53.548?[main]?ERROR?me.master.snail.log.LogMain?-?error?Msg.

    如果當前時間不是 8點~8點半 之間,那么沒有日志會輸出。

    這里的info Msg.、warn Msg.和error Msg.為什么會輸出呢?

    是因為LevelRangeFilter對它們進行了ACCEPT,而剩下的trace Msg.和debug Msg.則會經過下一個過濾器,然后依次類推。

    12.PatternLayout

    這是常用的日志格式化類,其它日志格式化類很少用。

    關于其它日志類,可以打開PatternLayout類,找到其父類AbstractStringLayout, 看父類的實現類有哪些。

    簡單示例:

    "%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>

    授人以魚不如授人以漁。關于pattern的格式點擊

    http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

    具體的其它屬性可以看源碼也可以參考官方文檔。

    13.Policy & Strategy

    上文也說了,Policy是用來控制日志文件何時(When)進行滾動的;Strategy是用來控制日志文件如何(How)進行滾動的。

    如果配置的是RollingFile或RollingRandomAccessFile,則必須配置一個Policy。

    如果想按月歸檔,按日切分日志,然后

    13-1.Policy常用的實現類:

    • SizeBasedTriggeringPolicy

    • CronTriggeringPolicy

    • TimeBasedTriggeringPolicy

    13-1-1.SizeBasedTriggeringPolicy

    根據日志文件的大小進行滾動。

    <SizeBasedTriggeringPolicy?size="10MB"/>

    單位有:KB,MB,GB

    13-1-2.CronTriggeringPolicy

    使用Cron表達式進行日志滾動,很靈活。

    <CronTriggeringPolicy?schedule="0/5?*?*?*?*??"?/>

    13-1-3.TimeBasedTriggeringPolicy

    這個滾動策略依賴于filePattern中配置的最具體的時間單位,根據最具體的時間單位進行滾動。

    這種方式比較簡潔。CronTriggeringPolicy策略更強大。

    簡單示例:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log"?>
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>

    ????????????<Policies>
    ????????????????
    ????????????????

    ????????????????
    ????????????????<TimeBasedTriggeringPolicy?interval="5"?modulate="true"/>

    ????????????????<SizeBasedTriggeringPolicy?size="10?MB"/>
    ????????????Policies>

    ????????????<DefaultRolloverStrategy?max="10"?/>

    ????????RollingRandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>

    13-2.Strategy常用的實現類

    • DefaultRolloverStrategy

    • DirectWriteRolloverStrategy

    這兩個Strategy都是控制如何進行日志滾動的,至于他們的區別我還是不太明白,大佬解釋一下吧。

    平時大部分用DefaultRolloverStrategy就可以了。

    14.Logger

    Logger部分就比較簡單了,分為兩個Logger:

    • Root(必須配置)

    • Logger

    簡單示例:

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<Console?name="Console">
    ????????????<PatternLayout>
    ????????????????<Pattern>%d?%p?%c{1.}?[%t]?%m%nPattern>
    ????????????PatternLayout>
    ????????Console>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="trace">
    ????????????<AppenderRef?ref="Console"/>
    ????????????<Filters>
    ????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="DENY"?/>
    ????????????Filters>
    ????????Root>

    ????Loggers>

    Configuration>

    注意:Logger中也可以加過濾器的喲~

    14-1.比較重要的問題: 日志重復打印

    如果Root中的日志包含了Logger中的日志信息,并且AppenderRef是一樣的配置,則日志會打印兩次。

    注意:有兩個條件

    • Root中的日志包含了Logger中的日志信息

    • 且AppenderRef是一樣的配置

    這時候我們需要使用一個Logger的屬性來解決,那就是additivity,其默認值為true,需要配置為false。

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<Console?name="Console">
    ????????????<PatternLayout>
    ????????????????<Pattern>%d?%p?%c{1.}?[%t]?%m%nPattern>
    ????????????PatternLayout>
    ????????Console>

    ????Appenders>

    ????<Loggers>

    ????????<Logger?name="me.master.snail.log.LogMain"?level="info"?additivity="false">
    ????????????<AppenderRef?ref="Console"/>
    ????????Logger>

    ????????<Root?level="trace">
    ????????????<AppenderRef?ref="Console"/>
    ????????????<Filters>
    ????????????????<LevelRangeFilter?minLevel="error"?maxLevel="info"?onMatch="ACCEPT"?onMismatch="DENY"?/>
    ????????????Filters>
    ????????Root>

    ????Loggers>

    Configuration>

    15.Lookups

    這個組件類似于JSTL的EL表達式,或者類似于Spring的SpEL表達式。

    具體的語法很簡單,這里就不粘貼復制了,查看官方文檔:

    http://logging.apache.org/log4j/2.x/manual/lookups.html

    相信你用半個小時就學會了。

    16.示例

    為了大家快速開發(方便懶惰的同學),寫一些示例。

    16-1.輸出到控制臺

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<Console?name="Console"?target="SYSTEM_OUT">
    ????????????
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
    ????????Console>

    ????Appenders>

    ????<Loggers>

    ????????
    ????????<Root?level="info">
    ????????????
    ????????????<AppenderRef?ref="RollingFile"/>
    ????????Root>

    ????Loggers>

    Configuration>

    16-2.輸出到單個文件

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RandomAccessFile?name="File"?fileName="logs/app.log"?immediateFlush="false">
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>
    ????????RandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>

    16-3.按月歸檔日志,按日進行切分,限制單文件大小為 500MB, 一天最多生成20個文件,也就是(20 * 500)MB大小的日志

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/%d{yyyy-MM-dd}.app.%i.log"?>
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>

    ????????????<Policies>
    ????????????????<TimeBasedTriggeringPolicy?interval="1"?modulate="false"/>
    ????????????????<SizeBasedTriggeringPolicy?size="500MB"/>
    ????????????Policies>

    ????????????<DefaultRolloverStrategy?max="20"?/>
    ????????RollingRandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>

    16-4.限制Spring框架日志的輸出級別

    <?xml ?version="1.0"?encoding="UTF-8"?>
    <Configuration?name="baseConf"?status="warn"?monitorInterval="30">

    ????<Appenders>

    ????????<RollingRandomAccessFile?name="File"?fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/%d{yyyy-MM-dd}.app.%i.log"?>
    ????????????<PatternLayout?pattern="%d{HH:mm:ss.SSS}?[%t]?%-5level?%logger{36}?-?%msg%n"?charset="UTF-8"/>

    ????????????<Policies>
    ????????????????<TimeBasedTriggeringPolicy?interval="1"?modulate="false"/>
    ????????????????<SizeBasedTriggeringPolicy?size="500MB"/>
    ????????????Policies>

    ????????????<DefaultRolloverStrategy?max="20"?/>
    ????????RollingRandomAccessFile>

    ????Appenders>

    ????<Loggers>

    ????????
    ????????<logger?name="org.springframework"?level="INFO"/>

    ????????<Root?level="info">
    ????????????<AppenderRef?ref="File"/>
    ????????Root>

    ????Loggers>

    Configuration>



    技術交流群

    總結

    以上是生活随笔為你收集整理的log4j配置_是时候了解一下log4j2各种配置的含义了!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。