【问题标题】:Log4j2 - Unrecognized conversion specifier [xwEx] starting at position 160 in conversion patternLog4j2 - 无法识别的转换说明符 [xwEx] 从转换模式中的位置 160 开始
【发布时间】:2018-11-13 19:01:58
【问题描述】:

我在一个 Maven 多模块项目中有一个 SpringBoot 应用程序,我正在使用 Log4j2 进行日志记录。

当我使用测试运行构建时,一些模块有一个奇怪的日志记录异常,并记录了来自未知(不是我的)类的更多行。

这是个例外:

2018-06-04 14:16:26,791 main ERROR Error creating converter for xwEx java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:583)
    at org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:639)
    at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:415)
    at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:177)
    at org.apache.logging.log4j.core.layout.PatternLayout$SerializerBuilder.build(PatternLayout.java:377)
    at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:129)
    at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:59)
    at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:660)
    at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:517)
    at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:958)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:898)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:890)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:890)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:513)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:237)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:249)
    at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
    at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:261)
    at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadConfiguration(Log4J2LoggingSystem.java:176)
    at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadDefaults(Log4J2LoggingSystem.java:159)
    at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:84)
    at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:59)
    at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.initialize(Log4J2LoggingSystem.java:148)
    at org.springframework.boot.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:303)
    at org.springframework.boot.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:276)
    at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239)
    at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:212)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
    at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:50)
    at org.spockframework.spring.SpringInterceptor.interceptSetupMethod(SpringInterceptor.java:42)
    at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:28)
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:472)
    at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:375)
    at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:370)
    at org.spockframework.runtime.BaseSpecRunner.doRunIteration(BaseSpecRunner.java:323)
    at org.spockframework.runtime.BaseSpecRunner$6.invoke(BaseSpecRunner.java:309)
    at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
    at org.spockframework.runtime.BaseSpecRunner.runIteration(BaseSpecRunner.java:288)
    at org.spockframework.runtime.BaseSpecRunner.initializeAndRunIteration(BaseSpecRunner.java:278)
    at org.spockframework.runtime.BaseSpecRunner.runSimpleFeature(BaseSpecRunner.java:269)
    at org.spockframework.runtime.BaseSpecRunner.doRunFeature(BaseSpecRunner.java:263)
    at org.spockframework.runtime.BaseSpecRunner$5.invoke(BaseSpecRunner.java:246)
    at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
    at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:238)
    at org.spockframework.runtime.BaseSpecRunner.runFeatures(BaseSpecRunner.java:188)
    at org.spockframework.runtime.BaseSpecRunner.doRunSpec(BaseSpecRunner.java:98)
    at org.spockframework.runtime.BaseSpecRunner$1.invoke(BaseSpecRunner.java:84)
    at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
    at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
    at org.spockframework.runtime.BaseSpecRunner.runSpec(BaseSpecRunner.java:76)
    at org.spockframework.runtime.BaseSpecRunner.run(BaseSpecRunner.java:67)
    at org.spockframework.runtime.Sputnik.run(Sputnik.java:63)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.lang.NoSuchMethodError: org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.<init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
    at org.springframework.boot.logging.log4j2.ExtendedWhitespaceThrowablePatternConverter.<init>(ExtendedWhitespaceThrowablePatternConverter.java:42)
    at org.springframework.boot.logging.log4j2.ExtendedWhitespaceThrowablePatternConverter.newInstance(ExtendedWhitespaceThrowablePatternConverter.java:63)
    ... 80 more 

然后我得到这条线:

2018-06-04 14:16:26,805 main ERROR Unrecognized conversion specifier [xwEx] starting at position 160 in conversion pattern.

然后我看到未知日志(关于我的班级的前两行):

2018-06-04 14:16:27.118  INFO 1244 --- [           main] c.m.a.MyTest   : Starting MyTest on blablabla
%xwEx2018-06-04 14:16:27.148  INFO 1244 --- [           main] c.m.a.MyTest   : No active profile set, falling back to default profiles: default
%xwEx2018-06-04 14:16:27.298  INFO 1244 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@51a07eac: startup date [Mon Jun 04 14:16:27 CEST 2018]; root of context hierarchy
%xwEx2018-06-04 14:16:31.216  INFO 1244 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration' of type [class org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:32.022  INFO 1244 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'validator' of type [class org.springframework.validation.beanvalidation.LocalValidatorFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:32.423  INFO 1244 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$a851eb8b] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:36.988  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithoutAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:36.997  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:36.998  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdate(java.lang.String,java.lang.String,java.util.List,boolean)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.567  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithoutAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.568  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.569  INFO 1244 --- [           main] o.s.a.f.CglibAopProxy                    : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdate(java.lang.String,java.lang.String,java.util.List,boolean)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.

这是我得到这些奇怪东西的模块中的 log4j2-test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="stdout">
            <PatternLayout pattern="MyApp: %d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %c{1.}:%L - %m%n"/>
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="com.my.app" level="debug" additivity="false">
            <appender-ref ref="stdout"/>
        </Logger>
        <Logger name="org.springframework" level="warn" additivity="false">
            <Appender-ref ref="stdout"/>
        </Logger>
        <Logger name="org.springframework.context.annotation.ConfigurationClassEnhancer" level="error"
                additivity="false">
            <Appender-ref ref="stdout"/>
        </Logger>
        <Root level="info">
            <Appender-ref ref="stdout"/>
        </Root>
    </Loggers>
</Configuration>

最后是模块的 pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</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-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>

<!-- Log4j Start -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jul</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
</dependency>
<dependency>
    <groupId>org.dblock.log4jna</groupId>
    <artifactId>log4jna-api</artifactId>
</dependency>

【问题讨论】:

  • 您是否有可能在某处有代码以编程方式更改配置?
  • 不,这就是我的全部
  • @victorio 那么,您是否设法解决了这个错误?我遇到了同一个。
  • 我去...还有这个问题吗?
  • 不,异常仍然存在

标签: spring-boot logging log4j2


【解决方案1】:

我认为现有的答案是正确但不完整的。

如果同时发生以下情况,您会收到该错误:

  1. 您正在使用旧版本的 spring-boot 和最新版本的 Log4J2(不理想但可能;由于“Log4shell”漏洞,您正在升级 Log4J2,对吧?)
  2. 您使用的是 spring-boot 提供的默认日志配置文件(spring-boot-x.x.x.RELEASE.jar 中的 /org/springframework/boot/logging/log4j2/log4j2.xml)。这是真正的问题。

存在默认配置文件以允许快速设置新应用程序。不幸的是,它与 Log4J 2.8+ 不兼容。

可能您想使用自己的配置,并且您可能已经准备好配置文件但应用程序没有找到它。

可能的解决方案:

  1. 升级 spring-boot 或降级 Log4J2(当然不推荐)。

  2. 如果你真的想使用默认配置(真的吗?),设置这个环境变量:LOG_EXCEPTION_CONVERSION_WORD=%throwable as suggested by tsingke

  3. 确保您自己的log4j2.xml 或者更好的是log4j2-spring.xml 位于类路径中或logging.config 环境变量指出的路径中(请参阅Custom Log Configuration)。

我使用了解决方案 #3。

旁注:如果你升级 Log4J 但继续使用 spring-boot 1.x 你会遭受其他漏洞,所以这应该只是第一步, 即使你的老板(或你的客户)只关心 Log4shell!

【讨论】:

    【解决方案2】:

    我在升级到 log4j 2.17.1 时遇到了这个问题(由于这些漏洞)。在我的项目中,我需要保留 SpringBoot 1.5。

    我只是通过将 log4j2.xml 文件放入“resources”文件夹而不是像以前那样放在根文件夹中来解决它。是的,这没有意义。它不需要是复杂的xml,因为我的很简单,不需要任何与'xwEx'相关的属性。

    虽然网上有人说 log4j 2.8+ 和 Spring 1.5 不兼容,但这似乎不是这个特定问题的原因。

    我在尝试了很多可能性之后发现了它,与依赖关系斗争并最终绝望并尝试了一切哈哈。

    【讨论】:

      【解决方案3】:

      springboot1 默认 log4j.xml 使用模式:2.8+ 不支持 %xwEx,但我们可以通过设置环境变量 LOG_EXCEPTION_CONVERSION_WORD 来覆盖模式,例如:%throwable

      @SpringBootApplication
      public class Application {
          public static void main(String[] args) {
              System.setProperty("LOG_EXCEPTION_CONVERSION_WORD", "%throwable");
              SpringApplication.run(Application.class, args);
          }
      }
      

      【讨论】:

      【解决方案4】:

      报告了一个问题,称 Spring Boot 1.5 与 Log4j 2.8 不兼容。 https://github.com/spring-projects/spring-boot/issues/9172

      我在使用 Spring Boot 1.5 和 Log4j 2.8.2 时遇到了与您类似的错误,而当我切换到 Log4j 2.7 时这些错误就消失了

      【讨论】:

      • 我遇到了同样的问题,这对我有用!
      • 不幸的是,由于著名的“log4shell”漏洞,降级不再是一个好的解决方案。
      【解决方案5】:

      尝试修改您的 log4j2-test.xml 文件以匹配以下内容:

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration name="${sys:LOG_FILE}" status="WARN"
          strict="true">
          <Properties>
              <Property name="ROLLING_LOG_FILE_NAME"
                  value="${sys:LOG_FILE}" />
              <Property name="APP_LOG_FOLDER"
                  value="${ROLLING_LOG_FILE_NAME}" />
              <Property name="APP_LOG_BASE_DIRECTORY"
                  value="${sys:dtep.logs.home}${sys:file.separator}${APP_LOG_FOLDER}" />
              <Property name="CONSOLE_LOG_PATTERN"
                  value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%5level} %style{%5processId}{normal, blue} --- [%15thread] %style{%logger{1.}}{normal, cyan} : %message%n%throwable%n" />
              <Property name="FILE_LOG_PATTERN"
                  value="%date{yyyy-MM-dd HH:mm:ss.SSS} %5level %5processId --- [%15thread] %logger{1.} : %message%n%throwable%n" />
          </Properties>
          <Appenders>
              <Appender type="Console" name="Console" target="SYSTEM_OUT">
                  <Layout type="PatternLayout" pattern="${CONSOLE_LOG_PATTERN}" />
              </Appender>
              <Appender type="RollingFile" name="RollingFile"
                  fileName="${APP_LOG_BASE_DIRECTORY}${sys:file.separator}${ROLLING_LOG_FILE_NAME}.log"
                  filePattern="${APP_LOG_BASE_DIRECTORY}${sys:file.separator}$${date:yyyy}${sys:file.separator}$${date:MMM}${sys:file.separator}${ROLLING_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i.log">
                  <Layout type="PatternLayout" pattern="${FILE_LOG_PATTERN}" />
                  <Policies>
                      <Policy type="TimeBasedTriggeringPolicy" />
                      <Policy type="SizeBasedTriggeringPolicy" size="1KB" />
                  </Policies>
                  <Strategy type="DefaultRolloverStrategy" fileIndex="nomax">
                      <Delete basePath="${APP_LOG_BASE_DIRECTORY}" maxDepth="5"
                          testMode="false">
                          <IfFileName
                              glob="**${sys:file.separator}${ROLLING_LOG_FILE_NAME}_*.log">
                              <IfLastModified age="1m">
                                  <IfAny>
                                      <IfAccumulatedFileSize exceeds="3 KB" />
                                      <IfAccumulatedFileCount exceeds="3" />
                                  </IfAny>
                              </IfLastModified>
                          </IfFileName>
                      </Delete>
                  </Strategy>
              </Appender>
          </Appenders>
          <Loggers>
              <Root level="TRACE">
                  <AppenderRef ref="Console">
                      <Filters>
                          <Filter type="ThresholdFilter" level="INFO" onMatch="ACCEPT"
                              onMismatch="DENY" />
                      </Filters>
                  </AppenderRef>
                  <AppenderRef ref="RollingFile">
                      <Filters>
                          <Filter type="ThresholdFilter" level="INFO" onMatch="ACCEPT"
                              onMismatch="DENY" />
                      </Filters>
                  </AppenderRef>
              </Root>
              <AsyncLogger name="org.springframework" level="INFO"
                  additivity="false">
                  <AppenderRef ref="Console" />
                  <AppenderRef ref="RollingFile" />
              </AsyncLogger>
              <AsyncLogger name="org.hibernate" level="INFO"
                  additivity="false">
                  <AppenderRef ref="Console" />
                  <AppenderRef ref="RollingFile" />
              </AsyncLogger>
          </Loggers>
      </Configuration>
      

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2015-01-18
        • 2012-06-30
        相关资源
        最近更新 更多