??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲资源最新版在线观看,国产aⅴ无码专区亚洲av麻豆 ,日韩精品亚洲人成在线观看 http://m.tkk7.com/jackybu/category/4769.html<a ><b><font color=red>共有<script src=http://fastonlineusers.com/online.php?d=jackybu.blogjava.net></script>人在同时阅读此Blog</font></b></a>zh-cnWed, 28 Feb 2007 04:17:59 GMTWed, 28 Feb 2007 04:17:59 GMT60有效地记录日志可以简化企业的开发过E?/title><link>http://m.tkk7.com/jackybu/articles/19545.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sun, 13 Nov 2005 00:12:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/19545.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/19545.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/19545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/19545.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/19545.html</trackback:ping><description><![CDATA[提前规划一个记录日志的计划Q在开发过E后期就可以L(fng) U别: 中 Charles Chan , 首席N, Ambrose Software Inc. 2005 q?9 ?05 ? 在企业的开发过E中Q我们不可避免地会碰到很多问题;如果(zhn)希望在开发过E的后期能够有效地捕?bugQ那需要一U有效的日志{略。但是在一个企业的应用E序中要惛_现有效地记录日志Q需要进行一番规划,q设计一些准则。在本文中,N Charles Chan 向(zhn)介l一些最好的实践Q从而帮助?zhn)从项目一开始就~写有用的日志代码? 如果(zhn)是一名开发h员,那?zhn)很可能就已经hq种l验Q?zhn)已经开发了一些代码以及一些测试用例。应用程序经q了严格?QA 试Q?zhn)信代码可以完全适合业务的需求。然而,在将应用E序最l交付终端用L(fng)手里Ӟ却会出现一些预想不到的问题。如果没有适当的日志消息,可能需要花费几天的旉来诊断这些问题。不q的是,大部分项目对于日志都没有一个清晰的{略。如果没有这U策略,pȝ产生的日志消息就有可能无益于问题的分析和解决。在本文中,我们讨Z业应用程序日志的各个斚w的问题。?zhn)看C?Java?q_上日?API 的概qͼ学习(fn)一些最好的~写日志代码的实践,q了解如果需要在产品环境中对详细日志重新q行排序Q应该如何处理? 选择日志 API 在?Java q_q行开发时Q可以用两个主要的日志 APIQApache Log4J ?Java Logging APIQ在 1.4 及更高版本的 Java q_中都提供了这两个 API。与 Java Logging API 相比QLog4J 更加成熟Q特性也更加丰富。这两个日志的实现都采用了一个类似的设计模式Q如?1 所C)。除非?zhn)的公叔R制要使用W三方的库,否则我强烈徏议?Log4J。如果?zhn)不能军_使用哪个 APIQ就可以使用 Apache Commons Logging APIQ它对底层的日志实现q行了封装。从理论上来_q样不用修改代码可以进行日志实现的切换。然而,实际上?zhn)很少会切换日志的实现Q因此,我不使用 Apache Commons Logging APIQ因为它的复杂性ƈ不没有给(zhn)带来其他特性? 回页? 日志概述 Log4J ?Java Logging API 都采用了cM的设计和使用模式Q如?1 和清?1 所C)。消息首先被创徏Q然后传递给一个具有特定优先权的日志对象。这些消息的目的和格式是p出处理程序及其布局所军_? ?1. 日志实现的主要组? 日志实现的主要组? 清单 1. 日志对象的实例化和? import org.apache.log4j.Logger; public class MyClass { /* * Obtain a logger for a message category. In this case, the message category is * the fully qualified class name of MyClass. */ private static final Logger logger = Logger.getLogger(MyClass.class.getName()); ... public void myMethod() { ... if (logger.isDebugEnabled()) { logger.debug("Executing with parameters: " + param1 + ":" + param2); } } } 一个好的日志实C提供了很多不同的输出处理E序Q最常见的文件输出处理程序和l端输出处理E序。Log4J q提供了一些处理程序将消息发布C?JMS 主题中,或者将消息插入一个数据库表中。尽这~写一个定制的附加器ƈ不困难,但是~写和维护这U代码的M成本不应低估。消息的格式可以通过 Layout 对象q行配置。最常见?layout 对象?PatternLayoutQ它Ҏ(gu)所提供的模式对消息q行格式化? 清单 2 l出了一?Log4J 的样例配|文Ӟ它负责配|?FileAppender。在q种配置中,com.ambrosesoft.log.MyClass cM的错误消息被发送给 FileAppenderQ后者将其写入一个名?log.txt 的文件中。这些消息是Ҏ(gu)与这个添加器相关?layoutQ在q种情况中是 PatternLayoutQ进行格式化的? 清单 2. Log4J XML 配置样例文g <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <param name="File" value="log.txt"/> <param name="Append" value="true"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n"/> </layout> </appender> <category name="com.ambrosesoft.log.MyClass"> <priority value="error"/> <appender-ref ref="fileAppender"/> </category> <root> <priority value="debug"/> <appender-ref ref="fileAppender"/> </root> </log4j:configuration> 回页? 日志最?jng)_? 关于日志Q?zhn)要做的一个最重要的选择可能是确定一U模式,每个日志消息分配给一个特定的 cd。常见的一U实跉|使用每个cȝ全名Q这些类的操作会被作Z个消息类别在日志中记录(正如我们在清?1 中看到的一PQ这是因可以让开发h员更l粒度地记录每个cȝ讄。然而,q只有在使用日志消息来跟t执行过E时才能良好地工作。在企业U的应用E序中,有很多其他类型的日志消息。D例来_一条日志消息可能是为安全顾问生的Q而另外一条日志消息则可能是会Z帮助q行性能调优而生的。如果这两条消息所x的是同一个类Q这样就会被分配l相同的cdQ这很隑֜日志输出l果中对其进行区分? Z避免q个问题Q应用程序应该具有一l专用的日志记录E序Q它们都q行了独特的分类Q如清单 3 所C。每个日志记录程序都可以配置自己的优先和输出处理程序。例如,安全性日志记录程序可以在日志写入目的地之前Ҏ(gu)息进行加密。有时应用程序的设计者应该与使用日志的用P例如安全NQ一h商讨日志的输出格式,从而对q些消息q行更好的控制? 清单 3. 专用的日志记录程? import org.apache.log4j.Logger; public interface Loggers { Logger performance = Logger.getLogger("performance"); Logger security = Logger.getLogger("security"); Logger business = Logger.getLogger("business"); } ... public class MyClass { .... if (Loggers.security.isWarnEnabled()) { Loggers.security.warn("Access denied: Username [" + userName + "] ..."); } ... } 选择日志的? 一?cd Q例?securityQ中的消息可以具有不同的 优先U。有些消息是Z调试而生的Q有些是Z警告而生的Q有些则是出现错误而生的。消息的不同优先U可以通过记录 U别 来生。最常用的日志别有Q? * Debug: q个U别的消息中包含了非常广泛的上下文信息。通常用于问题诊断? * Info: q些消息包含了一些有助于在品环境中Q粒度较_)帮助跟踪执行q程的上下文消息? * Warning: 警告消息Q说明系l中可能存在问题。例如,如果q个消息cd是有兛_全性方面的Q那么如果检到字典dQ就应该产生一条警告消息? * Error: 错误消息说明pȝ中出C严重的问题。这U问题通常都是不可恢复的,需要h工进行干预? 标准?Java Logging API ?Apache Log4J 在此之外又提供了一些日志别。日志别的主要目标是帮助?zhn)qo有用信息中的噪声。ؓ了防止出C用错误的U别以及降低日志消息的效用的情况Q在开始编码之前,必须为开发h员提供一个清晰的指导斚w? 日志消息的格? 一旦选定日志记录E序q徏立v日志U别之后Q就可以开始构建日志消息了。在q样做时Q重要的是要包含可能多的上下文信息Q例如用h供的参数Q其他应用程序的状态信息。记录日志对象的一U方法是它们{换成 XML。第三方库,例如 XStreamQ请参阅 参考资料)可以自动?Java 对象转换?XML 。尽这是一U非常强大的机制Q但是我们必要考虑在速度与详l程度之间达CU^衡。除了典型的应用E序状态信息之外,q应该记录以下信息: * U程 ID: 企业U的应用E序通常都是在多U程的环境中q行的。用线E?ID 信息Q?zhn)可以将多个h区分开来? * 调用E序的标? 调用E序的标识也是非帔R要的信息。由于不同的用户h不同的特权,它们的执行\径也可能会有很大的不同。将用户的标识放到日志消息中Q这对于对安全性敏感的应用E序是非常大的一个帮助? * 旉? 通常来说Q用户只能近似地知道问题发生的时间。如果没有时间戳Q就很难让别人来判断问题的原因所在? * 源代码信? q包括类名、方法名和行受除非?zhn)非常x安全性,否则我徏议?zhn)保留调试标记Q?gQ,即在编译品时也是如此。如果没有调试标讎ͼJava ~译器就会删除所有的行号信息Q从而极大地减少日志消息的可用性? 上面q些信息Q除了调用程序标识)都是由日志实现自动获取的。ؓ了将q些信息包含到消息中Q?zhn)只需要ؓ输出处理E序配置一个适当?layout 模式卛_。要捕获调用者的标识Q?zhn)可以利?Log4J 中的诊断上下文特性(更多信息请参?参考资料)。诊断上下文让?zhn)可以上下文信息与当前正在运行的U程兌在一赗这些信息可以在行格式化的同时而包含到每条消息中? ?J2EE Web 应用E序中,应用逻辑用h识保存到诊断上下文中最好的地方是在一?servlet qo器中。清?4 中显CZ要实现这U功能的必要代码。它使用?Log4J 1.3 alpha 中提供的映射诊断上下文类QMDCQ。?zhn)可以使?Log4J 1.2 中提供的嵌套诊断上下文(NDCQ实现相同的功能。有?servlet qo器的更多通用信息Q请参阅 参考资?中的信息? 清单 4. ?servlet qo器中使用诊断上下? import javax.servlet.Filter; ... import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.log4j.MDC; public class LoggerFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Retrieves the session object from the current request. HttpSession session = ((HttpServletRequest)request).getSession(); // Put the username into the diagnostic context. // Use %X{username} in the layout pattern to include this information. MDC.put("username", session.getAttribute("username")); // Continue processing the rest of the filter chain. chain.doFilter(request, response); // Remove the username from the diagnostic context. MDC.remove("username"); } ... } 使用 AspectJ 跟踪执行情况 在对问题q行诊断Ӟ通常跟踪E序的执行情况会很有帮助。?zhn)可以在程序执行的不同地方持箋发送日志消息吗Q例如方法的入口函数和出口函数。这是一个老问题,在出?AspectJ 之前一直都没有什么好的解x案。?AspectJQ可以在应用E序的不同地Ҏ(gu)行代码段。在 AspectJ 中,q些地方都称?point cutQ在 point cut 处所执行的代码称?advice。point cut 和advice 合称 aspect? 关于 AspectJQ有一件事情非常神奇,aspect 不用很多努力可以应用到整个应用E序中。有?AspectJ 的更多信息,请参?参考资料。清?5 l出了一?AspectJ 源文件的例子Q它用来Ҏ(gu)法的入口和出口函数记录日志。在q个例子中,跟踪日志E序在每次q入或退?com.ambrosesoft 包的一个共有方法时都会记录一条日志? 清单 5. 使用 AspectJ 记录Ҏ(gu)的入口和出口 import org.apache.log4j.Logger; import java.lang.reflect.Field; public aspect AutoTrace { private static final Logger logger = Logger.getLogger(AutoTrace.class); pointcut publicMethods() : execution(public * com.ambrosesoft..*(..)); pointcut loggableCalls() : publicMethods(); /** * Inspect the class and find its logger object. If none is found, use * the one defined here. */ private Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) { try { /* * Try to discover the logger object. * The logger object must be a static field called logger. */ Class declaringType = joinPoint.getSignature().getDeclaringType(); Field loggerField = declaringType.getField("logger"); loggerField.setAccessible(true); return (Logger)loggerField.get(null); } catch(NoSuchFieldException e) { /* * Cannot find a logger object, use the internal one. */ return logger; } catch(Exception e) { throw new RuntimeException(e); } } /** * An aspect to log method entry. */ before() : loggableCalls(){ getLogger(thisJoinPoint).debug("Entering.." + thisJoinPoint.getSignature().toString()); } /** * An aspect to log method exit. */ after() : loggableCalls(){ getLogger(thisJoinPoint).debug("Exiting.." + thisJoinPoint.getSignature().toString()); } } 回页? 产品环境中的日志 一旦应用程序处于品环境中之后Q?zhn)通常都需要关闭调试或信息日志消息Q从而对q行时的性能q行优化。然而,当有些不好的事情发生Ӟ(zhn)又不能在开发环境中重现q个问题Q那可能需要在产品环境中激z调试消息了。重要的是能够修Ҏ(gu)志的讄Q而不用关闭服务器。诊断品的问题即不用p数天来进行详l的调研Q通常也需要几个小时的旉。在q段旉之内Q开发h员需要激zL关闭应用E序不同范围的日志。如果每ơ修Ҏ(gu)志的讄之后都需要重新启动品应用程序,那么情况׃变得非常不可靠了? q运的是QLog4J 提供了一U简单的机制来解册个问题。在 Log4J 1.2 中,DOMConfigurator 中的 configureAndWatch() Ҏ(gu)会对 Log4J q行配置Qƈ自动监视日志配置文g中的变化。这在清?6 中进行了阐述。(注意Q在 Log4J 1.3Q目前仍?alpha 版本Q?中ƈ不推荐?DOMConfiguratorQ它使用了一个更加灵zȝ实现 JoranConfigurator。) Z保 configureAndWatch() 是在 Log4J 初始化之前调用的Q?zhn)应该在启动类中调用它。不同的应用E序服务器采用了不同的机制来执行启动代码Q更多信息请参阅 参考资料)。详l信息请查看应用服务器的实现。有些应用服务器可能需要?zhn)?Log4J 的库攑ֈ服务器的 classpath 中。日志配|文件应该保存到一个需要日志的人可以访问的位置? 清单 6. 使用 DOMConfigurator 配置 Log4J /* * Configure Log4J library and periodically monitor log4j.xml for any update. */ DOMConfigurator.configureAndWatch("/apps/config/log4j.xml"); 如果(zhn)的日志配置文g不能方便地进行访问(例如(zhn)的产品环境是由一个不同的l织q行l护的)Q那么?zhn)必M用一U不同的{略。标准的Ҏ(gu)是?JMXQ它提供了一个标准的 API 来管理自q应用E序讄。在C JMX 兼容的服务器中,(zhn)可以用管?bean Q或 MBeans Q来扩展应用服务器的理l端的功能(更多有关使用 JMX 以及?WebSphere Application Server 6.0 中?JMX 的内容,请参?参考资?一节。)׃ JMX Ҏ(gu)非常复杂Q如果?zhn)的情况需要?JMXQ那应该只用作q个用途? 记录敏感的数? 在记录品环境中的日志时Q除了技术方面的挑战之外Q还存在一些业务问题需要克服。例如,记录敏感的信息可能会引v安全性的问题。ƈ没有M限制可以防止(zhn)将某个用户的用户名和密码保存到正文文g中。?zhn)q必要保护其他敏感信息Q例?e-mail 地址、电(sh)话号码以及帐号信息。安全顾问和设计师有责Q要确保这些信息不会未加Q何处理就保存到日志中。对敏感信息使用安全性专用的日志E序可以帮助降低风险。?zhn)可以l这个日志程序配|一个专用的附加器,从而用一U加密的格式来保存消息,或者将其保存到一个安全的地方。然而,防止出现安全风险的最x法是在项目开始之前就讄适当的编码规范,q在查代码时强制施行q些规范? 从异怸提取有用信息 当发生一个非预期的异常时 —?例如Q如果数据库q接H然失效了,或者系l资源变得很低了 —?必d光当地进行处理,否则׃丢失有用的信息,q些信息在诊断问题时是非常有帮助的。首先,必须记录异常及其堆栈跟踪状况。其ơ,应该使用一U用L(fng)面友好的方式来标识错误页面,q对于终端用户和技术支持小l来说都是非常有帮助的? 技术支持小l在接到一个技术支持电(sh)话时所面(f)的一个挑战是在用h报告的问题与特定的日志异怹间徏立某U关联。非常有用的一U简单技术是为每个异帔R记录一个唯一?ID。这?ID 可以告诉用户Q也可以包含在终端用h填写的问题报告表单中。这样可以减技术支持团队成员猜的旉Q让他们可以快速对问题作出响应。考虑到可L的问题Q可以定期对 ID q行回收? 日志文g的管? 一个非常繁忙的应用E序的日志文件可能会q速变得非常大。较大的日志文g很难使用Q这是因为它们需要过滤大量的噪声才能扑ֈ有用的信受Log 循环 是常见的一个可以帮助解册个问题的实践。日志@环会周期性地Ҏ(gu)日志q行归档Q这h消息可以总能写到一个相对较?yu)的文g中。日志消息降低了一些效用来提高速度Q?zhn)可能很少需要参考一周之前的日志消息。在 Log4J 1.2 中, DailyRollingFileAppender 附加器可以根据所提供的日期模式来循环使用日志文g。(?Log4J 1.3 中,已经对这个@环日志文仉加器重新q行了设计。现在?zhn)可以提供一U策略来控制如何q行循环了。例如, TimeBasedRollingPolicy 定义了一U基于时间和日期的@环模式。)清单 7 昄了让 Log4J 在每天午夜对自己的日志文件进行@环所采用的配|片断? 清单 7. 使用 DailyRollingFileAppender 循环使用日志文g <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="log.txt"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %p - %m%n"/> </layout> </appender> ... </log4j:configuration> 回页? 集群环境中的日志 现在有越来越多的企业U应用程序是在集环境或分布式环境中q行部v的。然而,集群环境中的日志需要更多规划,因ؓ消息都是从不同的源头生成的(通常是不同的机器Q。如果要对不同的机器记录日志Q那必dq些机器的时间戳q行同步Q否则日志消息的ơ序؜׃。对机器间时钟进行同步的一U简单方法是使用一个时间服务器。有两种Ҏ(gu)可以讄旉服务器。?zhn)可以指定一台内部的机器作ؓ旉服务器。然后其他机器就可以使用|络旉协议QNTPQ来与时间服务器的时间戳q行同步。另外,(zhn)可以?Internet 上提供的旉服务器(请参?参考资料)。在 AIX 上,xntpd 守护q程用来对不同机器的pȝ旉q行同步。当机器h相同的时间之后,可以对日志一赯行分析了? 在集环境中搜集日志消息q面临着一些挑战。在q种环境中保存日志消息的一U简单方法是它们保存到L特定的日志文件中。当集群是?session affinity 配置Ӟq可以很好地工作 —?如果Ҏ(gu)个特定用户会话的h都要到同一个服务器上,q且 EJB 也都是部|在本地的。在q种配置中,集群中的机器所产生的日志文仉可以独立q行分析。如果不是这U情?—?换而言之,如果Ml定的请求都可以由多台机器进行处?—?那么对不同日志文件中的日志消息进行分析就会变得更加困难。在q种情况中,一U好的办法是使用pȝ理软g来管理日志消息,例如 IBM Tivoli] 软gQ请参阅 参考资?中的链接Q。这UY件对所有的日志消息Q在pȝ理软g的术语中UC?事gQ提供了一个综合的视图Q从而便于管理员使用。系l管理Y件也可以Ҏ(gu)所接收到的事g的类型触发一些操作(例如发?e-mail 消息或传呼消息)? 回页? l束? 在本文中Q我们介l了在规划日志策略时需要考虑哪些问题。正如在~程时所到的问题一P从一开始就采用一个经q详l考虑的规划要比在q行的同时规划更能节省工作量。良好的日志{略可以极大地帮助对问题q行诊断。最l,l端用户可以获得更好的应用程序,q能从技术支持团队获得迅速的响应? 回页? 参考资? * (zhn)可以参阅本文在 developerWorks 全球站点上的 英文原文? * Apache Log4J 库是 Java q_上特性最丰富、最成熟的日?API? * 官方?short introduction to Log4J 是ؓ那些希望使用 Log4J 库的人准备的一个必ȝ? * Log4J 教程 Ҏ(gu)志包q行了很好的介绍? * Java Logging API ?Java 1.4 及其更高版本中所提供的一个标准日?API。这?API 最初是 JSR 47? * Brian Gilstrap 撰写的“An introduction to the Java Logging API”(OnJava.comQ?002 q?6 月)讨论了这个标准日?API 的用问题? * Stuart Dabbs Halloway 撰写的“The Java Logging API”(JavaProQ?002 q?6 月)也很好地介绍了这?API? * Apache Commons Logging API 对其他实现提供了一U封装,从而让(zhn)可以在不同的实C间进行切换? * 嵌套诊断上下文(NDCQ?上下文信息保存在本地线E存储中Q在产生日志消息时可以用这些信息? * XStream 库可以?introspection ?Java 对象转化?XML Q反之亦可)。它对于记录应用E序的状态来说非常有用? * Servlet filter 可以截获h和响应,q能用于为日志消息设|上下文消息? * Sun ?The Essentials of Filters 是学?servlet qo器的一个很好资源? * 受欢q的 developerWorks 作?Sing Li 在“Tomcat 的过滤诀H”(developerWorksQ?001 q?6 月)一文中Q介l了有关 servlet qo的两炚w题,q篇文章向(zhn)展C如何在应用E序中充分利用这些过滤器? * AOP@Work pdQ由面向斚w开发社区的领先专家执笔撰写Q深入介l了应用 AOP 的问题。相x章有“介l?AspectJ 5”和“用新的 AJDT 本本?AOP 开发”? * Wayne Beaton ?Sree Anand Ratnasingh 撰写的“Migrating WebLogic startup code to WebSphere Application Server V5”(developerWorks, 2004 q?1 月)Q讨Z两个行的应用服务器启动代码的差异? * 查看 Java Management ExtensionsQJMXQ主c? * 受欢q的作?Sing Li 在他?3 系列文章“从黑箱C业,W?1 部分: 理QJMX 1.1 样式 ?中对 JMX q行了深入的介绍? * q个 帮助面 讨论了?Java Management ExtensionsQJMXQ扩?WebSphere Application Server 理pȝ的内宏V? * Network Time Protocol 目主页上罗列了很多公共旉服务器,(zhn)可以用它们来Ҏ(gu)器时钟进行同步? * xntpd 手册?讨论?AIX 上的|络旉协议守护q程的内宏V? * (zhn)可以在 developerWorks ?Java 技术专?中找到有?Java ~程各方面知识的文章? 回页? 关于作? Charles Chan 是一名独立Y仉问,在加拿大?Toronto 工作。他的兴包括分布式pȝ、高性能计算、国际化以及软g设计模式。在I闲旉Q他为开源社A(ch)献自q成果?img src ="http://m.tkk7.com/jackybu/aggbug/19545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-11-13 08:12 <a href="http://m.tkk7.com/jackybu/articles/19545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://xjdz8.com" target="_blank">޾ƷþþþþðĦ </a>| <a href="http://conghui8.com" target="_blank">91޾ƷƵ</a>| <a href="http://773311h.com" target="_blank">һƵ߹ۿwww</a>| <a href="http://by6635.com" target="_blank"> ͼƬ</a>| <a href="http://pgyadv.com" target="_blank">ձĻѿ</a>| <a href="http://delvheng.com" target="_blank">ѲŴɫaƵ</a>| <a href="http://hhgcnet.com" target="_blank">èwww˳վ</a>| <a href="http://hljjlhl.com" target="_blank">ŷ͵Ʒ </a>| <a href="http://rimcn.com" target="_blank">㽶߹ۿ</a>| <a href="http://222xx8.com" target="_blank">ɫۺ</a>| <a href="http://18yinren.com" target="_blank">WWWƵ߹ۿ</a>| <a href="http://an930.com" target="_blank">޹þþþƷ</a>| <a href="http://3atv66.com" target="_blank">Ļ߹ۿձ </a>| <a href="http://yuejiju.com" target="_blank">Ƶվձ</a>| <a href="http://726kxw.com" target="_blank">޹Ʒ˾Ʒ</a>| <a href="http://jl910.com" target="_blank">þøݾƷԴվ</a>| <a href="http://qzapp88.com" target="_blank">þþƷav鶹С˵ </a>| <a href="http://020iws.com" target="_blank">Ʒվ</a>| <a href="http://519vip.com" target="_blank">av뾫ƷװƬ</a>| <a href="http://dyj696.com" target="_blank">ܻƺܻƵվѵ</a>| <a href="http://51ykz.com" target="_blank">Av뾫Ʒ</a>| <a href="http://28896543.com" target="_blank">޳AVַ</a>| <a href="http://zf91.com" target="_blank">ҹӰԺѹۿ</a>| <a href="http://1y3c.com" target="_blank">þҹɫƷa</a>| <a href="http://7t53.com" target="_blank">˳߹ۿվƷձ</a>| <a href="http://llyysp.com" target="_blank">xxxxձ߲Ѳ</a>| <a href="http://kkjk123.com" target="_blank">պþ</a>| <a href="http://18jko.com" target="_blank">ϣӰԺѹۿƵ</a>| <a href="http://xass1.com" target="_blank">޹AV</a>| <a href="http://ynkmht.com" target="_blank">ޡvþþ뾫Ʒ</a>| <a href="http://littlevv.com" target="_blank">2019Ļmvѿ </a>| <a href="http://fjwkjx.com" target="_blank">Ů18ؼһëƬƵ</a>| <a href="http://0827fang.com" target="_blank">ѵĻɫҳѹۿ</a>| <a href="http://langtuojidian.com" target="_blank">һ͵Ů</a>| <a href="http://sztsa.com" target="_blank">һӰ߿Ƭ</a>| <a href="http://6006284.com" target="_blank">ٶ100%ڵѹۿ</a>| <a href="http://djyvp32.com" target="_blank">þþƷƷް</a>| <a href="http://cao9999.com" target="_blank">ѿŮˬ</a>| <a href="http://www-yhty.com" target="_blank">߻ɫӰ</a>| <a href="http://286513.com" target="_blank">AV뾫Ʒһ</a>| <a href="http://8v4y.com" target="_blank">þþ޾Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>