久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

探索Java日志的奥秘:底层日志系统-log4j2

發布時間:2024/8/23 windows 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探索Java日志的奥秘:底层日志系统-log4j2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

log4j2是apache在log4j的基礎上,參考logback架構實現的一套新的日志系統(我感覺是apache害怕logback了)。
log4j2的官方文檔上寫著一些它的優點:

  • 在擁有全部logback特性的情況下,還修復了一些隱藏問題
  • API 分離:現在log4j2也是門面模式使用日志,默認的日志實現是log4j2,當然你也可以用logback(應該沒有人會這么做)
  • 性能提升:log4j2包含下一代基于LMAX Disruptor library的異步logger,在多線程場景下,擁有18倍于log4j和logback的性能
  • 多API支持:log4j2提供Log4j 1.2, SLF4J, Commons Logging and java.util.logging (JUL) 的API支持
  • 避免鎖定:使用Log4j2 API的應用程序始終可以選擇使用任何符合SLF4J的庫作為log4j-to-slf4j適配器的記錄器實現
  • 自動重新加載配置:與Logback一樣,Log4j 2可以在修改時自動重新加載其配置。與Logback不同,它會在重新配置發生時不會丟失日志事件。
  • 高級過濾: 與Logback一樣,Log4j 2支持基于Log事件中的上下文數據,標記,正則表達式和其他組件進行過濾。
  • 插件架構: Log4j使用插件模式配置組件。因此,您無需編寫代碼來創建和配置Appender,Layout,Pattern Converter等。Log4j自動識別插件并在配置引用它們時使用它們。
  • 屬性支持:您可以在配置中引用屬性,Log4j將直接替換它們,或者Log4j將它們傳遞給將動態解析它們的底層組件。
  • Java 8 Lambda支持
  • 自定義日志級別
  • 產生垃圾少:在穩態日志記錄期間,Log4j 2 在獨立應用程序中是無垃圾的,在Web應用程序中是低垃圾。這減少了垃圾收集器的壓力,并且可以提供更好的響應時間性能。
  • 和應用server集成:版本2.10.0引入了一個模塊log4j-appserver,以改進與Apache Tomcat和Eclipse Jetty的集成。

Log4j2類圖:

這次從四個地方去探索源碼:啟動,配置,異步,插件化

源碼探索

啟動

log4j2的關鍵組件

  • LogManager

根據配置指定LogContexFactory,初始化對應的LoggerContext

  • LoggerContext

1、解析配置文件,解析為對應的java對象。
2、通過LoggerRegisty緩存Logger配置
3、Configuration配置信息
4、start方法解析配置文件,轉化為對應的java對象
5、通過getLogger獲取logger對象

  • Logger

LogManaer

該組件是Log4J啟動的入口,后續的LoggerContext以及Logger都是通過調用LogManager的靜態方法獲得。我們可以使用下面的代碼獲取Logger

Logger logger = LogManager.getLogger();

可以看出LogManager是十分關鍵的組件,因此在這個小節中我們詳細分析LogManager的啟動流程。
LogManager啟動的入口是下面的static代碼塊:

/*** Scans the classpath to find all logging implementation. Currently, only one will be used but this could be* extended to allow multiple implementations to be used.*/static {// Shortcut binding to force a specific logging implementation.final PropertiesUtil managerProps = PropertiesUtil.getProperties();final String factoryClassName = managerProps.getStringProperty(FACTORY_PROPERTY_NAME);if (factoryClassName != null) {try {factory = LoaderUtil.newCheckedInstanceOf(factoryClassName, LoggerContextFactory.class);} catch (final ClassNotFoundException cnfe) {LOGGER.error("Unable to locate configured LoggerContextFactory {}", factoryClassName);} catch (final Exception ex) {LOGGER.error("Unable to create configured LoggerContextFactory {}", factoryClassName, ex);}}if (factory == null) {final SortedMap<Integer, LoggerContextFactory> factories = new TreeMap<>();// note that the following initial call to ProviderUtil may block until a Provider has been installed when// running in an OSGi environmentif (ProviderUtil.hasProviders()) {for (final Provider provider : ProviderUtil.getProviders()) {final Class<? extends LoggerContextFactory> factoryClass = provider.loadLoggerContextFactory();if (factoryClass != null) {try {factories.put(provider.getPriority(), factoryClass.newInstance());} catch (final Exception e) {LOGGER.error("Unable to create class {} specified in provider URL {}", factoryClass.getName(), provider.getUrl(), e);}}}if (factories.isEmpty()) {LOGGER.error("Log4j2 could not find a logging implementation. "+ "Please add log4j-core to the classpath. Using SimpleLogger to log to the console...");factory = new SimpleLoggerContextFactory();} else if (factories.size() == 1) {factory = factories.get(factories.lastKey());} else {final StringBuilder sb = new StringBuilder("Multiple logging implementations found: \n");for (final Map.Entry<Integer, LoggerContextFactory> entry : factories.entrySet()) {sb.append("Factory: ").append(entry.getValue().getClass().getName());sb.append(", Weighting: ").append(entry.getKey()).append('\n');}factory = factories.get(factories.lastKey());sb.append("Using factory: ").append(factory.getClass().getName());LOGGER.warn(sb.toString());}} else {LOGGER.error("Log4j2 could not find a logging implementation. "+ "Please add log4j-core to the classpath. Using SimpleLogger to log to the console...");factory = new SimpleLoggerContextFactory();}}}

這段靜態代碼段主要分為下面的幾個步驟:

  • 首先根據特定配置文件的配置信息獲取loggerContextFactory
  • 如果沒有找到對應的Factory的實現類則通過ProviderUtil中的getProviders()方法載入providers,隨后通過provider的loadLoggerContextFactory方法載入LoggerContextFactory的實現類
  • 如果provider中沒有獲取到LoggerContextFactory的實現類或provider為空,則使用SimpleLoggerContextFactory作為LoggerContextFactory。
  • 根據配置文件載入LoggerContextFactory

    // Shortcut binding to force a specific logging implementation.final PropertiesUtil managerProps = PropertiesUtil.getProperties();final String factoryClassName = managerProps.getStringProperty(FACTORY_PROPERTY_NAME);if (factoryClassName != null) {try {factory = LoaderUtil.newCheckedInstanceOf(factoryClassName, LoggerContextFactory.class);} catch (final ClassNotFoundException cnfe) {LOGGER.error("Unable to locate configured LoggerContextFactory {}", factoryClassName);} catch (final Exception ex) {LOGGER.error("Unable to create configured LoggerContextFactory {}", factoryClassName, ex);}}

    在這段邏輯中,LogManager優先通過配置文件”log4j2.component.properties”通過配置項”log4j2.loggerContextFactory”來獲取LoggerContextFactory,如果用戶做了對應的配置,通過newCheckedInstanceOf方法實例化LoggerContextFactory的對象,最終的實現方式為:

    public static <T> T newInstanceOf(final Class<T> clazz)throws InstantiationException, IllegalAccessException, InvocationTargetException {try {return clazz.getConstructor().newInstance();} catch (final NoSuchMethodException ignored) {// FIXME: looking at the code for Class.newInstance(), this seems to do the same thing as abovereturn clazz.newInstance();}}

    在默認情況下,不存在初始的默認配置文件log4j2.component.properties,因此需要從其他途徑獲取LoggerContextFactory。

    通過Provider實例化LoggerContextFactory對象

    代碼:

    if (factory == null) {final SortedMap<Integer, LoggerContextFactory> factories = new TreeMap<>();// note that the following initial call to ProviderUtil may block until a Provider has been installed when// running in an OSGi environmentif (ProviderUtil.hasProviders()) {for (final Provider provider : ProviderUtil.getProviders()) {final Class<? extends LoggerContextFactory> factoryClass = provider.loadLoggerContextFactory();if (factoryClass != null) {try {factories.put(provider.getPriority(), factoryClass.newInstance());} catch (final Exception e) {LOGGER.error("Unable to create class {} specified in provider URL {}", factoryClass.getName(), provider.getUrl(), e);}}}if (factories.isEmpty()) {LOGGER.error("Log4j2 could not find a logging implementation. "+ "Please add log4j-core to the classpath. Using SimpleLogger to log to the console...");factory = new SimpleLoggerContextFactory();} else if (factories.size() == 1) {factory = factories.get(factories.lastKey());} else {final StringBuilder sb = new StringBuilder("Multiple logging implementations found: \n");for (final Map.Entry<Integer, LoggerContextFactory> entry : factories.entrySet()) {sb.append("Factory: ").append(entry.getValue().getClass().getName());sb.append(", Weighting: ").append(entry.getKey()).append('\n');}factory = factories.get(factories.lastKey());sb.append("Using factory: ").append(factory.getClass().getName());LOGGER.warn(sb.toString());}} else {LOGGER.error("Log4j2 could not find a logging implementation. "+ "Please add log4j-core to the classpath. Using SimpleLogger to log to the console...");factory = new SimpleLoggerContextFactory();}}

    這里比較有意思的是hasProviders和getProviders都會通過線程安全的方式去懶加載ProviderUtil這個對象。跟進lazyInit方法:

    protected static void lazyInit() {//noinspection DoubleCheckedLockingif (INSTANCE == null) {try {STARTUP_LOCK.lockInterruptibly();if (INSTANCE == null) {INSTANCE = new ProviderUtil();}} catch (final InterruptedException e) {LOGGER.fatal("Interrupted before Log4j Providers could be loaded.", e);Thread.currentThread().interrupt();} finally {STARTUP_LOCK.unlock();}}}

    再看構造方法:

    private ProviderUtil() {for (final LoaderUtil.UrlResource resource : LoaderUtil.findUrlResources(PROVIDER_RESOURCE)) {loadProvider(resource.getUrl(), resource.getClassLoader());}}

    這里的懶加載其實就是懶加載Provider對象。在創建新的providerUtil實例的過程中就會直接實例化provider對象,其過程是先通過getClassLoaders方法獲取provider的類加載器,然后通過loadProviders(classLoader);加載類。在providerUtil實例化的最后,會統一查找”META-INF/log4j-provider.properties”文件中對應的provider的url,會考慮從遠程加載provider。而loadProviders方法就是在ProviderUtil的PROVIDERS列表中添加對一個的provider。可以看到默認的provider是org.apache.logging.log4j.core.impl.Log4jContextFactory

    LoggerContextFactory = org.apache.logging.log4j.core.impl.Log4jContextFactory Log4jAPIVersion = 2.1.0 FactoryPriority= 10

    很有意思的是這里懶加載加上了鎖,而且使用的是
    lockInterruptibly這個方法。lockInterruptibly和lock的區別如下:

    lock 與 lockInterruptibly比較區別在于:

    lock 優先考慮獲取鎖,待獲取鎖成功后,才響應中斷。
    lockInterruptibly 優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。
    ReentrantLock.lockInterruptibly允許在等待時由其它線程調用等待線程的
    Thread.interrupt 方法來中斷等待線程的等待而直接返回,這時不用獲取鎖,而會拋出一個InterruptedException。 ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測到Thread.isInterrupted,一樣會繼續嘗試獲取鎖,失敗則繼續休眠。只是在最后獲取鎖成功后再把當前線程置為interrupted狀態,然后再中斷線程。

    上面有一句注釋值得注意:

    /*** Guards the ProviderUtil singleton instance from lazy initialization. This is primarily used for OSGi support.** @since 2.1*/protected static final Lock STARTUP_LOCK = new ReentrantLock();// STARTUP_LOCK guards INSTANCE for lazy initialization; this allows the OSGi Activator to pause the startup and// wait for a Provider to be installed. See LOG4J2-373private static volatile ProviderUtil INSTANCE;

    原來這里是為了讓osgi可以阻止啟動。
    再回到logManager:
    可以看到在加載完Provider之后,會做factory的綁定:

    if (factories.isEmpty()) {LOGGER.error("Log4j2 could not find a logging implementation. "+ "Please add log4j-core to the classpath. Using SimpleLogger to log to the console...");factory = new SimpleLoggerContextFactory();} else if (factories.size() == 1) {factory = factories.get(factories.lastKey());} else {final StringBuilder sb = new StringBuilder("Multiple logging implementations found: \n");for (final Map.Entry<Integer, LoggerContextFactory> entry : factories.entrySet()) {sb.append("Factory: ").append(entry.getValue().getClass().getName());sb.append(", Weighting: ").append(entry.getKey()).append('\n');}factory = factories.get(factories.lastKey());sb.append("Using factory: ").append(factory.getClass().getName());LOGGER.warn(sb.toString());}

    到這里,logmanager的啟動流程就結束了。

    配置

    在不使用slf4j的情況下,我們獲取logger的方式是這樣的:

    Logger logger = logManager.getLogger(xx.class)

    跟進getLogger方法:

    public static Logger getLogger(final Class<?> clazz) {final Class<?> cls = callerClass(clazz);return getContext(cls.getClassLoader(), false).getLogger(toLoggerName(cls));}

    這里有一個getContext方法,跟進,

    public static LoggerContext getContext(final ClassLoader loader, final boolean currentContext) {try {return factory.getContext(FQCN, loader, null, currentContext);} catch (final IllegalStateException ex) {LOGGER.warn(ex.getMessage() + " Using SimpleLogger");return new SimpleLoggerContextFactory().getContext(FQCN, loader, null, currentContext);}}

    上文提到factory的具體實現是Log4jContextFactory,跟進getContext
    方法:

    public LoggerContext getContext(final String fqcn, final ClassLoader loader, final Object externalContext,final boolean currentContext) {final LoggerContext ctx = selector.getContext(fqcn, loader, currentContext);if (externalContext != null && ctx.getExternalContext() == null) {ctx.setExternalContext(externalContext);}if (ctx.getState() == LifeCycle.State.INITIALIZED) {ctx.start();}return ctx;}

    直接看start:

    public void start() {LOGGER.debug("Starting LoggerContext[name={}, {}]...", getName(), this);if (PropertiesUtil.getProperties().getBooleanProperty("log4j.LoggerContext.stacktrace.on.start", false)) {LOGGER.debug("Stack trace to locate invoker",new Exception("Not a real error, showing stack trace to locate invoker"));}if (configLock.tryLock()) {try {if (this.isInitialized() || this.isStopped()) {this.setStarting();reconfigure();if (this.configuration.isShutdownHookEnabled()) {setUpShutdownHook();}this.setStarted();}} finally {configLock.unlock();}}LOGGER.debug("LoggerContext[name={}, {}] started OK.", getName(), this);}

    發現其中的核心方法是reconfigure方法,繼續跟進:

    private void reconfigure(final URI configURI) {final ClassLoader cl = ClassLoader.class.isInstance(externalContext) ? (ClassLoader) externalContext : null;LOGGER.debug("Reconfiguration started for context[name={}] at URI {} ({}) with optional ClassLoader: {}",contextName, configURI, this, cl);final Configuration instance = ConfigurationFactory.getInstance().getConfiguration(this, contextName, configURI, cl);if (instance == null) {LOGGER.error("Reconfiguration failed: No configuration found for '{}' at '{}' in '{}'", contextName, configURI, cl);} else {setConfiguration(instance);/** instance.start(); Configuration old = setConfiguration(instance); updateLoggers(); if (old != null) {* old.stop(); }*/final String location = configuration == null ? "?" : String.valueOf(configuration.getConfigurationSource());LOGGER.debug("Reconfiguration complete for context[name={}] at URI {} ({}) with optional ClassLoader: {}",contextName, location, this, cl);}}

    可以看到每一個configuration都是從ConfigurationFactory拿出來的,我們先看看這個類的getInstance看看:

    public static ConfigurationFactory getInstance() {// volatile works in Java 1.6+, so double-checked locking also works properly//noinspection DoubleCheckedLockingif (factories == null) {LOCK.lock();try {if (factories == null) {final List<ConfigurationFactory> list = new ArrayList<ConfigurationFactory>();final String factoryClass = PropertiesUtil.getProperties().getStringProperty(CONFIGURATION_FACTORY_PROPERTY);if (factoryClass != null) {addFactory(list, factoryClass);}final PluginManager manager = new PluginManager(CATEGORY);manager.collectPlugins();final Map<String, PluginType<?>> plugins = manager.getPlugins();final List<Class<? extends ConfigurationFactory>> ordered =new ArrayList<Class<? extends ConfigurationFactory>>(plugins.size());for (final PluginType<?> type : plugins.values()) {try {ordered.add(type.getPluginClass().asSubclass(ConfigurationFactory.class));} catch (final Exception ex) {LOGGER.warn("Unable to add class {}", type.getPluginClass(), ex);}}Collections.sort(ordered, OrderComparator.getInstance());for (final Class<? extends ConfigurationFactory> clazz : ordered) {addFactory(list, clazz);}// see above comments about double-checked locking//noinspection NonThreadSafeLazyInitializationfactories = Collections.unmodifiableList(list);}} finally {LOCK.unlock();}}LOGGER.debug("Using configurationFactory {}", configFactory);return configFactory;}

    這里可以看到ConfigurationFactory中利用了PluginManager來進行初始化,PluginManager會將ConfigurationFactory的子類加載進來,默認使用的XmlConfigurationFactory,JsonConfigurationFactory,YamlConfigurationFactory這三個子類,這里插件化加載暫時按下不表。
    回到reconfigure這個方法,我們看到獲取ConfigurationFactory實例之后會去調用getConfiguration方法:

    public Configuration getConfiguration(final String name, final URI configLocation, final ClassLoader loader) {if (!isActive()) {return null;}if (loader == null) {return getConfiguration(name, configLocation);}if (isClassLoaderUri(configLocation)) {final String path = extractClassLoaderUriPath(configLocation);final ConfigurationSource source = getInputFromResource(path, loader);if (source != null) {final Configuration configuration = getConfiguration(source);if (configuration != null) {return configuration;}}}return getConfiguration(name, configLocation);}

    跟進getConfiguration,這里值得注意的是有很多個getConfiguration,注意甄別,如果不確定的話可以通過debug的方式來確定。

    public Configuration getConfiguration(final String name, final URI configLocation) {if (configLocation == null) {final String config = this.substitutor.replace(PropertiesUtil.getProperties().getStringProperty(CONFIGURATION_FILE_PROPERTY));if (config != null) {ConfigurationSource source = null;try {source = getInputFromUri(FileUtils.getCorrectedFilePathUri(config));} catch (final Exception ex) {// Ignore the error and try as a String.LOGGER.catching(Level.DEBUG, ex);}if (source == null) {final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();source = getInputFromString(config, loader);}if (source != null) {for (final ConfigurationFactory factory : factories) {final String[] types = factory.getSupportedTypes();if (types != null) {for (final String type : types) {if (type.equals("*") || config.endsWith(type)) {final Configuration c = factory.getConfiguration(source);if (c != null) {return c;}}}}}}}} else {for (final ConfigurationFactory factory : factories) {final String[] types = factory.getSupportedTypes();if (types != null) {for (final String type : types) {if (type.equals("*") || configLocation.toString().endsWith(type)) {final Configuration config = factory.getConfiguration(name, configLocation);if (config != null) {return config;}}}}}}Configuration config = getConfiguration(true, name);if (config == null) {config = getConfiguration(true, null);if (config == null) {config = getConfiguration(false, name);if (config == null) {config = getConfiguration(false, null);}}}if (config != null) {return config;}LOGGER.error("No log4j2 configuration file found. Using default configuration: logging only errors to the console.");return new DefaultConfiguration();}

    這里就會根據之前加載進來的factory進行配置的獲取,具體的不再解析。
    回到reconfigure,之后的步驟就是setConfiguration,入參就是剛才獲取的config

    private synchronized Configuration setConfiguration(final Configuration config) {Assert.requireNonNull(config, "No Configuration was provided");final Configuration prev = this.config;config.addListener(this);final ConcurrentMap<String, String> map = config.getComponent(Configuration.CONTEXT_PROPERTIES);try { // LOG4J2-719 network access may throw android.os.NetworkOnMainThreadExceptionmap.putIfAbsent("hostName", NetUtils.getLocalHostname());} catch (final Exception ex) {LOGGER.debug("Ignoring {}, setting hostName to 'unknown'", ex.toString());map.putIfAbsent("hostName", "unknown");}map.putIfAbsent("contextName", name);config.start();this.config = config;updateLoggers();if (prev != null) {prev.removeListener(this);prev.stop();}firePropertyChangeEvent(new PropertyChangeEvent(this, PROPERTY_CONFIG, prev, config));try {Server.reregisterMBeansAfterReconfigure();} catch (final Throwable t) {// LOG4J2-716: Android has no java.lang.managementLOGGER.error("Could not reconfigure JMX", t);}return prev;}

    這個方法最重要的步驟就是config.start,這才是真正做配置解析的

    public void start() {LOGGER.debug("Starting configuration {}", this);this.setStarting();pluginManager.collectPlugins(pluginPackages);final PluginManager levelPlugins = new PluginManager(Level.CATEGORY);levelPlugins.collectPlugins(pluginPackages);final Map<String, PluginType<?>> plugins = levelPlugins.getPlugins();if (plugins != null) {for (final PluginType<?> type : plugins.values()) {try {// Cause the class to be initialized if it isn't already.Loader.initializeClass(type.getPluginClass().getName(), type.getPluginClass().getClassLoader());} catch (final Exception e) {LOGGER.error("Unable to initialize {} due to {}", type.getPluginClass().getName(), e.getClass().getSimpleName(), e);}}}setup();setupAdvertisement();doConfigure();final Set<LoggerConfig> alreadyStarted = new HashSet<LoggerConfig>();for (final LoggerConfig logger : loggers.values()) {logger.start();alreadyStarted.add(logger);}for (final Appender appender : appenders.values()) {appender.start();}if (!alreadyStarted.contains(root)) { // LOG4J2-392root.start(); // LOG4J2-336}super.start();LOGGER.debug("Started configuration {} OK.", this);}

    這里面有如下步驟:

  • 獲取日志等級的插件
  • 初始化
  • 初始化Advertiser
  • 配置
  • 先看一下初始化,也就是setup這個方法,setup是一個需要被復寫的方法,我們以XMLConfiguration作為例子,

    @Overridepublic void setup() {if (rootElement == null) {LOGGER.error("No logging configuration");return;}constructHierarchy(rootNode, rootElement);if (status.size() > 0) {for (final Status s : status) {LOGGER.error("Error processing element {}: {}", s.name, s.errorType);}return;}rootElement = null;}

    發現這里面有一個比較重要的方法constructHierarchy,跟進:

    private void constructHierarchy(final Node node, final Element element) {processAttributes(node, element);final StringBuilder buffer = new StringBuilder();final NodeList list = element.getChildNodes();final List<Node> children = node.getChildren();for (int i = 0; i < list.getLength(); i++) {final org.w3c.dom.Node w3cNode = list.item(i);if (w3cNode instanceof Element) {final Element child = (Element) w3cNode;final String name = getType(child);final PluginType<?> type = pluginManager.getPluginType(name);final Node childNode = new Node(node, name, type);constructHierarchy(childNode, child);if (type == null) {final String value = childNode.getValue();if (!childNode.hasChildren() && value != null) {node.getAttributes().put(name, value);} else {status.add(new Status(name, element, ErrorType.CLASS_NOT_FOUND));}} else {children.add(childNode);}} else if (w3cNode instanceof Text) {final Text data = (Text) w3cNode;buffer.append(data.getData());}}final String text = buffer.toString().trim();if (text.length() > 0 || (!node.hasChildren() && !node.isRoot())) {node.setValue(text);}}

    發現這個就是一個樹遍歷的過程。誠然,配置文件是以xml的形式給出的,xml的結構就是一個樹形結構。回到start方法,跟進doConfiguration:

    protected void doConfigure() {if (rootNode.hasChildren() && rootNode.getChildren().get(0).getName().equalsIgnoreCase("Properties")) {final Node first = rootNode.getChildren().get(0);createConfiguration(first, null);if (first.getObject() != null) {subst.setVariableResolver((StrLookup) first.getObject());}} else {final Map<String, String> map = this.getComponent(CONTEXT_PROPERTIES);final StrLookup lookup = map == null ? null : new MapLookup(map);subst.setVariableResolver(new Interpolator(lookup, pluginPackages));}boolean setLoggers = false;boolean setRoot = false;for (final Node child : rootNode.getChildren()) {if (child.getName().equalsIgnoreCase("Properties")) {if (tempLookup == subst.getVariableResolver()) {LOGGER.error("Properties declaration must be the first element in the configuration");}continue;}createConfiguration(child, null);if (child.getObject() == null) {continue;}if (child.getName().equalsIgnoreCase("Appenders")) {appenders = child.getObject();} else if (child.isInstanceOf(Filter.class)) {addFilter(child.getObject(Filter.class));} else if (child.getName().equalsIgnoreCase("Loggers")) {final Loggers l = child.getObject();loggers = l.getMap();setLoggers = true;if (l.getRoot() != null) {root = l.getRoot();setRoot = true;}} else if (child.getName().equalsIgnoreCase("CustomLevels")) {customLevels = child.getObject(CustomLevels.class).getCustomLevels();} else if (child.isInstanceOf(CustomLevelConfig.class)) {final List<CustomLevelConfig> copy = new ArrayList<CustomLevelConfig>(customLevels);copy.add(child.getObject(CustomLevelConfig.class));customLevels = copy;} else {LOGGER.error("Unknown object \"{}\" of type {} is ignored.", child.getName(),child.getObject().getClass().getName());}}if (!setLoggers) {LOGGER.warn("No Loggers were configured, using default. Is the Loggers element missing?");setToDefault();return;} else if (!setRoot) {LOGGER.warn("No Root logger was configured, creating default ERROR-level Root logger with Console appender");setToDefault();// return; // LOG4J2-219: creating default root=ok, but don't exclude configured Loggers}for (final Map.Entry<String, LoggerConfig> entry : loggers.entrySet()) {final LoggerConfig l = entry.getValue();for (final AppenderRef ref : l.getAppenderRefs()) {final Appender app = appenders.get(ref.getRef());if (app != null) {l.addAppender(app, ref.getLevel(), ref.getFilter());} else {LOGGER.error("Unable to locate appender {} for logger {}", ref.getRef(), l.getName());}}}setParents();}

    發現就是對剛剛獲取的configuration進行解析,然后塞進正確的地方。回到start方法,可以看到昨晚配置之后就是開啟logger和appender了。

    異步

    AsyncAppender

    log4j2突出于其他日志的優勢,異步日志實現。我們先從日志打印看進去。找到Logger,隨便找一個log日志的方法。

    public void debug(final Marker marker, final Message msg) {logIfEnabled(FQCN, Level.DEBUG, marker, msg, msg != null ? msg.getThrowable() : null);}

    一路跟進

    @PerformanceSensitive// NOTE: This is a hot method. Current implementation compiles to 29 bytes of byte code.// This is within the 35 byte MaxInlineSize threshold. Modify with care!private void logMessageTrackRecursion(final String fqcn,final Level level,final Marker marker,final Message msg,final Throwable throwable) {try {incrementRecursionDepth(); // LOG4J2-1518, LOG4J2-2031tryLogMessage(fqcn, level, marker, msg, throwable);} finally {decrementRecursionDepth();}}

    可以看出這個在打日志之前做了調用次數的記錄。跟進tryLogMessage,

    @PerformanceSensitive// NOTE: This is a hot method. Current implementation compiles to 26 bytes of byte code.// This is within the 35 byte MaxInlineSize threshold. Modify with care!private void tryLogMessage(final String fqcn,final Level level,final Marker marker,final Message msg,final Throwable throwable) {try {logMessage(fqcn, level, marker, msg, throwable);} catch (final Exception e) {// LOG4J2-1990 Log4j2 suppresses all exceptions that occur once application called the loggerhandleLogMessageException(e, fqcn, msg);}}

    繼續跟進:

    @Overridepublic void logMessage(final String fqcn, final Level level, final Marker marker, final Message message,final Throwable t) {final Message msg = message == null ? new SimpleMessage(Strings.EMPTY) : message;final ReliabilityStrategy strategy = privateConfig.loggerConfig.getReliabilityStrategy();strategy.log(this, getName(), fqcn, marker, level, msg, t);}

    這里可以看到在實際打日志的時候,會從config中獲取打日志的策略,跟蹤ReliabilityStrategy的創建,發現默認的實現類為DefaultReliabilityStrategy,跟進看實際打日志的方法

    @Overridepublic void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn, final Marker marker, final Level level,final Message data, final Throwable t) {loggerConfig.log(loggerName, fqcn, marker, level, data, t);}

    這里實際打日志的方法居然是交給一個config去實現的。。。感覺有點奇怪。。跟進看看

    @PerformanceSensitive("allocation")public void log(final String loggerName, final String fqcn, final Marker marker, final Level level,final Message data, final Throwable t) {List<Property> props = null;if (!propertiesRequireLookup) {props = properties;} else {if (properties != null) {props = new ArrayList<>(properties.size());final LogEvent event = Log4jLogEvent.newBuilder().setMessage(data).setMarker(marker).setLevel(level).setLoggerName(loggerName).setLoggerFqcn(fqcn).setThrown(t).build();for (int i = 0; i < properties.size(); i++) {final Property prop = properties.get(i);final String value = prop.isValueNeedsLookup() // since LOG4J2-1575? config.getStrSubstitutor().replace(event, prop.getValue()) //: prop.getValue();props.add(Property.createProperty(prop.getName(), value));}}}final LogEvent logEvent = logEventFactory.createEvent(loggerName, marker, fqcn, level, data, props, t);try {log(logEvent, LoggerConfigPredicate.ALL);} finally {// LOG4J2-1583 prevent scrambled logs when logging calls are nested (logging in toString())ReusableLogEventFactory.release(logEvent);}}

    可以清楚的看到try之前是在創建LogEvent,try里面做的才是真正的log(好tm累),一路跟進。

    private void processLogEvent(final LogEvent event, LoggerConfigPredicate predicate) {event.setIncludeLocation(isIncludeLocation());if (predicate.allow(this)) {callAppenders(event);}logParent(event, predicate);}

    接下來就是callAppender了,我們直接開始看AsyncAppender的append方法:

    /*** Actual writing occurs here.** @param logEvent The LogEvent.*/@Overridepublic void append(final LogEvent logEvent) {if (!isStarted()) {throw new IllegalStateException("AsyncAppender " + getName() + " is not active");}final Log4jLogEvent memento = Log4jLogEvent.createMemento(logEvent, includeLocation);InternalAsyncUtil.makeMessageImmutable(logEvent.getMessage());if (!transfer(memento)) {if (blocking) {if (AbstractLogger.getRecursionDepth() > 1) { // LOG4J2-1518, LOG4J2-2031// If queue is full AND we are in a recursive call, call appender directly to prevent deadlockAsyncQueueFullMessageUtil.logWarningToStatusLogger();logMessageInCurrentThread(logEvent);} else {// delegate to the event router (which may discard, enqueue and block, or log in current thread)final EventRoute route = asyncQueueFullPolicy.getRoute(thread.getId(), memento.getLevel());route.logMessage(this, memento);}} else {error("Appender " + getName() + " is unable to write primary appenders. queue is full");logToErrorAppenderIfNecessary(false, memento);}}}

    這里主要的步驟就是:

  • 生成logEvent
  • 將logEvent放入BlockingQueue,就是transfer方法
  • 如果BlockingQueue滿了則啟用相應的策略
  • 同樣的,這里也有一個線程用來做異步消費的事情

    private class AsyncThread extends Log4jThread {private volatile boolean shutdown = false;private final List<AppenderControl> appenders;private final BlockingQueue<LogEvent> queue;public AsyncThread(final List<AppenderControl> appenders, final BlockingQueue<LogEvent> queue) {super("AsyncAppender-" + THREAD_SEQUENCE.getAndIncrement());this.appenders = appenders;this.queue = queue;setDaemon(true);}@Overridepublic void run() {while (!shutdown) {LogEvent event;try {event = queue.take();if (event == SHUTDOWN_LOG_EVENT) {shutdown = true;continue;}} catch (final InterruptedException ex) {break; // LOG4J2-830}event.setEndOfBatch(queue.isEmpty());final boolean success = callAppenders(event);if (!success && errorAppender != null) {try {errorAppender.callAppender(event);} catch (final Exception ex) {// Silently accept the error.}}}// Process any remaining items in the queue.LOGGER.trace("AsyncAppender.AsyncThread shutting down. Processing remaining {} queue events.",queue.size());int count = 0;int ignored = 0;while (!queue.isEmpty()) {try {final LogEvent event = queue.take();if (event instanceof Log4jLogEvent) {final Log4jLogEvent logEvent = (Log4jLogEvent) event;logEvent.setEndOfBatch(queue.isEmpty());callAppenders(logEvent);count++;} else {ignored++;LOGGER.trace("Ignoring event of class {}", event.getClass().getName());}} catch (final InterruptedException ex) {// May have been interrupted to shut down.// Here we ignore interrupts and try to process all remaining events.}}LOGGER.trace("AsyncAppender.AsyncThread stopped. Queue has {} events remaining. "+ "Processed {} and ignored {} events since shutdown started.", queue.size(), count, ignored);}/*** Calls {@link AppenderControl#callAppender(LogEvent) callAppender} on all registered {@code AppenderControl}* objects, and returns {@code true} if at least one appender call was successful, {@code false} otherwise. Any* exceptions are silently ignored.** @param event the event to forward to the registered appenders* @return {@code true} if at least one appender call succeeded, {@code false} otherwise*/boolean callAppenders(final LogEvent event) {boolean success = false;for (final AppenderControl control : appenders) {try {control.callAppender(event);success = true;} catch (final Exception ex) {// If no appender is successful the error appender will get it.}}return success;}public void shutdown() {shutdown = true;if (queue.isEmpty()) {queue.offer(SHUTDOWN_LOG_EVENT);}if (getState() == State.TIMED_WAITING || getState() == State.WAITING) {this.interrupt(); // LOG4J2-1422: if underlying appender is stuck in wait/sleep/join/park call}}}

    直接看run方法:

  • 阻塞獲取logEvent
  • 將logEvent分發出去
  • 如果線程要退出了,將blockingQueue里面的event消費完在退出。
  • AsyncLogger

    直接從AsyncLogger的logMessage看進去:

    public void logMessage(final String fqcn, final Level level, final Marker marker, final Message message,final Throwable thrown) {if (loggerDisruptor.isUseThreadLocals()) {logWithThreadLocalTranslator(fqcn, level, marker, message, thrown);} else {// LOG4J2-1172: avoid storing non-JDK classes in ThreadLocals to avoid memory leaks in web appslogWithVarargTranslator(fqcn, level, marker, message, thrown);}}

    跟進logWithThreadLocalTranslator,

    private void logWithThreadLocalTranslator(final String fqcn, final Level level, final Marker marker,final Message message, final Throwable thrown) {// Implementation note: this method is tuned for performance. MODIFY WITH CARE!final RingBufferLogEventTranslator translator = getCachedTranslator();initTranslator(translator, fqcn, level, marker, message, thrown);initTranslatorThreadValues(translator);publish(translator);}

    這里的邏輯很簡單,就是將日志相關的信息轉換成RingBufferLogEvent(RingBuffer是Disruptor的無所隊列),然后將其發布到RingBuffer中。發布到RingBuffer中,那肯定也有消費邏輯。這時候有兩種方式可以找到這個消費的邏輯。

    • 找disruptor被使用的地方,然后查看,但是這樣做會很容易迷惑
    • 按照Log4j2的尿性,這種Logger都有對應的start方法,我們可以從start方法入手尋找

    在start方法中,我們找到了一段代碼:

    final RingBufferLogEventHandler[] handlers = {new RingBufferLogEventHandler()};disruptor.handleEventsWith(handlers);

    直接看看這個RingBufferLogEventHandler的實現:

    public class RingBufferLogEventHandler implementsSequenceReportingEventHandler<RingBufferLogEvent>, LifecycleAware {private static final int NOTIFY_PROGRESS_THRESHOLD = 50;private Sequence sequenceCallback;private int counter;private long threadId = -1;@Overridepublic void setSequenceCallback(final Sequence sequenceCallback) {this.sequenceCallback = sequenceCallback;}@Overridepublic void onEvent(final RingBufferLogEvent event, final long sequence,final boolean endOfBatch) throws Exception {event.execute(endOfBatch);event.clear();// notify the BatchEventProcessor that the sequence has progressed.// Without this callback the sequence would not be progressed// until the batch has completely finished.if (++counter > NOTIFY_PROGRESS_THRESHOLD) {sequenceCallback.set(sequence);counter = 0;}}/*** Returns the thread ID of the background consumer thread, or {@code -1} if the background thread has not started* yet.* @return the thread ID of the background consumer thread, or {@code -1}*/public long getThreadId() {return threadId;}@Overridepublic void onStart() {threadId = Thread.currentThread().getId();}@Overridepublic void onShutdown() {} }

    順著接口找上去,發現一個接口:

    /*** Callback interface to be implemented for processing events as they become available in the {@link RingBuffer}** @param <T> event implementation storing the data for sharing during exchange or parallel coordination of an event.* @see BatchEventProcessor#setExceptionHandler(ExceptionHandler) if you want to handle exceptions propagated out of the handler.*/ public interface EventHandler<T> {/*** Called when a publisher has published an event to the {@link RingBuffer}** @param event published to the {@link RingBuffer}* @param sequence of the event being processed* @param endOfBatch flag to indicate if this is the last event in a batch from the {@link RingBuffer}* @throws Exception if the EventHandler would like the exception handled further up the chain.*/void onEvent(T event, long sequence, boolean endOfBatch) throws Exception; }

    通過注釋可以發現,這個onEvent就是處理邏輯,回到RingBufferLogEventHandler的onEvent方法,發現里面有一個execute方法,跟進:

    public void execute(final boolean endOfBatch) {this.endOfBatch = endOfBatch;asyncLogger.actualAsyncLog(this);}

    這個方法就是實際打日志了,AsyncLogger看起來還是比較簡單的,只是使用了一個Disruptor。

    插件化

    之前在很多代碼里面都可以看到

    final PluginManager manager = new PluginManager(CATEGORY); manager.collectPlugins(pluginPackages);

    其實整個log4j2為了獲得更好的擴展性,將自己的很多組件都做成了插件,然后在配置的時候去加載plugin。
    跟進collectPlugins。

    public void collectPlugins(final List<String> packages) {final String categoryLowerCase = category.toLowerCase();final Map<String, PluginType<?>> newPlugins = new LinkedHashMap<>();// First, iterate the Log4j2Plugin.dat files found in the main CLASSPATHMap<String, List<PluginType<?>>> builtInPlugins = PluginRegistry.getInstance().loadFromMainClassLoader();if (builtInPlugins.isEmpty()) {// If we didn't find any plugins above, someone must have messed with the log4j-core.jar.// Search the standard package in the hopes we can find our core plugins.builtInPlugins = PluginRegistry.getInstance().loadFromPackage(LOG4J_PACKAGES);}mergeByName(newPlugins, builtInPlugins.get(categoryLowerCase));// Next, iterate any Log4j2Plugin.dat files from OSGi Bundlesfor (final Map<String, List<PluginType<?>>> pluginsByCategory : PluginRegistry.getInstance().getPluginsByCategoryByBundleId().values()) {mergeByName(newPlugins, pluginsByCategory.get(categoryLowerCase));}// Next iterate any packages passed to the static addPackage method.for (final String pkg : PACKAGES) {mergeByName(newPlugins, PluginRegistry.getInstance().loadFromPackage(pkg).get(categoryLowerCase));}// Finally iterate any packages provided in the configuration (note these can be changed at runtime).if (packages != null) {for (final String pkg : packages) {mergeByName(newPlugins, PluginRegistry.getInstance().loadFromPackage(pkg).get(categoryLowerCase));}}LOGGER.debug("PluginManager '{}' found {} plugins", category, newPlugins.size());plugins = newPlugins;}

    處理邏輯如下:

  • 從Log4j2Plugin.dat中加載所有的內置的plugin
  • 然后將OSGi Bundles中的Log4j2Plugin.dat中的plugin加載進來
  • 再加載傳入的package路徑中的plugin
  • 最后加載配置中的plugin
  • 邏輯還是比較簡單的,但是我在看源碼的時候發現了一個很有意思的東西,就是在加載log4j2 core插件的時候,也就是

    PluginRegistry.getInstance().loadFromMainClassLoader()

    這個方法,跟進到decodeCacheFiles:

    private Map<String, List<PluginType<?>>> decodeCacheFiles(final ClassLoader loader) {final long startTime = System.nanoTime();final PluginCache cache = new PluginCache();try {final Enumeration<URL> resources = loader.getResources(PluginProcessor.PLUGIN_CACHE_FILE);if (resources == null) {LOGGER.info("Plugin preloads not available from class loader {}", loader);} else {cache.loadCacheFiles(resources);}} catch (final IOException ioe) {LOGGER.warn("Unable to preload plugins", ioe);}final Map<String, List<PluginType<?>>> newPluginsByCategory = new HashMap<>();int pluginCount = 0;for (final Map.Entry<String, Map<String, PluginEntry>> outer : cache.getAllCategories().entrySet()) {final String categoryLowerCase = outer.getKey();final List<PluginType<?>> types = new ArrayList<>(outer.getValue().size());newPluginsByCategory.put(categoryLowerCase, types);for (final Map.Entry<String, PluginEntry> inner : outer.getValue().entrySet()) {final PluginEntry entry = inner.getValue();final String className = entry.getClassName();try {final Class<?> clazz = loader.loadClass(className);final PluginType<?> type = new PluginType<>(entry, clazz, entry.getName());types.add(type);++pluginCount;} catch (final ClassNotFoundException e) {LOGGER.info("Plugin [{}] could not be loaded due to missing classes.", className, e);} catch (final LinkageError e) {LOGGER.info("Plugin [{}] could not be loaded due to linkage error.", className, e);}}}final long endTime = System.nanoTime();final DecimalFormat numFormat = new DecimalFormat("#0.000000");final double seconds = (endTime - startTime) * 1e-9;LOGGER.debug("Took {} seconds to load {} plugins from {}",numFormat.format(seconds), pluginCount, loader);return newPluginsByCategory;}

    可以發現加載時候是從一個文件(PLUGIN_CACHE_FILE)獲取所有要獲取的plugin。看到這里的時候我有一個疑惑就是,為什么不用反射的方式直接去掃描,而是要從文件中加載進來,而且文件是寫死的,很不容易擴展啊。然后我找了一下PLUGIN_CACHE_FILE這個靜態變量的用處,發現了PluginProcessor這個類,這里用到了注解處理器。

    /*** Annotation processor for pre-scanning Log4j 2 plugins.*/ @SupportedAnnotationTypes("org.apache.logging.log4j.core.config.plugins.*") public class PluginProcessor extends AbstractProcessor {// TODO: this could be made more abstract to allow for compile-time and run-time plugin processing/*** The location of the plugin cache data file. This file is written to by this processor, and read from by* {@link org.apache.logging.log4j.core.config.plugins.util.PluginManager}.*/public static final String PLUGIN_CACHE_FILE ="META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat";private final PluginCache pluginCache = new PluginCache();@Overridepublic boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {System.out.println("Processing annotations");try {final Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Plugin.class);if (elements.isEmpty()) {System.out.println("No elements to process");return false;}collectPlugins(elements);writeCacheFile(elements.toArray(new Element[elements.size()]));System.out.println("Annotations processed");return true;} catch (final IOException e) {e.printStackTrace();error(e.getMessage());return false;} catch (final Exception ex) {ex.printStackTrace();error(ex.getMessage());return false;}} }

    (不太重要的方法省略)
    我們可以看到在process方法中,PluginProcessor會先收集所有的Plugin,然后在寫入文件。這樣做的好處就是可以省去反射時候的開銷。
    然后我又看了一下Plugin這個注解,發現它的RetentionPolicy是RUNTIME,一般來說PluginProcessor是搭配RetentionPolicy.SOURCE,CLASS使用的,而且既然你把自己的Plugin掃描之后寫在文件中了,RetentionPolicy就沒有必要是RUNTIME了吧,這個是一個很奇怪的地方。

    小結

    總算是把Log4j2的代碼看完了,發現它的設計理念很值得借鑒,為了靈活性,所有的東西都設計成插件式。互聯網技術日益發展,各種中間件層出不窮,而作為工程師的我們更需要做的是去思考代碼與代碼之間的關系,毫無疑問的是,解耦是最具有美感的關系。


    原文鏈接
    本文為云棲社區原創內容,未經允許不得轉載。

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的探索Java日志的奥秘:底层日志系统-log4j2的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产午夜亚洲精品不卡 | 久久99精品久久久久久 | 无码免费一区二区三区 | 粗大的内捧猛烈进出视频 | 一个人看的www免费视频在线观看 | 又紧又大又爽精品一区二区 | 国产成人精品视频ⅴa片软件竹菊 | 天天爽夜夜爽夜夜爽 | 色妞www精品免费视频 | 成人无码精品一区二区三区 | 欧美性黑人极品hd | 国产小呦泬泬99精品 | 日韩精品无码一区二区中文字幕 | 一个人免费观看的www视频 | 秋霞成人午夜鲁丝一区二区三区 | 蜜桃视频韩日免费播放 | 99精品无人区乱码1区2区3区 | 久久精品人妻少妇一区二区三区 | 少妇人妻大乳在线视频 | 无码一区二区三区在线观看 | 成人精品一区二区三区中文字幕 | 亚洲精品国产品国语在线观看 | 中文久久乱码一区二区 | 中文字幕无码热在线视频 | 天海翼激烈高潮到腰振不止 | 在线观看国产一区二区三区 | 少妇性l交大片欧洲热妇乱xxx | 日本又色又爽又黄的a片18禁 | 无码人妻丰满熟妇区五十路百度 | 国产精品99久久精品爆乳 | 精品久久久久久人妻无码中文字幕 | 九月婷婷人人澡人人添人人爽 | 无码乱肉视频免费大全合集 | 久久久久se色偷偷亚洲精品av | 牲欲强的熟妇农村老妇女视频 | 又粗又大又硬又长又爽 | 成 人影片 免费观看 | 97久久超碰中文字幕 | 免费中文字幕日韩欧美 | 久久99精品国产麻豆 | 亚洲国产精品无码久久久久高潮 | 无码纯肉视频在线观看 | 国产成人综合在线女婷五月99播放 | 久久综合久久自在自线精品自 | 亚洲国产精品美女久久久久 | 欧美性猛交内射兽交老熟妇 | 日韩人妻系列无码专区 | 伊人久久大香线蕉午夜 | 国产一区二区三区日韩精品 | 精品久久久中文字幕人妻 | 露脸叫床粗话东北少妇 | 55夜色66夜色国产精品视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 永久免费观看美女裸体的网站 | ass日本丰满熟妇pics | 国产特级毛片aaaaaaa高清 | 国内老熟妇对白xxxxhd | 欧美喷潮久久久xxxxx | 无人区乱码一区二区三区 | 国产成人无码区免费内射一片色欲 | 老熟妇乱子伦牲交视频 | 无码一区二区三区在线 | 老熟女乱子伦 | 天堂在线观看www | 无码人妻丰满熟妇区毛片18 | 国产麻豆精品一区二区三区v视界 | 精品欧洲av无码一区二区三区 | 蜜桃臀无码内射一区二区三区 | 综合激情五月综合激情五月激情1 | 久久无码中文字幕免费影院蜜桃 | 成人无码视频在线观看网站 | 人人超人人超碰超国产 | 少妇被黑人到高潮喷出白浆 | 欧美老妇与禽交 | 国产色xx群视频射精 | 草草网站影院白丝内射 | 国产高清不卡无码视频 | 免费视频欧美无人区码 | 双乳奶水饱满少妇呻吟 | 丰满岳乱妇在线观看中字无码 | 国产激情无码一区二区 | 国产成人精品优优av | 成 人影片 免费观看 | 国产精品igao视频网 | 少妇无码av无码专区在线观看 | 在线观看国产午夜福利片 | 国产精品亚洲一区二区三区喷水 | 亚洲欧美国产精品久久 | 一本久久a久久精品亚洲 | 日本护士毛茸茸高潮 | 国产精品-区区久久久狼 | 日韩少妇白浆无码系列 | 久久99精品久久久久婷婷 | 色婷婷香蕉在线一区二区 | 久久天天躁夜夜躁狠狠 | 久久97精品久久久久久久不卡 | 美女张开腿让人桶 | 久久久久久久女国产乱让韩 | 日韩亚洲欧美精品综合 | 水蜜桃色314在线观看 | 亚洲日韩av一区二区三区中文 | 两性色午夜免费视频 | 欧美真人作爱免费视频 | 天天摸天天碰天天添 | 久久国产精品精品国产色婷婷 | 中文字幕无码免费久久99 | 亚洲 激情 小说 另类 欧美 | 免费人成网站视频在线观看 | 人人妻人人澡人人爽精品欧美 | 97精品人妻一区二区三区香蕉 | 欧美日韩人成综合在线播放 | 九九热爱视频精品 | 国产av一区二区精品久久凹凸 | 成在人线av无码免观看麻豆 | 97久久超碰中文字幕 | 色婷婷综合激情综在线播放 | 日本精品人妻无码免费大全 | 国产乱子伦视频在线播放 | 久久无码专区国产精品s | 日本熟妇乱子伦xxxx | 日本护士毛茸茸高潮 | 图片区 小说区 区 亚洲五月 | 亚洲精品国产精品乱码视色 | 亚洲精品久久久久中文第一幕 | 国产精品丝袜黑色高跟鞋 | 午夜精品久久久内射近拍高清 | 色一情一乱一伦一视频免费看 | 熟妇女人妻丰满少妇中文字幕 | 欧美怡红院免费全部视频 | 国产精品内射视频免费 | 中文字幕无线码 | 无码人妻精品一区二区三区不卡 | 国产激情一区二区三区 | 日本免费一区二区三区最新 | 动漫av一区二区在线观看 | 六月丁香婷婷色狠狠久久 | 真人与拘做受免费视频 | 亚洲中文字幕av在天堂 | 又大又硬又爽免费视频 | 丰满人妻精品国产99aⅴ | 久久亚洲精品中文字幕无男同 | 亚洲中文无码av永久不收费 | 亚洲国产av精品一区二区蜜芽 | 亚洲色在线无码国产精品不卡 | 色窝窝无码一区二区三区色欲 | 嫩b人妻精品一区二区三区 | 成人无码视频免费播放 | 欧美野外疯狂做受xxxx高潮 | 人人妻人人藻人人爽欧美一区 | 亚洲va中文字幕无码久久不卡 | 成人亚洲精品久久久久 | 无码纯肉视频在线观看 | 乌克兰少妇xxxx做受 | 久久久中文久久久无码 | 久久人人爽人人爽人人片av高清 | 久久人人爽人人人人片 | 成人试看120秒体验区 | 国产乱人伦av在线无码 | 精品久久8x国产免费观看 | 久久精品国产精品国产精品污 | 久久熟妇人妻午夜寂寞影院 | 无码国产色欲xxxxx视频 | aa片在线观看视频在线播放 | 最新版天堂资源中文官网 | 女人被男人躁得好爽免费视频 | 亚洲а∨天堂久久精品2021 | 精品无码一区二区三区爱欲 | 国产熟女一区二区三区四区五区 | 午夜男女很黄的视频 | 一本色道婷婷久久欧美 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜福利试看120秒体验区 | 国产人妻精品午夜福利免费 | 日韩精品无码免费一区二区三区 | 欧美日韩精品 | 人妻夜夜爽天天爽三区 | 人妻少妇精品久久 | 亚洲无人区一区二区三区 | 国产精品国产三级国产专播 | 亚洲熟熟妇xxxx | 久久综合香蕉国产蜜臀av | 大肉大捧一进一出视频出来呀 | 无码毛片视频一区二区本码 | 国产超碰人人爽人人做人人添 | 天天躁日日躁狠狠躁免费麻豆 | 鲁鲁鲁爽爽爽在线视频观看 | 成人性做爰aaa片免费看不忠 | 美女扒开屁股让男人桶 | 精品夜夜澡人妻无码av蜜桃 | 一本色道婷婷久久欧美 | 色欲av亚洲一区无码少妇 | 高清国产亚洲精品自在久久 | 亚洲一区av无码专区在线观看 | 漂亮人妻洗澡被公强 日日躁 | 内射爽无广熟女亚洲 | 伊在人天堂亚洲香蕉精品区 | 青青青爽视频在线观看 | 亚洲欧美日韩国产精品一区二区 | 久久精品中文字幕大胸 | 内射欧美老妇wbb | 日韩av无码中文无码电影 | 中文久久乱码一区二区 | 波多野42部无码喷潮在线 | 亚洲综合另类小说色区 | 亚洲区小说区激情区图片区 | 无码国模国产在线观看 | 亚洲精品一区二区三区婷婷月 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 色偷偷人人澡人人爽人人模 | 亚洲国产一区二区三区在线观看 | 欧美成人家庭影院 | 国产精品久久久一区二区三区 | 内射巨臀欧美在线视频 | 爆乳一区二区三区无码 | 自拍偷自拍亚洲精品10p | 在线亚洲高清揄拍自拍一品区 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲精品综合一区二区三区在线 | 亚洲精品中文字幕久久久久 | 国产无套内射久久久国产 | 亚洲国产精品毛片av不卡在线 | 蜜桃臀无码内射一区二区三区 | 成人女人看片免费视频放人 | 久久久久se色偷偷亚洲精品av | 国内综合精品午夜久久资源 | 人人爽人人澡人人人妻 | 国产成人综合色在线观看网站 | 装睡被陌生人摸出水好爽 | 国产无遮挡又黄又爽免费视频 | 午夜精品一区二区三区的区别 | 88国产精品欧美一区二区三区 | 丰满少妇弄高潮了www | 少妇高潮喷潮久久久影院 | 97久久精品无码一区二区 | 国产色精品久久人妻 | 真人与拘做受免费视频 | 波多野结衣高清一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 久久国语露脸国产精品电影 | 2019午夜福利不卡片在线 | 熟妇人妻激情偷爽文 | 鲁鲁鲁爽爽爽在线视频观看 | 亲嘴扒胸摸屁股激烈网站 | 熟妇人妻无码xxx视频 | 久久99精品久久久久婷婷 | 国内精品人妻无码久久久影院蜜桃 | 亚洲成av人影院在线观看 | 国产色xx群视频射精 | 蜜桃臀无码内射一区二区三区 | 色综合天天综合狠狠爱 | 国产国产精品人在线视 | 亚洲日韩av一区二区三区四区 | 国产精品久久国产精品99 | 女人被爽到呻吟gif动态图视看 | 青草视频在线播放 | 99久久人妻精品免费二区 | 国产香蕉尹人综合在线观看 | 国产综合在线观看 | 国产精品久久国产三级国 | 人人妻人人澡人人爽欧美一区九九 | 中文亚洲成a人片在线观看 | 久久亚洲国产成人精品性色 | 亚洲精品午夜无码电影网 | 国产人妻精品一区二区三区 | 岛国片人妻三上悠亚 | 十八禁真人啪啪免费网站 | 日本又色又爽又黄的a片18禁 | a国产一区二区免费入口 | 在线成人www免费观看视频 | 久久午夜无码鲁丝片午夜精品 | 丰满护士巨好爽好大乳 | 成人免费视频一区二区 | 美女极度色诱视频国产 | 中文字幕乱码中文乱码51精品 | 99久久精品国产一区二区蜜芽 | 欧美老熟妇乱xxxxx | 在线亚洲高清揄拍自拍一品区 | 性色av无码免费一区二区三区 | 欧美性猛交内射兽交老熟妇 | 蜜臀aⅴ国产精品久久久国产老师 | 久久天天躁夜夜躁狠狠 | 色五月丁香五月综合五月 | 国产人妻久久精品二区三区老狼 | 成年女人永久免费看片 | 一二三四在线观看免费视频 | 宝宝好涨水快流出来免费视频 | 无码av中文字幕免费放 | 国产97在线 | 亚洲 | 亚洲aⅴ无码成人网站国产app | 国产卡一卡二卡三 | 日韩人妻无码一区二区三区久久99 | 亚洲一区二区三区国产精华液 | 久久精品人妻少妇一区二区三区 | 无码国内精品人妻少妇 | 久久综合激激的五月天 | 乱人伦人妻中文字幕无码 | 正在播放东北夫妻内射 | 色欲人妻aaaaaaa无码 | 日本一区二区三区免费播放 | 久久久久久九九精品久 | 国产内射爽爽大片视频社区在线 | 国产99久久精品一区二区 | 久久99精品久久久久久动态图 | 男人和女人高潮免费网站 | 国产97在线 | 亚洲 | 黑森林福利视频导航 | 欧美日韩综合一区二区三区 | 久热国产vs视频在线观看 | 欧美国产日产一区二区 | 丰满诱人的人妻3 | 激情国产av做激情国产爱 | 中文字幕无线码免费人妻 | 狠狠色噜噜狠狠狠狠7777米奇 | 性色欲网站人妻丰满中文久久不卡 | 丰满人妻被黑人猛烈进入 | 老司机亚洲精品影院无码 | 国内精品人妻无码久久久影院蜜桃 | a在线亚洲男人的天堂 | 亚欧洲精品在线视频免费观看 | 国产精品亚洲а∨无码播放麻豆 | 亚洲国产综合无码一区 | 波多野结衣av一区二区全免费观看 | 婷婷五月综合激情中文字幕 | 国产精品毛多多水多 | 亚洲欧美国产精品专区久久 | 超碰97人人射妻 | 蜜臀av无码人妻精品 | 中文字幕无码av激情不卡 | 国产精品鲁鲁鲁 | 人妻有码中文字幕在线 | 精品 日韩 国产 欧美 视频 | 国产乱人伦偷精品视频 | 天天做天天爱天天爽综合网 | 久久人人爽人人爽人人片av高清 | 日本乱人伦片中文三区 | 亚洲の无码国产の无码影院 | 成年女人永久免费看片 | 99国产精品白浆在线观看免费 | 婷婷综合久久中文字幕蜜桃三电影 | 一本久久伊人热热精品中文字幕 | 中文字幕久久久久人妻 | 男人扒开女人内裤强吻桶进去 | 久久精品中文字幕大胸 | 久久久久久a亚洲欧洲av冫 | 国产亚洲美女精品久久久2020 | 日韩精品无码免费一区二区三区 | 国产亚洲视频中文字幕97精品 | 亚洲色偷偷偷综合网 | 4hu四虎永久在线观看 | 性欧美熟妇videofreesex | 久久国产精品偷任你爽任你 | 麻豆国产人妻欲求不满谁演的 | 熟妇人妻无乱码中文字幕 | 人人妻人人藻人人爽欧美一区 | 无套内谢的新婚少妇国语播放 | 久久精品国产大片免费观看 | 欧美激情内射喷水高潮 | 久久综合九色综合97网 | 国产精品手机免费 | 欧美乱妇无乱码大黄a片 | 俺去俺来也www色官网 | 久久久久av无码免费网 | 日韩精品a片一区二区三区妖精 | 欧美三级不卡在线观看 | 国内丰满熟女出轨videos | 无码免费一区二区三区 | 亚洲国产精品无码一区二区三区 | 国产精品毛片一区二区 | 娇妻被黑人粗大高潮白浆 | 在线成人www免费观看视频 | √天堂资源地址中文在线 | 伊人久久大香线蕉av一区二区 | 夜夜躁日日躁狠狠久久av | 亚洲一区二区三区含羞草 | 老熟女重囗味hdxx69 | 一本久道久久综合狠狠爱 | 久久人人97超碰a片精品 | 亚洲欧美精品aaaaaa片 | 18黄暴禁片在线观看 | 激情爆乳一区二区三区 | 精品国产成人一区二区三区 | 噜噜噜亚洲色成人网站 | 思思久久99热只有频精品66 | 水蜜桃亚洲一二三四在线 | 国产欧美亚洲精品a | 久久精品国产99久久6动漫 | 久久无码中文字幕免费影院蜜桃 | 东京热一精品无码av | 狂野欧美激情性xxxx | 久久久久99精品成人片 | 无码播放一区二区三区 | 男人和女人高潮免费网站 | 国产在线精品一区二区三区直播 | 色狠狠av一区二区三区 | 欧美喷潮久久久xxxxx | 无遮挡国产高潮视频免费观看 | 久久精品人妻少妇一区二区三区 | 国语自产偷拍精品视频偷 | 国产激情精品一区二区三区 | 日本熟妇人妻xxxxx人hd | 色婷婷综合激情综在线播放 | 久激情内射婷内射蜜桃人妖 | 国产成人精品无码播放 | 国产精品办公室沙发 | 国产内射老熟女aaaa | 精品人妻人人做人人爽夜夜爽 | 亚洲国产精品成人久久蜜臀 | 亚洲色欲色欲天天天www | 国产成人无码a区在线观看视频app | 亚洲国产欧美国产综合一区 | 国产午夜福利100集发布 | 人妻无码αv中文字幕久久琪琪布 | 国产凸凹视频一区二区 | yw尤物av无码国产在线观看 | 亚洲精品中文字幕乱码 | 男女性色大片免费网站 | 日本一区二区三区免费高清 | 无码人妻出轨黑人中文字幕 | 在线观看免费人成视频 | 精品久久久中文字幕人妻 | 久久久久免费看成人影片 | 国产乱人无码伦av在线a | 色欲久久久天天天综合网精品 | 鲁一鲁av2019在线 | 少妇性l交大片 | 久9re热视频这里只有精品 | 3d动漫精品啪啪一区二区中 | 好爽又高潮了毛片免费下载 | 午夜福利不卡在线视频 | 久久99精品国产麻豆蜜芽 | 无码中文字幕色专区 | 鲁鲁鲁爽爽爽在线视频观看 | 高潮毛片无遮挡高清免费视频 | 久久精品国产一区二区三区肥胖 | 亚洲精品一区三区三区在线观看 | 亚洲色无码一区二区三区 | av无码不卡在线观看免费 | 久久久国产精品无码免费专区 | 欧美乱妇无乱码大黄a片 | 国产美女极度色诱视频www | 亚洲日韩中文字幕在线播放 | 婷婷五月综合激情中文字幕 | 国内少妇偷人精品视频免费 | 2020久久香蕉国产线看观看 | 双乳奶水饱满少妇呻吟 | 国产人妻精品一区二区三区不卡 | 欧美日韩色另类综合 | 欧美日韩久久久精品a片 | 18无码粉嫩小泬无套在线观看 | 日日碰狠狠躁久久躁蜜桃 | 中文字幕色婷婷在线视频 | 欧美人与动性行为视频 | 澳门永久av免费网站 | 丝袜 中出 制服 人妻 美腿 | 欧美自拍另类欧美综合图片区 | 精品久久久无码人妻字幂 | 国内老熟妇对白xxxxhd | √天堂资源地址中文在线 | 97se亚洲精品一区 | 久久无码专区国产精品s | 天干天干啦夜天干天2017 | 国产精品亚洲а∨无码播放麻豆 | 婷婷六月久久综合丁香 | 大乳丰满人妻中文字幕日本 | 图片区 小说区 区 亚洲五月 | 玩弄人妻少妇500系列视频 | 亚洲熟妇色xxxxx亚洲 | 性欧美videos高清精品 | 国产精品美女久久久 | 在线 国产 欧美 亚洲 天堂 | 51国偷自产一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 日韩欧美群交p片內射中文 | 亚洲伊人久久精品影院 | 内射巨臀欧美在线视频 | 久久久婷婷五月亚洲97号色 | aⅴ亚洲 日韩 色 图网站 播放 | 中文字幕无码av激情不卡 | 欧美人与禽猛交狂配 | 亚洲区欧美区综合区自拍区 | 黑人大群体交免费视频 | 国产在线精品一区二区三区直播 | 久久午夜无码鲁丝片秋霞 | 熟妇激情内射com | 成人精品视频一区二区三区尤物 | 两性色午夜免费视频 | 婷婷五月综合激情中文字幕 | 三上悠亚人妻中文字幕在线 | 六月丁香婷婷色狠狠久久 | 国产麻豆精品精东影业av网站 | 亚洲国产欧美国产综合一区 | 久久午夜无码鲁丝片秋霞 | 欧美喷潮久久久xxxxx | 一本久道高清无码视频 | 一本一道久久综合久久 | 精品夜夜澡人妻无码av蜜桃 | 精品午夜福利在线观看 | 色婷婷综合中文久久一本 | 国产亚洲精品久久久久久国模美 | 亚洲自偷精品视频自拍 | 欧美日韩人成综合在线播放 | 欧美freesex黑人又粗又大 | 乌克兰少妇xxxx做受 | 中文字幕av无码一区二区三区电影 | 亚洲日本va午夜在线电影 | 未满成年国产在线观看 | 久久久久亚洲精品男人的天堂 | 一本大道伊人av久久综合 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 在线欧美精品一区二区三区 | 无码一区二区三区在线观看 | 人人澡人人透人人爽 | 中文精品无码中文字幕无码专区 | 波多野结衣aⅴ在线 | 国产精品99久久精品爆乳 | 国产亚洲精品久久久闺蜜 | 国产精品美女久久久 | 无码国内精品人妻少妇 | 国产av无码专区亚洲a∨毛片 | 亚洲中文字幕在线观看 | 国产情侣作爱视频免费观看 | 久久精品国产99精品亚洲 | 永久免费观看美女裸体的网站 | 一本久久伊人热热精品中文字幕 | 国产在线精品一区二区三区直播 | 亚洲va中文字幕无码久久不卡 | 欧美丰满熟妇xxxx | 亚洲色欲久久久综合网东京热 | 国产综合在线观看 | 国产九九九九九九九a片 | 亚洲va欧美va天堂v国产综合 | 精品国产av色一区二区深夜久久 | 亚洲毛片av日韩av无码 | 久久www免费人成人片 | 国产免费久久久久久无码 | 国产女主播喷水视频在线观看 | 国产99久久精品一区二区 | 久久99精品国产麻豆 | 九九综合va免费看 | 国产无套内射久久久国产 | 精品国产一区二区三区四区 | 国产精品无码一区二区三区不卡 | 欧美喷潮久久久xxxxx | 麻花豆传媒剧国产免费mv在线 | 强奷人妻日本中文字幕 | 久久国产自偷自偷免费一区调 | 国产口爆吞精在线视频 | 图片区 小说区 区 亚洲五月 | 国产精品.xx视频.xxtv | 精品国产福利一区二区 | 亚洲精品一区三区三区在线观看 | 特大黑人娇小亚洲女 | 亚洲国产精品毛片av不卡在线 | 一本久道高清无码视频 | 欧美成人免费全部网站 | 久久无码中文字幕免费影院蜜桃 | 三级4级全黄60分钟 | 色窝窝无码一区二区三区色欲 | 国产激情综合五月久久 | 女高中生第一次破苞av | 亚洲人成影院在线观看 | 国产内射老熟女aaaa | 久9re热视频这里只有精品 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产乱人伦偷精品视频 | 国产成人综合在线女婷五月99播放 | 少妇无码吹潮 | 日韩精品无码免费一区二区三区 | 国产高清不卡无码视频 | 成年女人永久免费看片 | 亚洲中文无码av永久不收费 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 美女张开腿让人桶 | 亚洲自偷自偷在线制服 | 人人妻人人澡人人爽欧美一区九九 | 精品国产精品久久一区免费式 | 人妻无码αv中文字幕久久琪琪布 | 精品国精品国产自在久国产87 | 国产高潮视频在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 久激情内射婷内射蜜桃人妖 | 欧洲极品少妇 | 97精品国产97久久久久久免费 | 永久免费精品精品永久-夜色 | 免费无码一区二区三区蜜桃大 | 亚洲日韩av一区二区三区四区 | 九九热爱视频精品 | 亚洲国产精品美女久久久久 | 男人的天堂av网站 | 亚洲色大成网站www | 日韩视频 中文字幕 视频一区 | 丰满少妇女裸体bbw | 国内精品久久久久久中文字幕 | 色一情一乱一伦 | 天天av天天av天天透 | 国产精品.xx视频.xxtv | аⅴ资源天堂资源库在线 | 蜜臀av无码人妻精品 | 亚洲最大成人网站 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 狠狠色噜噜狠狠狠7777奇米 | 欧美三级不卡在线观看 | 日本又色又爽又黄的a片18禁 | 牲欲强的熟妇农村老妇女视频 | 国产后入清纯学生妹 | 乌克兰少妇xxxx做受 | 国产精品久久久久9999小说 | 亚洲中文字幕乱码av波多ji | 色 综合 欧美 亚洲 国产 | 黑人玩弄人妻中文在线 | 久久精品国产亚洲精品 | 久久综合九色综合欧美狠狠 | 丝袜美腿亚洲一区二区 | 色欲综合久久中文字幕网 | 天天摸天天碰天天添 | 亚洲日韩av片在线观看 | 欧洲精品码一区二区三区免费看 | 俄罗斯老熟妇色xxxx | 成人欧美一区二区三区 | 国产亚洲精品久久久闺蜜 | 最新国产麻豆aⅴ精品无码 | 无码精品国产va在线观看dvd | 97精品国产97久久久久久免费 | 野外少妇愉情中文字幕 | 极品尤物被啪到呻吟喷水 | 亚洲欧美日韩国产精品一区二区 | 少妇性l交大片欧洲热妇乱xxx | 日日干夜夜干 | 亚洲色欲色欲欲www在线 | 国产精品无套呻吟在线 | 女人被男人爽到呻吟的视频 | 日韩精品乱码av一区二区 | 中文字幕无码av激情不卡 | 无码人中文字幕 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧洲精品码一区二区三区免费看 | 一个人看的视频www在线 | 日本一卡二卡不卡视频查询 | 亚洲成av人影院在线观看 | 玩弄人妻少妇500系列视频 | 少妇激情av一区二区 | 亚洲狠狠婷婷综合久久 | 国产精品永久免费视频 | 亚洲中文字幕无码一久久区 | 久久久亚洲欧洲日产国码αv | 国产猛烈高潮尖叫视频免费 | 国产人妻久久精品二区三区老狼 | 国产av一区二区三区最新精品 | 日韩欧美群交p片內射中文 | 久久久久久久女国产乱让韩 | 精品成在人线av无码免费看 | 鲁大师影院在线观看 | 无码一区二区三区在线 | 一个人看的www免费视频在线观看 | 精品国产av色一区二区深夜久久 | 99久久精品日本一区二区免费 | 国产精华av午夜在线观看 | 国产免费观看黄av片 | 黑人大群体交免费视频 | 精品国产一区二区三区四区 | 性做久久久久久久免费看 | 国产成人一区二区三区在线观看 | 中国女人内谢69xxxx | 无码人妻久久一区二区三区不卡 | 国产在热线精品视频 | 精品一区二区三区波多野结衣 | 久久综合九色综合欧美狠狠 | 色婷婷av一区二区三区之红樱桃 | 帮老师解开蕾丝奶罩吸乳网站 | 三上悠亚人妻中文字幕在线 | 国产69精品久久久久app下载 | 欧美性猛交内射兽交老熟妇 | 无遮挡啪啪摇乳动态图 | 亚洲色偷偷男人的天堂 | 国产精品久久久一区二区三区 | 欧美人与物videos另类 | 国产又爽又猛又粗的视频a片 | 亚洲精品国偷拍自产在线观看蜜桃 | 全黄性性激高免费视频 | 精品一二三区久久aaa片 | 精品熟女少妇av免费观看 | 日本一区二区三区免费高清 | 67194成是人免费无码 | www国产精品内射老师 | 欧美国产日韩亚洲中文 | 久久人人爽人人爽人人片av高清 | 亚洲欧美国产精品专区久久 | 亚洲国产一区二区三区在线观看 | 亚洲精品中文字幕 | 欧美刺激性大交 | 亚洲成av人在线观看网址 | 色一情一乱一伦一区二区三欧美 | 丰满人妻一区二区三区免费视频 | 亚洲人成人无码网www国产 | 国模大胆一区二区三区 | 性生交大片免费看女人按摩摩 | 亚洲成av人综合在线观看 | 无码人妻丰满熟妇区五十路百度 | 免费无码肉片在线观看 | 香蕉久久久久久av成人 | 国产99久久精品一区二区 | 亚洲高清偷拍一区二区三区 | 国产97色在线 | 免 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 少妇邻居内射在线 | 国产综合色产在线精品 | 蜜桃无码一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 欧美亚洲国产一区二区三区 | 黑人巨大精品欧美一区二区 | 日产精品高潮呻吟av久久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产一区二区三区日韩精品 | 免费无码午夜福利片69 | 日韩亚洲欧美精品综合 | 国产成人一区二区三区在线观看 | 无码国产乱人伦偷精品视频 | 午夜免费福利小电影 | 久久伊人色av天堂九九小黄鸭 | 88国产精品欧美一区二区三区 | 国产精品无码mv在线观看 | 偷窥日本少妇撒尿chinese | 少妇的肉体aa片免费 | 丰满护士巨好爽好大乳 | 亚洲狠狠色丁香婷婷综合 | 亚洲日本一区二区三区在线 | 欧美真人作爱免费视频 | 久久久久久久人妻无码中文字幕爆 | 黑人巨大精品欧美一区二区 | 日韩精品成人一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 国产精品久久久久久亚洲毛片 | 成人精品视频一区二区 | a国产一区二区免费入口 | 丁香花在线影院观看在线播放 | 免费无码午夜福利片69 | 亚洲va欧美va天堂v国产综合 | 成年美女黄网站色大免费视频 | 亚洲国产精品无码久久久久高潮 | 熟妇女人妻丰满少妇中文字幕 | 国产97在线 | 亚洲 | 精品久久久久香蕉网 | 18精品久久久无码午夜福利 | 亚洲欧洲中文日韩av乱码 | 欧美自拍另类欧美综合图片区 | 午夜嘿嘿嘿影院 | 久久久久成人片免费观看蜜芽 | 无码国产色欲xxxxx视频 | 图片区 小说区 区 亚洲五月 | 色 综合 欧美 亚洲 国产 | 香蕉久久久久久av成人 | 日韩av激情在线观看 | 88国产精品欧美一区二区三区 | 国产欧美精品一区二区三区 | 国产无遮挡吃胸膜奶免费看 | 亚洲中文字幕无码中字 | 精品久久久中文字幕人妻 | 野外少妇愉情中文字幕 | 精品国产青草久久久久福利 | 中文字幕无码日韩欧毛 | 丰满护士巨好爽好大乳 | 中文字幕日韩精品一区二区三区 | 精品久久久无码中文字幕 | 久久久久成人精品免费播放动漫 | 性欧美大战久久久久久久 | 中文字幕无码av激情不卡 | 日欧一片内射va在线影院 | 国产亲子乱弄免费视频 | 国产av剧情md精品麻豆 | 亚洲热妇无码av在线播放 | 国产成人一区二区三区在线观看 | 日韩精品成人一区二区三区 | 国产亚洲tv在线观看 | 水蜜桃av无码 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲爆乳大丰满无码专区 | 亚洲码国产精品高潮在线 | 少妇高潮一区二区三区99 | 亚洲精品久久久久中文第一幕 | 亚洲精品综合五月久久小说 | 在线观看国产午夜福利片 | 亚洲精品一区二区三区在线观看 | 日本一区二区更新不卡 | 国产精品办公室沙发 | 中文字幕日韩精品一区二区三区 | 欧美高清在线精品一区 | 欧美黑人乱大交 | 狠狠噜狠狠狠狠丁香五月 | 亚洲va欧美va天堂v国产综合 | 精品无码一区二区三区的天堂 | 久久国产自偷自偷免费一区调 | 亚洲国产成人av在线观看 | 97夜夜澡人人爽人人喊中国片 | 亚洲日本va中文字幕 | 色综合久久中文娱乐网 | 久久午夜夜伦鲁鲁片无码免费 | 免费无码午夜福利片69 | 亚洲春色在线视频 | 男女超爽视频免费播放 | 精品偷自拍另类在线观看 | 亚洲精品综合一区二区三区在线 | 亚洲色偷偷偷综合网 | 蜜桃无码一区二区三区 | 精品一区二区三区无码免费视频 | 日韩欧美中文字幕公布 | 色综合天天综合狠狠爱 | 粗大的内捧猛烈进出视频 | 性色欲网站人妻丰满中文久久不卡 | 玩弄少妇高潮ⅹxxxyw | 青草青草久热国产精品 | 日韩精品一区二区av在线 | 日产精品99久久久久久 | 欧洲欧美人成视频在线 | 亚洲七七久久桃花影院 | 无码av最新清无码专区吞精 | 亚洲人成影院在线观看 | 在线а√天堂中文官网 | 日本www一道久久久免费榴莲 | 久久精品人人做人人综合 | 午夜福利一区二区三区在线观看 | 无套内射视频囯产 | 日本精品高清一区二区 | 成人片黄网站色大片免费观看 | 无码人妻丰满熟妇区五十路百度 | 日本精品久久久久中文字幕 | 未满成年国产在线观看 | 樱花草在线播放免费中文 | 性欧美熟妇videofreesex | 综合人妻久久一区二区精品 | 99久久久无码国产aaa精品 | 九九热爱视频精品 | 亚洲精品国产a久久久久久 | 5858s亚洲色大成网站www | 免费无码的av片在线观看 | 高清不卡一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 久久人人爽人人爽人人片av高清 | 国内少妇偷人精品视频免费 | 亚洲日本一区二区三区在线 | 国产肉丝袜在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产两女互慰高潮视频在线观看 | 中文字幕 亚洲精品 第1页 | 成人欧美一区二区三区黑人 | 鲁鲁鲁爽爽爽在线视频观看 | 久久精品国产大片免费观看 | 人人澡人人妻人人爽人人蜜桃 | 我要看www免费看插插视频 | 一本久久a久久精品vr综合 | 欧美 丝袜 自拍 制服 另类 | 国产亚av手机在线观看 | 亚洲熟悉妇女xxx妇女av | 亚洲一区av无码专区在线观看 | 少妇高潮喷潮久久久影院 | 377p欧洲日本亚洲大胆 | 欧美性猛交内射兽交老熟妇 | www国产亚洲精品久久网站 | 夜夜躁日日躁狠狠久久av | 免费无码的av片在线观看 | 97夜夜澡人人双人人人喊 | 少妇无码av无码专区在线观看 | 国产亚洲精品久久久久久久 | 丰满人妻一区二区三区免费视频 | 风流少妇按摩来高潮 | 欧美阿v高清资源不卡在线播放 | 国产欧美亚洲精品a | 午夜精品久久久内射近拍高清 | 亚洲欧美日韩成人高清在线一区 | 领导边摸边吃奶边做爽在线观看 | 牛和人交xxxx欧美 | 亚洲日韩av片在线观看 | 十八禁视频网站在线观看 | 国产偷国产偷精品高清尤物 | 97无码免费人妻超级碰碰夜夜 | 国产精品国产三级国产专播 | 乌克兰少妇xxxx做受 | 亚洲欧美色中文字幕在线 | 娇妻被黑人粗大高潮白浆 | 亚洲 激情 小说 另类 欧美 | 亚洲成a人一区二区三区 | 熟女体下毛毛黑森林 | 青青青手机频在线观看 | 亚洲男女内射在线播放 | 久久久中文字幕日本无吗 | 亚洲国产成人av在线观看 | 国语精品一区二区三区 | 99久久无码一区人妻 | av无码电影一区二区三区 | 国产乱人偷精品人妻a片 | 色妞www精品免费视频 | 老司机亚洲精品影院无码 | 欧美自拍另类欧美综合图片区 | 国产sm调教视频在线观看 | 亚洲欧美精品aaaaaa片 | 国产成人无码a区在线观看视频app | 激情爆乳一区二区三区 | 国产成人精品一区二区在线小狼 | 亚洲成在人网站无码天堂 | a国产一区二区免费入口 | 一本大道伊人av久久综合 | 国产成人精品三级麻豆 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码av最新清无码专区吞精 | 成人亚洲精品久久久久 | 色五月丁香五月综合五月 | 无码人妻精品一区二区三区下载 | 亚洲色大成网站www国产 | 在线观看免费人成视频 | 久久精品女人天堂av免费观看 | 中文无码精品a∨在线观看不卡 | 精品午夜福利在线观看 | 国内精品人妻无码久久久影院 | 激情内射日本一区二区三区 | 美女扒开屁股让男人桶 | 久久久国产一区二区三区 | 国产做国产爱免费视频 | 东北女人啪啪对白 | 思思久久99热只有频精品66 | 久久久久久亚洲精品a片成人 | 一本大道伊人av久久综合 | 亚洲伊人久久精品影院 | 少妇高潮一区二区三区99 | 日产国产精品亚洲系列 | 中文字幕亚洲情99在线 | 高中生自慰www网站 | 少妇高潮一区二区三区99 | 久久精品女人天堂av免费观看 | 亚洲 另类 在线 欧美 制服 | 少妇的肉体aa片免费 | 俺去俺来也www色官网 | 精品一区二区三区波多野结衣 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲欧美中文字幕5发布 | 一本一道久久综合久久 | 国产美女极度色诱视频www | 无码人妻丰满熟妇区五十路百度 | 久久久精品456亚洲影院 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品一区二区三区大桥未久 | 日韩少妇白浆无码系列 | 亚洲s码欧洲m码国产av | 国产精品手机免费 | 亚洲日韩av一区二区三区中文 | 亚洲一区二区三区偷拍女厕 | 少妇人妻av毛片在线看 | 无码人妻久久一区二区三区不卡 | 亚洲成色www久久网站 | 中文字幕久久久久人妻 | 国产精品自产拍在线观看 | 人妻少妇被猛烈进入中文字幕 | 无码av岛国片在线播放 | 在线欧美精品一区二区三区 | 女人被爽到呻吟gif动态图视看 | 中文字幕av伊人av无码av | 日本又色又爽又黄的a片18禁 | 亚洲色无码一区二区三区 | 午夜丰满少妇性开放视频 | 老司机亚洲精品影院 | 高中生自慰www网站 | 学生妹亚洲一区二区 | 亚洲精品一区二区三区在线观看 | 成人一在线视频日韩国产 | 国产成人一区二区三区在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 夜夜高潮次次欢爽av女 | 综合激情五月综合激情五月激情1 | 日韩人妻系列无码专区 | 久久精品中文闷骚内射 | 老头边吃奶边弄进去呻吟 | 少妇高潮喷潮久久久影院 | 又大又硬又黄的免费视频 | 国产亚洲人成a在线v网站 | 国产精品手机免费 | 亚洲伊人久久精品影院 | 国产成人av免费观看 | 骚片av蜜桃精品一区 | 亚洲午夜福利在线观看 | 国产午夜无码精品免费看 | 自拍偷自拍亚洲精品10p | 国产精品办公室沙发 | 亚洲精品国产第一综合99久久 | 日日天干夜夜狠狠爱 | 无码精品国产va在线观看dvd | 国产精品无码久久av | 自拍偷自拍亚洲精品被多人伦好爽 | 在线播放无码字幕亚洲 | av无码电影一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 一二三四社区在线中文视频 | 亚洲另类伦春色综合小说 | 亚洲色在线无码国产精品不卡 | 亚洲gv猛男gv无码男同 | 午夜丰满少妇性开放视频 | 麻花豆传媒剧国产免费mv在线 | 99久久精品国产一区二区蜜芽 | 亚洲精品欧美二区三区中文字幕 | 99久久婷婷国产综合精品青草免费 | 中文字幕久久久久人妻 | 国产精品怡红院永久免费 | 亚洲国产一区二区三区在线观看 | 丰满人妻精品国产99aⅴ | 久久久国产一区二区三区 | 亚洲国产精华液网站w | 国产又粗又硬又大爽黄老大爷视 | 日本一本二本三区免费 | 国产莉萝无码av在线播放 | 亚洲爆乳精品无码一区二区三区 | 女人被男人爽到呻吟的视频 | 动漫av一区二区在线观看 | 日韩av无码一区二区三区 | 成人无码视频在线观看网站 | 国产av久久久久精东av | 国产sm调教视频在线观看 | 思思久久99热只有频精品66 | 国产av剧情md精品麻豆 | 99精品国产综合久久久久五月天 | 人妻插b视频一区二区三区 | 夫妻免费无码v看片 | 国产综合在线观看 | 男女作爱免费网站 | 成人毛片一区二区 | 丰满少妇弄高潮了www | 亚洲无人区一区二区三区 | 无码人中文字幕 | 无码精品国产va在线观看dvd | 精品乱码久久久久久久 | 中文字幕无码视频专区 | 亚洲欧洲日本综合aⅴ在线 | 无码纯肉视频在线观看 | 国产精品无码一区二区三区不卡 | 亚洲人成影院在线观看 | 亚洲色偷偷偷综合网 | 国产乱人无码伦av在线a | 国产色xx群视频射精 | 亚洲国产欧美在线成人 | 中文字幕人妻丝袜二区 | 国产av无码专区亚洲a∨毛片 | 亚洲狠狠色丁香婷婷综合 | 激情五月综合色婷婷一区二区 | 国产婷婷色一区二区三区在线 | 性做久久久久久久免费看 | 好屌草这里只有精品 | 欧美猛少妇色xxxxx | 亚洲伊人久久精品影院 | 夜夜躁日日躁狠狠久久av | 中国女人内谢69xxxxxa片 | 久久精品中文闷骚内射 | 国色天香社区在线视频 | 在线成人www免费观看视频 | 亚洲色欲色欲天天天www | 精品aⅴ一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 荫蒂添的好舒服视频囗交 | 免费观看激色视频网站 | 国内精品久久久久久中文字幕 | 免费国产成人高清在线观看网站 | 日本高清一区免费中文视频 | 国产婷婷色一区二区三区在线 | 免费乱码人妻系列无码专区 | 国产欧美精品一区二区三区 | 亚洲成av人片天堂网无码】 | 亚洲欧美日韩成人高清在线一区 | 国产在热线精品视频 | 亚洲色欲色欲欲www在线 | 成人三级无码视频在线观看 | 精品亚洲韩国一区二区三区 | 亚洲狠狠婷婷综合久久 | 俺去俺来也www色官网 | 色婷婷av一区二区三区之红樱桃 | 亚洲国产欧美国产综合一区 | 精品无码成人片一区二区98 | 日本免费一区二区三区最新 | 人人妻人人澡人人爽精品欧美 | 精品亚洲韩国一区二区三区 | 欧洲美熟女乱又伦 | 国产艳妇av在线观看果冻传媒 | 国内少妇偷人精品视频 | 久久久亚洲欧洲日产国码αv | 老子影院午夜精品无码 | 亚洲国产综合无码一区 | 日产国产精品亚洲系列 | 国产精品久久久久无码av色戒 | 国产精品无码mv在线观看 | 成人试看120秒体验区 | a片免费视频在线观看 | 亚洲gv猛男gv无码男同 | 亚洲性无码av中文字幕 | 久久久www成人免费毛片 | 少妇激情av一区二区 | 思思久久99热只有频精品66 | 亚洲日韩av片在线观看 | 国产又爽又猛又粗的视频a片 | 国产亚洲人成在线播放 | 国产免费观看黄av片 | 国产精品高潮呻吟av久久 | 国产精品久久久久7777 | 无套内谢的新婚少妇国语播放 | 国产亚洲精品久久久久久国模美 | 国产 浪潮av性色四虎 | 久久99精品国产.久久久久 | 亚洲人成影院在线无码按摩店 | 蜜桃视频插满18在线观看 | 99麻豆久久久国产精品免费 | 成年美女黄网站色大免费视频 | 丝袜足控一区二区三区 | 国产免费久久久久久无码 | 国内精品久久毛片一区二区 | 欧美性生交活xxxxxdddd | 丝袜美腿亚洲一区二区 | 无码精品国产va在线观看dvd | 精品一二三区久久aaa片 | 欧美亚洲日韩国产人成在线播放 | 狠狠色噜噜狠狠狠狠7777米奇 | 无码福利日韩神码福利片 | 国产三级精品三级男人的天堂 | 亚洲人成无码网www | 精品国产麻豆免费人成网站 | 熟女少妇人妻中文字幕 | 97资源共享在线视频 | 亚洲国产日韩a在线播放 | 99精品无人区乱码1区2区3区 | 国产av一区二区精品久久凹凸 | 清纯唯美经典一区二区 | 真人与拘做受免费视频一 | 午夜精品一区二区三区的区别 | 精品久久久无码中文字幕 | 扒开双腿疯狂进出爽爽爽视频 | 国产无遮挡又黄又爽又色 | 国语自产偷拍精品视频偷 | 久久久久亚洲精品男人的天堂 | 在线播放免费人成毛片乱码 | 动漫av网站免费观看 | 国产在线无码精品电影网 | 99riav国产精品视频 | 精品久久久久久人妻无码中文字幕 | 色婷婷综合激情综在线播放 | 精品一区二区不卡无码av | 亚洲性无码av中文字幕 | 亚洲成a人片在线观看无码 | 丰满肥臀大屁股熟妇激情视频 | 欧美国产日产一区二区 | 欧美激情一区二区三区成人 | 天海翼激烈高潮到腰振不止 | 特级做a爰片毛片免费69 | 国产精品办公室沙发 | 久久99精品久久久久久 | 99久久人妻精品免费一区 | 亚洲国精产品一二二线 | 2019午夜福利不卡片在线 | 四虎4hu永久免费 | 在线欧美精品一区二区三区 | 免费人成在线观看网站 | 牲欲强的熟妇农村老妇女视频 | 国产精品18久久久久久麻辣 | 欧美激情一区二区三区成人 | 人妻少妇精品视频专区 | 国产成人综合色在线观看网站 | 久久久久se色偷偷亚洲精品av | 亚洲一区二区三区播放 | 人妻体内射精一区二区三四 | 久久久久99精品国产片 | 国产av人人夜夜澡人人爽麻豆 | 亚洲精品一区三区三区在线观看 | 荡女精品导航 | 色五月丁香五月综合五月 | 蜜臀av在线播放 久久综合激激的五月天 | 国产艳妇av在线观看果冻传媒 | 性生交片免费无码看人 | 美女毛片一区二区三区四区 | 日韩精品a片一区二区三区妖精 | 国产性生交xxxxx无码 | www一区二区www免费 | 亚洲毛片av日韩av无码 | 久久aⅴ免费观看 | 国产成人午夜福利在线播放 | 国产精品a成v人在线播放 | 国产美女精品一区二区三区 | 中文字幕无码免费久久9一区9 | 国产欧美熟妇另类久久久 | 色婷婷综合激情综在线播放 | 全球成人中文在线 | 亚洲熟妇自偷自拍另类 | 成人毛片一区二区 | 欧美日韩一区二区综合 | 国产区女主播在线观看 | 亚洲日韩av一区二区三区四区 | 中文字幕 亚洲精品 第1页 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品99久久精品爆乳 | 老熟女重囗味hdxx69 | 纯爱无遮挡h肉动漫在线播放 | 成人精品视频一区二区 | 丰满岳乱妇在线观看中字无码 | 色狠狠av一区二区三区 | 亚洲综合伊人久久大杳蕉 | 久在线观看福利视频 | 人妻与老人中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 欧美日本精品一区二区三区 | 97精品国产97久久久久久免费 | 成人欧美一区二区三区 | 亚洲欧美中文字幕5发布 | 国产xxx69麻豆国语对白 | 久久国产精品二国产精品 | 亚洲综合伊人久久大杳蕉 | 亚洲日本在线电影 | 国产精品亚洲专区无码不卡 | 中文字幕 亚洲精品 第1页 | 国产精品免费大片 | 少妇性l交大片欧洲热妇乱xxx | 51国偷自产一区二区三区 | 国产成人无码av一区二区 | 欧美丰满少妇xxxx性 | 强辱丰满人妻hd中文字幕 | 国产香蕉尹人综合在线观看 | 国产农村妇女高潮大叫 | 成人一区二区免费视频 | 樱花草在线播放免费中文 | 久久久精品欧美一区二区免费 | 老司机亚洲精品影院无码 | 久久久久久av无码免费看大片 | 久久99精品久久久久久动态图 | 四虎影视成人永久免费观看视频 | 在线观看欧美一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 无码av最新清无码专区吞精 | 无码人妻av免费一区二区三区 | 亚洲精品国产a久久久久久 | 欧美日韩人成综合在线播放 | 久久久久久a亚洲欧洲av冫 | 宝宝好涨水快流出来免费视频 | 中文字幕无码乱人伦 | 大地资源中文第3页 | 国产精品人妻一区二区三区四 | 日韩无套无码精品 | 国产成人一区二区三区在线观看 | 亚洲精品国偷拍自产在线麻豆 | 中文字幕无码视频专区 | 国产亚av手机在线观看 | 男人和女人高潮免费网站 | 色 综合 欧美 亚洲 国产 | 国产无套粉嫩白浆在线 | 在线观看国产午夜福利片 | 无码一区二区三区在线观看 | 久久亚洲中文字幕精品一区 | 亚洲国产欧美日韩精品一区二区三区 | 欧洲欧美人成视频在线 | 又湿又紧又大又爽a视频国产 | 性欧美牲交在线视频 | 日韩精品乱码av一区二区 | 精品国产aⅴ无码一区二区 | 免费乱码人妻系列无码专区 | 自拍偷自拍亚洲精品被多人伦好爽 | 日本肉体xxxx裸交 | 亚洲乱亚洲乱妇50p | 国产精品99爱免费视频 | 丰满人妻被黑人猛烈进入 | 激情爆乳一区二区三区 | 国产精品.xx视频.xxtv | 成人无码精品1区2区3区免费看 | 日本精品久久久久中文字幕 | 欧美自拍另类欧美综合图片区 | 亚洲а∨天堂久久精品2021 | 狠狠色噜噜狠狠狠狠7777米奇 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 97久久超碰中文字幕 | 久久国产自偷自偷免费一区调 | 三上悠亚人妻中文字幕在线 | 国产av无码专区亚洲a∨毛片 | 精品欧美一区二区三区久久久 | 任你躁在线精品免费 | 亚洲精品成a人在线观看 | 久久久无码中文字幕久... | 强辱丰满人妻hd中文字幕 | 性啪啪chinese东北女人 | 亚洲の无码国产の无码影院 | 久久久久成人片免费观看蜜芽 | 狂野欧美性猛xxxx乱大交 | 少妇被黑人到高潮喷出白浆 | 波多野42部无码喷潮在线 | 中文无码成人免费视频在线观看 | 无码吃奶揉捏奶头高潮视频 | 国产精品va在线观看无码 | 少妇的肉体aa片免费 | 欧美激情一区二区三区成人 | 夜夜高潮次次欢爽av女 | 亚洲码国产精品高潮在线 | 水蜜桃色314在线观看 | 天天拍夜夜添久久精品 | 亚洲精品一区二区三区四区五区 | 老太婆性杂交欧美肥老太 | 亚洲中文字幕无码中文字在线 | 水蜜桃色314在线观看 | 性欧美videos高清精品 | 日本乱偷人妻中文字幕 | 国产成人综合在线女婷五月99播放 | 在线观看免费人成视频 | 久久综合香蕉国产蜜臀av | 牲欲强的熟妇农村老妇女 | 精品乱子伦一区二区三区 | 97se亚洲精品一区 | 夜夜躁日日躁狠狠久久av | a国产一区二区免费入口 | 婷婷综合久久中文字幕蜜桃三电影 | 国内精品人妻无码久久久影院 | 欧美激情内射喷水高潮 | 中文无码精品a∨在线观看不卡 | 国产人妻人伦精品 | 国产明星裸体无码xxxx视频 | 大胆欧美熟妇xx | 国产又爽又猛又粗的视频a片 | 俺去俺来也在线www色官网 | 色综合久久网 | 国产av人人夜夜澡人人爽麻豆 | 免费视频欧美无人区码 | 国产人成高清在线视频99最全资源 | aⅴ在线视频男人的天堂 | 动漫av一区二区在线观看 | 久久久精品456亚洲影院 | 东京一本一道一二三区 | 永久免费精品精品永久-夜色 | 成人女人看片免费视频放人 | 久久久久免费精品国产 | 性色欲网站人妻丰满中文久久不卡 | 精品久久8x国产免费观看 | 高清不卡一区二区三区 | 亚洲精品一区二区三区在线观看 | √天堂资源地址中文在线 | 日韩精品成人一区二区三区 | 99精品无人区乱码1区2区3区 | 亚洲男人av天堂午夜在 | 野狼第一精品社区 | 欧美黑人乱大交 | 东京一本一道一二三区 | 麻豆国产人妻欲求不满 | 国产人妻精品一区二区三区 | 国产热a欧美热a在线视频 | 激情综合激情五月俺也去 | 国产成人精品久久亚洲高清不卡 | 精品欧洲av无码一区二区三区 | 日韩少妇内射免费播放 | 国产精品亚洲专区无码不卡 | 大地资源网第二页免费观看 | 精品无码成人片一区二区98 | 性啪啪chinese东北女人 | 欧美亚洲国产一区二区三区 | 婷婷丁香六月激情综合啪 | 亚洲午夜久久久影院 | 特黄特色大片免费播放器图片 | 国产免费观看黄av片 | 国产亚洲精品久久久久久 | 99久久精品国产一区二区蜜芽 | 国产口爆吞精在线视频 | 国产精品久久久久无码av色戒 | 少妇性荡欲午夜性开放视频剧场 | 国产人成高清在线视频99最全资源 | 久久这里只有精品视频9 | 国产午夜手机精彩视频 | 在教室伦流澡到高潮hnp视频 | 日本精品少妇一区二区三区 | 国产亚洲精品久久久久久久 | 国产亚洲tv在线观看 | 中文字幕人成乱码熟女app | 亚洲综合无码一区二区三区 | 一本色道久久综合亚洲精品不卡 | 黄网在线观看免费网站 | av在线亚洲欧洲日产一区二区 | 国产精品无码成人午夜电影 | 无码毛片视频一区二区本码 | 日韩精品无码一区二区中文字幕 | 成人片黄网站色大片免费观看 | 一区二区三区高清视频一 | 日韩精品无码一区二区中文字幕 | 国产成人无码专区 | 最近中文2019字幕第二页 | 性史性农村dvd毛片 | 亚洲一区二区三区无码久久 | 欧美精品一区二区精品久久 | 精品久久久久香蕉网 | 欧美亚洲国产一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 精品欧美一区二区三区久久久 | 美女毛片一区二区三区四区 | 大肉大捧一进一出视频出来呀 | 一本大道久久东京热无码av | 久久久久亚洲精品男人的天堂 | 人妻体内射精一区二区三四 | 无码纯肉视频在线观看 | 国产国语老龄妇女a片 | 国产精品久久久久久无码 | 野外少妇愉情中文字幕 | 美女毛片一区二区三区四区 | 人妻无码αv中文字幕久久琪琪布 | 成人免费视频视频在线观看 免费 | 亚洲国产欧美国产综合一区 | 未满小14洗澡无码视频网站 | 国产激情艳情在线看视频 | 日本一区二区三区免费高清 | a在线亚洲男人的天堂 | 亚洲精品久久久久avwww潮水 | 欧美日韩精品 | 国产小呦泬泬99精品 | 久久精品人人做人人综合试看 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品内射视频免费 | 久久精品丝袜高跟鞋 | 东京热无码av男人的天堂 | 国产亚洲日韩欧美另类第八页 | 亚洲中文字幕在线无码一区二区 | 丰满少妇高潮惨叫视频 | 亚洲国产精品一区二区美利坚 | 成人aaa片一区国产精品 | ass日本丰满熟妇pics | 日韩精品乱码av一区二区 | 在线 国产 欧美 亚洲 天堂 | 少妇愉情理伦片bd | 99riav国产精品视频 | 成人精品视频一区二区 | 97人妻精品一区二区三区 | 国产亚洲视频中文字幕97精品 | 成人欧美一区二区三区 | 日日躁夜夜躁狠狠躁 | 欧洲熟妇色 欧美 | 熟妇人妻无码xxx视频 | 久久精品人人做人人综合试看 | 精品久久久久久人妻无码中文字幕 | 少妇性l交大片欧洲热妇乱xxx | 撕开奶罩揉吮奶头视频 | 又粗又大又硬又长又爽 | 丰满少妇人妻久久久久久 | 国产精品丝袜黑色高跟鞋 | 色一情一乱一伦 | 偷窥村妇洗澡毛毛多 | 人人爽人人澡人人人妻 | 亚洲日韩av一区二区三区中文 | а√资源新版在线天堂 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲一区二区三区在线观看网站 | 欧美日韩亚洲国产精品 | 日韩av激情在线观看 | 欧美自拍另类欧美综合图片区 | 成人免费视频一区二区 | 久久熟妇人妻午夜寂寞影院 | 国产精品99久久精品爆乳 | 欧美自拍另类欧美综合图片区 | 亚洲国产精品一区二区第一页 | 亚洲精品国产精品乱码视色 | 亚洲精品国偷拍自产在线麻豆 | 国产精品免费大片 | 麻豆md0077饥渴少妇 | 领导边摸边吃奶边做爽在线观看 | 蜜桃视频插满18在线观看 | 女人高潮内射99精品 | 日本www一道久久久免费榴莲 | 人人妻人人澡人人爽人人精品浪潮 | 久久99精品久久久久久 | 国产精品18久久久久久麻辣 | 少妇一晚三次一区二区三区 | 免费国产黄网站在线观看 | 国产激情综合五月久久 | 中文字幕乱码亚洲无线三区 | 丝袜人妻一区二区三区 | 精品日本一区二区三区在线观看 | 亚洲欧美精品伊人久久 | 人妻aⅴ无码一区二区三区 | 中文字幕中文有码在线 | 欧美成人高清在线播放 | 中国女人内谢69xxxxxa片 | 国产内射老熟女aaaa | 国产精品无码久久av | 伊人久久大香线蕉av一区二区 | 久久这里只有精品视频9 | 久久精品中文闷骚内射 | √8天堂资源地址中文在线 | 精品水蜜桃久久久久久久 | 伊人久久婷婷五月综合97色 | 成人精品视频一区二区三区尤物 | 亚洲国产精品一区二区第一页 | √8天堂资源地址中文在线 | 久久久精品国产sm最大网站 | 蜜桃无码一区二区三区 | 中文字幕人妻丝袜二区 | 久久精品无码一区二区三区 | 天堂亚洲免费视频 | 鲁一鲁av2019在线 | 亚洲精品欧美二区三区中文字幕 | 久久久久久a亚洲欧洲av冫 | 免费播放一区二区三区 | 亚洲精品午夜无码电影网 | 图片小说视频一区二区 | 免费国产黄网站在线观看 | 久久综合久久自在自线精品自 | 亚洲精品国产a久久久久久 | 午夜嘿嘿嘿影院 | 国语自产偷拍精品视频偷 | 久久伊人色av天堂九九小黄鸭 | 少妇激情av一区二区 | 丰满肥臀大屁股熟妇激情视频 | 天堂а√在线地址中文在线 | 婷婷丁香五月天综合东京热 | 亚洲日韩av一区二区三区四区 | 黑人巨大精品欧美一区二区 | 免费无码一区二区三区蜜桃大 | 波多野结衣 黑人 | 中文久久乱码一区二区 | 大肉大捧一进一出好爽视频 | 骚片av蜜桃精品一区 | 妺妺窝人体色www在线小说 | 国产色xx群视频射精 | 国产 浪潮av性色四虎 | 夜夜夜高潮夜夜爽夜夜爰爰 | 无套内谢的新婚少妇国语播放 | 少妇一晚三次一区二区三区 | 亚洲成a人片在线观看无码3d | 黑人巨大精品欧美一区二区 | 国产精品丝袜黑色高跟鞋 | 亚洲综合无码一区二区三区 | 久久亚洲精品中文字幕无男同 | 无码一区二区三区在线观看 | 色欲久久久天天天综合网精品 | 成人无码影片精品久久久 | 亚洲精品久久久久久久久久久 | 精品成在人线av无码免费看 | 中文字幕+乱码+中文字幕一区 | 国产一区二区三区日韩精品 | 特大黑人娇小亚洲女 | 国产精品va在线播放 | 成人性做爰aaa片免费看 | 中国大陆精品视频xxxx | 亚洲综合另类小说色区 | 黑人大群体交免费视频 | 成人无码精品一区二区三区 | 国产人妻人伦精品 | 国产无遮挡又黄又爽又色 | 对白脏话肉麻粗话av | 在线看片无码永久免费视频 | 99久久精品午夜一区二区 | 国产亚洲人成在线播放 | 免费人成在线观看网站 | 久久婷婷五月综合色国产香蕉 | 鲁一鲁av2019在线 | 97se亚洲精品一区 | 亚洲熟妇自偷自拍另类 | 国产成人无码av在线影院 | 国产精品无码永久免费888 | 久久99热只有频精品8 | 日韩人妻无码一区二区三区久久99 | 亚洲va中文字幕无码久久不卡 | 日韩人妻无码中文字幕视频 | 亚洲国产精品一区二区美利坚 | 伊人久久大香线蕉av一区二区 | 日本精品人妻无码免费大全 | ass日本丰满熟妇pics | 国内综合精品午夜久久资源 | 久久久久久亚洲精品a片成人 | 国产手机在线αⅴ片无码观看 | 兔费看少妇性l交大片免费 | 无码av最新清无码专区吞精 | 亚洲国产精品无码久久久久高潮 | 国产亚洲精品久久久久久大师 | 老熟女乱子伦 | 无码免费一区二区三区 | 激情人妻另类人妻伦 | 好男人www社区 | 国产精品美女久久久久av爽李琼 | 丰满护士巨好爽好大乳 | 亚洲中文字幕av在天堂 | 亚洲熟悉妇女xxx妇女av | 伊人久久大香线蕉av一区二区 | 初尝人妻少妇中文字幕 | 中文字幕乱妇无码av在线 | 久久熟妇人妻午夜寂寞影院 | 久激情内射婷内射蜜桃人妖 | 亚洲国产av精品一区二区蜜芽 | 国产一精品一av一免费 | 天天做天天爱天天爽综合网 | 国产精品亚洲一区二区三区喷水 | 中文字幕av无码一区二区三区电影 | 人人妻人人澡人人爽欧美精品 | 一本久久伊人热热精品中文字幕 | 亚洲欧美国产精品久久 | 宝宝好涨水快流出来免费视频 | 樱花草在线社区www | 国产精品对白交换视频 | 最新国产麻豆aⅴ精品无码 | 思思久久99热只有频精品66 | 中文字幕av无码一区二区三区电影 | 欧美精品无码一区二区三区 | 欧美人与物videos另类 | 久久精品人妻少妇一区二区三区 | 波多野结衣av一区二区全免费观看 | 国产精品理论片在线观看 | 国产亚洲精品久久久久久国模美 | 狠狠亚洲超碰狼人久久 | 又色又爽又黄的美女裸体网站 | 黑人玩弄人妻中文在线 | 无码人妻精品一区二区三区不卡 | 欧美性生交xxxxx久久久 | 97久久精品无码一区二区 | 成人三级无码视频在线观看 | 亚洲一区二区三区偷拍女厕 | 四虎国产精品免费久久 | 狂野欧美性猛xxxx乱大交 | 日韩无套无码精品 | 男女猛烈xx00免费视频试看 | 四虎永久在线精品免费网址 | 婷婷综合久久中文字幕蜜桃三电影 | 女人被男人爽到呻吟的视频 | 亚洲成av人影院在线观看 | 露脸叫床粗话东北少妇 | 国产成人一区二区三区别 | 熟妇人妻无码xxx视频 | 国产亚洲精品久久久久久国模美 | 野外少妇愉情中文字幕 | 水蜜桃色314在线观看 | 久久久久免费看成人影片 | 天堂亚洲2017在线观看 | 亚洲色欲久久久综合网东京热 | 扒开双腿吃奶呻吟做受视频 | 欧美成人免费全部网站 | 东京热一精品无码av | 东京无码熟妇人妻av在线网址 | 久久熟妇人妻午夜寂寞影院 | 色五月五月丁香亚洲综合网 | 亚洲熟妇自偷自拍另类 | 国产精品久久久av久久久 | 成人av无码一区二区三区 | 精品无码一区二区三区的天堂 | 日韩精品乱码av一区二区 | 亚洲s码欧洲m码国产av | 国产成人午夜福利在线播放 | 在线成人www免费观看视频 | 大肉大捧一进一出视频出来呀 | 亚洲一区二区三区在线观看网站 | 2019nv天堂香蕉在线观看 | 日本肉体xxxx裸交 | 亲嘴扒胸摸屁股激烈网站 | 精品国偷自产在线视频 | 377p欧洲日本亚洲大胆 | 欧美人与物videos另类 | 一区二区三区乱码在线 | 欧洲 | 熟女俱乐部五十路六十路av | 一本久道久久综合狠狠爱 | 性生交片免费无码看人 | 成人精品视频一区二区 | 无码人妻久久一区二区三区不卡 | 成人欧美一区二区三区 | 国产麻豆精品一区二区三区v视界 | 无码人妻丰满熟妇区毛片18 | 老司机亚洲精品影院无码 | 国产人妻久久精品二区三区老狼 | 成 人 免费观看网站 | 国产一区二区三区日韩精品 | 在线视频网站www色 | 4hu四虎永久在线观看 | 精品日本一区二区三区在线观看 | 国产精品无码成人午夜电影 | 久久久久久国产精品无码下载 | 露脸叫床粗话东北少妇 | 国产福利视频一区二区 | 秋霞特色aa大片 | 无套内射视频囯产 | 色诱久久久久综合网ywww | 国产成人精品必看 | 一个人看的www免费视频在线观看 | 亚洲の无码国产の无码步美 | 色综合久久88色综合天天 | 国产人妻大战黑人第1集 | 亚洲成av人片天堂网无码】 | 亚洲综合在线一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 西西人体www44rt大胆高清 | 亚洲欧美精品伊人久久 | 无套内谢老熟女 | 人妻无码久久精品人妻 | 亚洲国产欧美日韩精品一区二区三区 |