精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探索 Go slog 標準庫:設計與應用

開發 后端
本文主要介紹了 Go 語言新引入的 log/slog 標準庫的設計理念、使用方法以及如何進行定制化開發,以提高日志操作的性能和靈活性。

在 Go1.21[2] 中引入的 log/slog[3] 軟件包試圖彌補原有日志軟件包的不足,即日志缺乏結構化和級別特性。正如提案[4]中提到的,log/slog 包旨在創建一個零依賴、易用、高性能、靈活高效的日志系統。如果你對它的概念感興趣,并想更好的利用它,那就請跟隨我深入了解它的設計、實現和應用。

slog設計

為實現其目的,slog 的設計具有高度靈活性。它支持結構化日志,能以 JSON 或其他格式輸出日志,以便后續分析和處理。出色的模塊化設計將日志功能分為多個組件,如日志級別管理、輸出格式化、日志傳輸等,每個組件都可以獨立配置和替換。其異步處理支持機制可確保日志操作不會阻礙主應用程序的執行。

// Logger contains all actions against a Log message
type Logger struct {
    New(h Handler) *Logger
    Debug(msg string, args ...any)
    Error(msg string, args ...any)
    Info(msg string, args ...any)
    //...
    With(args ...any) *Logger
}

// Handler defines how to 
type Handler interface {
    Handle(context.Context, Record) error
    WithAttrs(attrs []Attr) Handler
    WithGroup(name string) Handler
}

// Record defines a Log message with many info。
type Record struct {
 Time time.Time
 Message string
 Level Level
 PC uintptr
}

三個組件完成了整個流程。

Logger負責所有日志打印操作。Handler定義日志輸出格式,默認實現為 TextHandler 和 JSONHandler。Record定義日志的詳細信息,如時間、級別等。這些接口不僅能以多種方式擴展 slog(如添加新的處理程序),還能滿足不同日志框架的需求和配置。

slog用法

slog 的基本用法與 zap 或 Golang 的其他第三方日志框架類似。

1.日志打印

func main() {
    slog.Info("This is an informational message.")
    slog.Warn("This is a warning message with context.", slog.String("user", "slaise"))
    slog.Error("This is an error message with details.", slog.Int("code", 123))
}
// output(go-playground) https://go.dev/play/p/TLIur7rZFhi
2009/11/10 23:00:00 INFO This is an informational message.
2009/11/10 23:00:00 WARN This is a warning message with context. user=slaise
2009/11/10 23:00:00 ERROR This is an error message with details. code=123

slog 為不同級別的日志提供了不同的打印方式和相應的參數類型轉換。

2.Handler

通過下面的代碼,我們可以將默認打印方式修改為內置的 TextHandler 或 JSONHandler。

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
// logger.Info/Debug/Error

請看輸出結果。

// JSONHandler
func main() {
 logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
 logger.Info("This is an informational message.")
 logger.Warn("This is a warning message with context.", slog.String("user", "slaise"))
 logger.Error("This is an error message with details.", slog.Int("code", 123))

}
// Output: https://go.dev/play/p/oCubHk77Sjw
{"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"This is an informational message."}
{"time":"2009-11-10T23:00:00Z","level":"WARN","msg":"This is a warning message with context.","user":"slaise"}
{"time":"2009-11-10T23:00:00Z","level":"ERROR","msg":"This is an error message with details.","code":123}
// TextHandler
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
// Output: https://go.dev/play/p/ewil9ziZpsk
time=2009-11-10T23:00:00.000Z level=INFO msg="This is an informational message."
time=2009-11-10T23:00:00.000Z level=WARN msg="This is a warning message with context." user=slaise
time=2009-11-10T23:00:00.000Z level=ERROR msg="This is an error message with details." code=123

可以通過 SetDefault[5] 方法創建 Logger 來替換 slog 中的默認 Logger,默認 slog.Info 和 slog.Debug 的 Logger 也將同時被修改。

func main() {
 logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
 slog.SetDefault(logger)
 slog.Info("This is an informational message.")
 slog.Warn("This is a warning message with context.", slog.String("user", "slaise"))
 slog.Error("This is an error message with details.", slog.Int("code", 123))
}
//output
{"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"This is an informational message."}
{"time":"2009-11-10T23:00:00Z","level":"WARN","msg":"This is a warning message with context.","user":"slaise"}
{"time":"2009-11-10T23:00:00Z","level":"ERROR","msg":"This is an error message with details.","code":123}

3.消息處理

對 Record 和 attr 的處理是 slog 核心功能的一部分。每條日志記錄都由時間、級別、消息等參數和一組鍵值對組成。處理這些參數的 API 提供了靈活性。使用 With 方法,用戶可以輕松添加固定屬性,這些屬性將出現在該日志記錄器生成的每條日志記錄中。通過 Group 方法,用戶可以匯總多個屬性,進行統一處理。請看下面的示例。

func main() {
 logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

 // Build a group
 attrGroup := slog.Group("ops", slog.String("module", "authentication"), slog.String("method", "login"))

 logger.Info("User login attempt",
  slog.String("service", "login-service"), 
  slog.String("version", "1.0.2"),
  slog.String("status", "attempting"),
  attrGroup,
 )

 // login failed
 // failed, err := login(user, pass)
 err := errors.New("login password err")
 if err != nil {
  // error can only be printed with slog.Any
  logger.Error("User login failed",
    slog.String("service", "login-service"), 
    slog.String("version", "1.0.2"),
    slog.Any("error", err)) //output: service=login-service version=1.0.2 error="login password err
 }
}

Attr[6] 提供了在 slog 中處理參數的主要 API,例如上例中的 slog.String 和 slog.Any,以及 slog.Bool[7]、slog.Int[8]、slog.Float64[9]、slog.Duration[10]、slog.Time[11]等。

Level 通過實現 Leveler[12] 接口的 Level() 為 slog 提供默認日志級別設置。

const (
 LevelDebug Level = -4
 LevelInfo  Level = 0
 LevelWarn  Level = 4
 LevelError Level = 8
)
func (l Level) Level() Level { return l }

日志應用本地機器的默認時區設置,但也可以使用 slog.Time 添加特定時間到日志中。

loc, err := time.LoadLocation("America/New_York")
currentTime := time.Now().In(loc)
slog.Info("Log message with NewYork timezone",
  slog.Time("time", currentTime), 
 )

不過,如果我們需要在不同于本地機器的時區打印日志,就需要自定義處理程序,因為 slog 軟件包缺少用于全局修改的默認 API。

4.上下文處理

可以通過兩種方式將上下文添加到日志記錄中。

  • 通過在日志處理中加入 context.Context,可以在函數和goroutine之間傳遞上下文信息。
  • Logger 提供了帶context的日志打印方法,如 DebugContext[13]、InfoContext[14]、WarnContext[15] 和 ErrorContext[16]。context.Context 被添加到之前的方法參數列表中,并將 ctx 放在首位,這符合上下文的使用原則。
func (l *Logger) DebugContext(ctx context.Context, msg string, args ...any)

但如果直接使用這些方法將context中的參數添加到日志中,就會像我一樣感到困惑,因為這樣做是行不通的。例如,在以下代碼中,userId 不會顯示在日志中。

func main() {
 ctx := context.WithValue(context.Background(), "userId", "123")
 slog.InfoContext(ctx, "reset password", slog.Time("time", time.Now()))
}
// output
2009/11/10 23:00:00 INFO reset password time=2009-11-10T23:00:00.000Z

閱讀源代碼后,你會驚訝的發現,默認 defaultHandler 只打印消息和參數列表,卻不處理傳入的 ctx。

func (h *defaultHandler) Handle(ctx context.Context, r Record) error {
 buf := buffer.New()
 buf.WriteString(r.Level.String())
 buf.WriteByte(' ')
 buf.WriteString(r.Message)
 state := h.ch.newHandleState(buf, true, " ")
 defer state.free()
 state.appendNonBuiltIns(r)
 return h.output(r.PC, *buf)
}

go 1.21 中正式發布的 slog 只提供了相關 API 而沒有提供實現,因此需要定制處理程序來實現相關功能。

可通過父日志記錄器構建具有層次關系的日志記錄器,這些日志記錄器繼承并擴展了基本日志記錄功能

例如,在前面的With和Group示例中,在打印 Info 和 Error 日志的過程中重復傳遞了服務和版本信息,而日志程序的繼承功能可以簡化這一過程。

// Define a new Logger with service & service info
logger = slog.With(logger, slog.String("service", "login-service"), slog.String("version", "1.0.2"))
// Print logs
logger.Info("User login attempt",
  slog.String("status", "attempting"),
  attrGroup,
 )

slog定制

Slog 的設計非常靈活,便于定制日志。

自定義日志級別

與官方 LogLevel 一樣,可以通過實現 Logeler 接口來定制 LogLevel,而 slog.Level 本身也會返回 Level 類型。

const (
 LevelTrace = slog.Level(-99)
 LevelFatal = slog.Level(99)
)

func main() {
 ctx := context.Background()
 // This will be hidden because default Log level is above trace
 slog.Log(ctx, LevelTrace, "Trace message")
 slog.Log(ctx, LevelFatal, "Fatal level")
}
// output
2009/11/10 23:00:00 ERROR+91 Fatal level

跟蹤級別日志在未修改相應HandlerOptions時是隱藏的,可通過修改默認日志級別打開。

slog.SetLogLoggerLevel(LevelTrace)

自定義HandlerOptions HandlerOptions[17]提供三種修改日志的方法。

  • 顯示源代碼。使用 AddSource:true,可以在日志中添加文件、行號和方法名稱等信息。
  • 修改日志級別。LevelTrace 的作用與上述 SetLogLoggerLevel 相同。
  • 定義 ReplaceAttr 可調用函數,用于修改日志中的 Attr 鍵值對。

對于缺少默認格式化支持的錯誤,可以通過實現 ReplaceAttr 來加以改進。

func replaceAttr(_ []string, a slog.Attr) slog.Attr {
    switch a.Value.Kind() {
    case slog.KindAny:
        switch v := a.Value.Any().(type) {
        case error:
            a.Value = fmtErr(v) // provide error log format
        }
    }
    return a
}

自定義Handler 自定義日志的最后一種方法是實現自己的Handler。下面的 ContextHandler 提供了將上下文中的參數整合到日志中的功能。

const (
 UserId string = "userId"
)

type ContextHandler struct {
 slog.Handler
}

func (h ContextHandler) Handle(ctx context.Context, r slog.Record) error {
 if id, ok := ctx.Value(UserId).(string); ok {
  r.AddAttrs(slog.String(UserId, id))
 }
 return h.Handler.Handle(ctx, r)
}

func main() {
 ctxHandler := &ContextHandler{slog.NewJSONHandler(os.Stdout, nil)}
 logger := slog.New(ctxHandler)
 ctx := context.WithValue(context.Background(), "userId", "123")
 logger.InfoContext(ctx, "User ops", slog.String("op", "login"))
}

//output
{"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"User ops","op":"login","userId":"123"}

性能

slog 支持通過延遲計算優化參數處理,只在實際需要日志信息時才執行參數的高性能字符串操作,以減少不必要的性能開銷。

在默認日志方法中,只打印默認級別以上的日志。Attrs 將被添加到打印前創建的Record中。

func (l *Logger) log(ctx context.Context, level Level, msg string, args ...any) {
 if !l.Enabled(ctx, level) {
  return
 }
 var pc uintptr
 if !internal.IgnorePC {
  var pcs [1]uintptr
  // skip [runtime.Callers, this function, this function's caller]
  runtime.Callers(3, pcs[:])
  pc = pcs[0]
 }
 r := NewRecord(time.Now(), level, msg, pc)
 r.Add(args...)
 if ctx == nil {
  ctx = context.Background()
 }
 _ = l.Handler().Handle(ctx, r)
}

slog 利用內置 buffer.go[18] 中的對象池技術重復使用日志條目對象,減少了內存應用和釋放以及垃圾回收的頻率,從而提高了應用性能。

slog實踐

到目前為止,我們已經做好了在項目中使用slog的準備,但要牢記以下幾點。

(1) 對敏感數據脫敏

數據安全在日志處理中至關重要。在將對象對象打印到日志時,應及時屏蔽或模糊敏感信息,以避免數據泄漏,這可以通過相應結構體中的 LogValue 接口來實現。下面我們來看一個包含電子郵件和密碼的用戶類型示例。

type User struct {
 ID       string `json:"id"`
 Email    string `json:"email"`
 Password string `json:"password"`
}

func (u User) LogValue() slog.Value {
 return slog.StringValue(u.ID)
}

func main() {
 h := slog.NewJSONHandler(os.Stdout, nil)
 logger := slog.New(h)
 u := &User{
  ID:       "1",
  Email:    "slaise@gmail.com",
  Password: "111111",
 }
 logger.Info("info", "user", u)

}
// output
{"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"info","user":"1"}

(2) 將slog級別提取為配置項,并為不同環境配置不同級別

項目通常部署在多個環境中,如 dev、staging、prod 等。通過將日志級別提取為環境參數,并通過 Kubernetes 的 configMap 注入,可以在不同環境中應用不同日志級別,從而減少開銷。

(3) 處理上下文信息

上例中的上下文實現是一個明智的選擇,可以通過優化來動態加載上下文參數列表。在我們實現的代碼及許多第三方日志框架中,Context 被廣泛用于傳遞上下文信息,從而簡化了從第三方庫升級到 slog 的過程。

(4) 正確配置日志輸出目的地

根據需要配置日志輸出,如輸出到控制臺、文件、網絡服務等,或輸出到多個輸出目的地,以確保日志的可靠存儲。

通過自定義處理程序的寫入器,可以輕松修改日志輸出地址。

file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
 if err != nil {
  panic("cannot open log file: " + err.Error())
 }
 defer file.Close()

logger := slog.New(slog.JSONHandler(file))

升級第三方庫

活躍的Golang社區有許多為 slog 定制的升級框架,以下是一些常用框架:

  • slog-multi[19]:處理器鏈,如流水線、路由器、扇出等。
  • slog-sampling[20]:丟棄重復的日志條目。
  • slog-shim[21] 為 1.21 以下的 Go 版本提供向后兼容的 slog 支持。
  • sloggen[22] 生成各種輔助工具。
  • sloglint[23] 可確保代碼的一致性。

結論

slog 軟件包為管理應用程序日志提供了強大而靈活的解決方案。其設計確保了高性能和多功能性,使開發人員能夠自定義日志級別、Handler配置以及Handler本身。使用 slog 不僅能加強消息處理和上下文信息集成,還能簡化日志記錄流程。為了有效實施,仔細考慮自定義日志級別和Handler以滿足特定項目要求至關重要。通過明智利用 slog 的功能,開發人員可以顯著提高日志實踐的效率和清晰度,確保代碼具有更好的可維護性和可讀性。

參考資料:

  • [1]Explore the Go slog Standard Library: Design and Usage: https://blog.stackademic.com/explore-the-go-slog-standard-library-design-and-usage-6baf14c03299
  • [2]Go1.21: https://tip.golang.org/doc/go1.21#slog
  • [3]log/slog: https://pkg.go.dev/log/slog
  • [4]structured, leveled logging #54763: https://github.com/golang/go/discussions/54763
  • [5]SetDefault: https://pkg.go.dev/log/slog#SetDefault
  • [6]Attr: https://pkg.go.dev/log/slog#Attr
  • [7]slog.Bool: https://pkg.go.dev/log/slog#Bool
  • [8]slog.Int: https://pkg.go.dev/log/slog#Int
  • [9]slog.Float64: https://pkg.go.dev/log/slog#Float64
  • [10]slog.Duration: https://pkg.go.dev/log/slog#Duration
  • [11]slog.Time: https://pkg.go.dev/log/slog#Time
  • [12]Leveler: https://pkg.go.dev/log/slog#Leveler
  • [13]DebugContext: https://pkg.go.dev/log/slog#Logger.DebugContext
  • [14]InfoContext: https://pkg.go.dev/log/slog#Logger.InfoContext
  • [15]WarnContext: https://pkg.go.dev/log/slog#Logger.WarnContext
  • [16]ErrorContext: https://pkg.go.dev/log/slog#Logger.ErrorContext
  • [17]HandlerOptions: https://pkg.go.dev/log/slog#HandlerOptions
  • [18]buffer.go: https://cs.opensource.google/go/go/+/master:src/log/slog/internal/buffer/buffer.go;bpv=0;bpt=1
  • [19]slog-multi: https://github.com/samber/slog-multi
  • [20]slog-sampling: https://github.com/samber/slog-sampling
  • [21]slog-shim: https://github.com/sagikazarmark/slog-shim
  • [22]sloggen: https://github.com/go-simpler/sloggen
  • [23]sloglint: https://github.com/go-simpler/sloglint
責任編輯:趙寧寧 來源: DeepNoMind
相關推薦

2023-10-07 00:10:27

日志格式函數

2022-05-04 23:08:36

標準Go應用程序

2023-04-02 23:13:07

Go語言bufio

2021-08-13 12:05:15

Goneturl

2018-06-21 10:05:07

數據庫管理SQL解析MySQL

2022-04-19 09:53:06

云數據庫云計算數據庫

2021-08-01 00:08:06

JsonGo標準庫

2025-01-22 16:00:00

MySQL數據庫Binlog

2023-11-06 10:04:51

Go語言大數據

2012-11-08 09:36:10

Google Go

2024-07-11 08:50:05

Go語言errors

2021-12-10 15:22:26

Go Zip 文件

2023-09-27 08:26:48

Go標準庫函數

2025-02-12 10:29:13

2022-11-08 08:29:43

Goslog 庫工具

2023-10-11 08:45:55

Go標準庫指標

2025-10-31 09:01:37

2023-10-27 14:25:26

組件庫無限可能性

2023-05-17 00:15:11

TCCXA模式

2025-06-17 09:32:15

點贊
收藏

51CTO技術棧公眾號

欧美黑人激情| 久久久久久久久久久久久久久久久| 成人video亚洲精品| 国产精品18久久久久久久久| 欧美老女人性视频| 国产伦理在线观看| 中文字幕在线直播| 欧美激情一区二区| 亚洲在线www| 日本三级午夜理伦三级三| 国产不卡av一区二区| 欧美日韩精品一区视频| 水蜜桃在线免费观看| 少妇人妻偷人精品一区二区| 久久久久中文| 久久精品国产精品亚洲| 性高潮免费视频| 漫画在线观看av| 国产农村妇女精品| 成人一区二区三区四区| 中文人妻av久久人妻18| 日韩免费久久| 亚洲成人精品av| 青青草精品视频在线观看| 成人ww免费完整版在线观看| 91在线观看下载| 成人网在线观看| 欧美一区二区激情视频| 国产精品99视频| 精品久久久久久久久久久院品网| 好男人www社区| 欧美24videosex性欧美| 国产精品美日韩| 91免费电影网站| 在线天堂中文字幕| 一区二区日韩欧美| 在线午夜精品自拍| 国产亚洲色婷婷久久99精品91| 欧美xxxx性| 欧美日韩在线视频观看| 国产精品va在线观看无码| 国产免费视频在线| heyzo一本久久综合| 国产精品欧美在线| 毛片aaaaa| 9999国产精品| 国产亚洲精品久久久| 久久久无码人妻精品无码| 在线最新版中文在线| 亚洲激情校园春色| 在线免费观看成人| 福利视频在线看| 99久久国产综合精品女不卡| 91精品久久久久久蜜桃| 一级黄色片视频| 日韩精品亚洲专区| 欧美在线视频一区二区| 欧美做爰啪啪xxxⅹ性| 欧美日韩有码| 亚洲男人天堂2023| www.超碰97| 久久悠悠精品综合网| 亚洲国产一区二区三区四区| 国产情侣久久久久aⅴ免费| 成人永久在线| 91超碰这里只有精品国产| 国产精品igao| 四虎影视4hu4虎成人| 色久优优欧美色久优优| 国产素人在线观看| 免费在线小视频| 五月天激情综合| 天天夜碰日日摸日日澡性色av| 爱啪啪综合导航| 亚洲成人av福利| 蜜桃欧美视频| 韩国福利在线| 亚洲日穴在线视频| www在线观看免费| 日韩中文在线播放| 91精品国产综合久久蜜臀| 97精品人人妻人人| 精品国产91久久久久久浪潮蜜月| 丝袜一区二区三区| 国产精品99re| 日韩中文字幕亚洲一区二区va在线 | 亚洲欧美日韩国产综合| 免费网站在线观看视频| 欧美成人黑人| 日韩欧美自拍偷拍| 国产激情在线免费观看| 性欧美欧美巨大69| 欧美亚洲另类视频| 国产露脸国语对白在线| 99国产精品久久久久| 亚洲欧美影院| 激情黄产视频在线免费观看| 欧美麻豆精品久久久久久| 亚州av综合色区无码一区| 郴州新闻综合频道在线直播| 欧美精品videossex88| 18国产免费视频| 成人激情视频网站| 一区二区在线高清视频| 涩涩网在线视频| 欧美一区二区福利在线| 国产熟女一区二区| 亚洲激情综合| 99porn视频在线| 自拍视频在线网| 色一情一乱一乱一91av| 日韩少妇一区二区| 你懂的视频一区二区| 国产精品视频1区| 三级在线电影| 香蕉久久一区二区不卡无毒影院| 免费一区二区三区在线观看| 要久久爱电视剧全集完整观看 | 9999热视频| 日韩av中文字幕一区二区| 久久精品人成| av电影在线免费| 日韩午夜激情av| 男人的午夜天堂| 青青草97国产精品免费观看无弹窗版| 精品视频一区二区| 草草影院在线| 精品噜噜噜噜久久久久久久久试看| 女人裸体性做爰全过| 久久香蕉精品| 欧美极品一区二区| 精品极品在线| 亚洲第一天堂av| 国产系列精品av| 粉嫩高潮美女一区二区三区| 国产对白在线播放| 色综合视频一区二区三区44| 色噜噜国产精品视频一区二区| 9i精品福利一区二区三区| 99国产精品久久久久久久久久 | 亚洲欧美韩国| 亚洲精品短视频| 亚洲日本韩国在线| 99精品国产视频| 欧美日本视频在线观看| 成人影院中文字幕| 欧美极品第一页| 男人天堂一区二区| 精品久久久久久久久久久久久 | 欧美激情一二三区| 手机视频在线观看| 99九九热只有国产精品| 成人精品视频99在线观看免费| 日本在线免费中文字幕| 欧美精选午夜久久久乱码6080| 我要看一级黄色录像| 精品亚洲成a人| 黄色一级片黄色| 偷拍自拍一区| 国产精品69av| 免费av不卡| 日韩免费看网站| 中文字幕一区二区三区手机版| av电影在线观看不卡| 日韩黄色片视频| 日本一区二区高清不卡| 亚洲a级在线播放观看| 黄页网站在线观看免费| 国产视频综合在线| 国产精品欧美综合| 亚洲女人****多毛耸耸8| 亚洲一区二区三区黄色| 欧美亚洲一区二区三区| 色999日韩自偷自拍美女| 久久久久久久性潮| 欧美第一黄网免费网站| 天堂在线视频观看| 欧美伊人精品成人久久综合97| 日本二区三区视频| 成人性生交大合| 国产精品无码av无码| 99热精品久久| 久久精品国产第一区二区三区最新章节 | 日韩欧美主播在线| 婷婷丁香综合网| 成人听书哪个软件好| www日韩在线观看| 欧美精品大片| 日韩不卡av| 凹凸av导航大全精品| 国产精品黄视频| 久久99亚洲网美利坚合众国| 亚洲人成网站999久久久综合| 国产精品久久久久久久久久久久久久久久 | 国产又黄又大久久| 久久久免费视频网站| 亚洲人metart人体| 日韩av电影免费观看| 日韩成人在线观看视频| 国产精品夜间视频香蕉| 国内精彩免费自拍视频在线观看网址| 中文字幕日韩欧美精品在线观看| 欧美在线精品一区二区三区| 欧美日韩精品一区二区在线播放| 韩国av免费观看| 亚洲男人电影天堂| 免费成人深夜天涯网站| 99热这里都是精品| 黑人巨大猛交丰满少妇| 日韩国产欧美在线视频| 我的公把我弄高潮了视频| 婷婷综合久久| 丝袜美腿玉足3d专区一区| 色婷婷久久久| 国产精品一区二区av| 精品一区二区三区免费看| 国产精品高精视频免费| 巨茎人妖videos另类| 午夜精品视频在线| 人人澡人人添人人爽一区二区| 色狠狠久久aa北条麻妃| a天堂中文在线| 亚洲欧美日韩区| 神马精品久久| 亚洲精品国产综合久久| 好男人www在线视频| 91精品婷婷国产综合久久竹菊| 中文字幕 自拍偷拍| 色狠狠av一区二区三区| 亚欧视频在线观看| 亚洲电影一级黄| 欧美日韩一级大片| 一区二区三区蜜桃| caoporn91| 亚洲精品精品亚洲| 欧美成人精品欧美一| 亚洲欧美韩国综合色| 污污的视频在线免费观看| 亚洲欧洲精品一区二区三区| www.4hu95.com四虎| 国产欧美一区二区精品仙草咪| 最新中文字幕视频| 国产婷婷一区二区| 欧美做受xxxxxⅹ性视频| 久久综合九色综合欧美98| 男生裸体视频网站| 久久精品夜夜夜夜久久| 99精品全国免费观看| 日本一区二区免费在线观看视频 | 99久久久无码国产精品性波多| 国产精品99久久久久| www.51色.com| 国产福利精品导航| 亚洲图片欧美另类| 26uuu亚洲综合色欧美| 中文字幕av久久爽一区| 中文字幕亚洲在| 青青操国产视频| 精品电影在线观看| 无码人妻精品一区二区三区不卡| 在线观看亚洲精品视频| 一区二区国产欧美| 日韩欧美高清一区| 天堂资源最新在线| 在线看福利67194| 怡红院av在线| 91av视频在线| 99九九久久| 99久久99久久精品国产片| 女同一区二区三区| 视频一区免费观看| 综合五月婷婷| 亚洲熟妇av一区二区三区漫画| 日日夜夜精品视频免费| 黄色小视频免费网站| 成人免费视频播放| 免费在线观看污| 亚洲乱码国产乱码精品精的特点| 日韩av电影网址| 欧美日韩精品系列| 全国男人的天堂网| 中文字幕成人精品久久不卡| 日本在线观看高清完整版| 国产91对白在线播放| 黄色精品视频网站| 精品国产福利| 911精品美国片911久久久| 国产中文字幕视频在线观看| 久久精品国产免费| 亚洲av无码成人精品国产| 亚洲欧美影音先锋| 五月天激情四射| 日韩一区二区三区视频在线观看| 欧美视频综合| 欧美激情精品久久久久久| 国产一区二区主播在线| 国产精品大全| 91日韩欧美| 黑人糟蹋人妻hd中文字幕| 国产精品亚洲一区二区三区妖精| 右手影院亚洲欧美| 亚洲综合免费观看高清完整版| 久久精品偷拍视频| 亚洲精品久久久久久久久久久| 美女国产在线| 国产精品第2页| 四虎5151久久欧美毛片| 免费看污污视频| 免费在线视频一区| 男人天堂av电影| 天天影视色香欲综合网老头| 国产日韩在线观看一区| 一区二区在线视频播放| 蜜臀久久精品| 国内视频一区二区| 黄色精品一区| 国产又粗又猛大又黄又爽| 国产精品嫩草影院av蜜臀| 一区二区三区在线观看av| 亚洲大胆人体在线| 日本天码aⅴ片在线电影网站| 国产女精品视频网站免费| 国产剧情一区| 欧美成人黑人猛交| 久久久久久毛片| 成年人视频在线免费看| 亚洲精品久久久久国产| 97人澡人人添人人爽欧美| 97人摸人人澡人人人超一碰| 欧美一区精品| 免费看的av网站| 亚洲欧美日韩人成在线播放| 一级做a爱片性色毛片| 在线播放国产一区中文字幕剧情欧美 | 亚洲午夜成aⅴ人片| 亚洲av无码乱码在线观看性色| 久久av红桃一区二区小说| 看亚洲a级一级毛片| 中国老女人av| 国产成人免费视频一区| 麻豆疯狂做受xxxx高潮视频| 精品伦理精品一区| av资源中文在线天堂| 97伦理在线四区| 精品成人久久| theav精尽人亡av| 色哦色哦哦色天天综合| 国产精品久久一区二区三区不卡 | 网曝91综合精品门事件在线| 波多野结衣家庭教师在线| 26uuu国产在线精品一区二区| 国语对白永久免费| 在线观看欧美视频| 亚洲爽爆av| 黄网站色视频免费观看| 成人av在线一区二区三区| 国产又黄又粗又爽| 国产一区二区三区视频在线观看| 成人自拍视频网| 麻豆视频传媒入口| 成人av在线影院| 中文字幕天堂在线| 美女久久久久久久| 久本草在线中文字幕亚洲| 久久久久狠狠高潮亚洲精品| 国产精品全国免费观看高清| 国产精品自偷自拍| 欧美精品xxx| 欧美久久综合网| 91日韩精品视频| 性做久久久久久久免费看| 国产色a在线| 亚洲中国色老太| 免费欧美日韩| 亚洲区一区二区三| 精品不卡在线视频| 日韩美女在线看免费观看| 今天免费高清在线观看国语| 91小视频在线观看| 97超碰人人草| 91黑丝高跟在线| 国产韩日影视精品| 青青草视频成人| 91麻豆精品国产自产在线| 欧美freesex黑人又粗又大| 亚洲人成77777| 99热在这里有精品免费| 国产又大又黄的视频| 91精品91久久久久久| 国产精品不卡| 国产免费看av| 日韩视频免费观看高清完整版在线观看 | 色丁香久综合在线久综合在线观看| 久操视频在线观看| 欧美精品成人一区二区在线观看| 国产麻豆精品95视频| 国产午夜麻豆影院在线观看| 欧美国产日韩一区二区在线观看| 精品国产一区一区二区三亚瑟| 极品白嫩的小少妇|