Включение логирования

Примечание

Материал статьи дополняется.

Ниже приведены примеры кода включения логирования в разных YDB SDK.

Есть несколько способов включить логи в приложении, использующем ydb-go-sdk:

Через переменную окружения YDB_LOG_SEVERITY_LEVEL

Данная переменная окружения включает встроенный в ydb-go-sdk логгер (синхронный, неблочный) с выводом в стандартный поток вывода.
Выставить переменную окружения можно так:

export YDB_LOG_SEVERITY_LEVEL=info

(доступные значения trace, debug, info, warn, error, fatal, quiet, по умолчанию quiet).

Подключить сторонний логгер go.uber.org/zap
package main

import (
    "context"
    "os"

    "go.uber.org/zap"

    ydbZap "github.com/ydb-platform/ydb-go-sdk-zap"
    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var log *zap.Logger // zap-logger with init out of this scope
    db, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydbZap.WithTraces(
            log,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer db.Close(ctx)
    ...
}
Подключить сторонний логгер github.com/rs/zerolog
package main

import (
    "context"
    "os"

    "github.com/rs/zerolog"

    ydbZerolog "github.com/ydb-platform/ydb-go-sdk-zerolog"
    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var log zerolog.Logger // zap-logger with init out of this scope
    db, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydbZerolog.WithTraces(
            &log,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer db.Close(ctx)
    ...
}
Подключить собственную имплементацию логгера github.com/ydb-platform/ydb-go-sdk/v3/log.Logger
package main

import (
    "context"
    "os"

    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/log"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var logger log.Logger // logger implementation with init out of this scope
    db, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydb.WithLogger(
            logger,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer db.Close(ctx)
    ...
}
Реализовать собственный пакет логирования

Реализовать собственный пакет логирования можно на основе событий драйвера в пакете трассировки github.com/ydb-platform/ydb-go-sdk/v3/trace. Пакет трассировки github.com/ydb-platform/ydb-go-sdk/v3/trace содержит описание всех протоколируемых событий драйвера.

Есть несколько способов включить логи в приложении, использующем ydb-go-sdk:

Через переменную окружения YDB_LOG_SEVERITY_LEVEL

Данная переменная окружения включает встроенный в ydb-go-sdk логгер (синхронный, неблочный) с выводом в стандартный поток вывода.
Выставить переменную окружения можно так:

export YDB_LOG_SEVERITY_LEVEL=info

(доступные значения trace, debug, info, warn, error, fatal, quiet, по умолчанию quiet).

Подключить сторонний логгер go.uber.org/zap
package main

import (
    "context"
    "database/sql"
    "os"

    "go.uber.org/zap"

    ydbZap "github.com/ydb-platform/ydb-go-sdk-zap"
    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var log *zap.Logger // zap-logger with init out of this scope
    nativeDriver, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydbZap.WithTraces(
            log,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer nativeDriver.Close(ctx)

    connector, err := ydb.Connector(nativeDriver)
    if err != nil {
        panic(err)
    }
    defer connector.Close()

    db := sql.OpenDB(connector)
    defer db.Close()
    ...
}
Подключить сторонний логгер github.com/rs/zerolog
package main

import (
    "context"
    "database/sql"
    "os"

    "github.com/rs/zerolog"

    ydbZerolog "github.com/ydb-platform/ydb-go-sdk-zerolog"
    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var log zerolog.Logger // zap-logger with init out of this scope
    nativeDriver, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydbZerolog.WithTraces(
            &log,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer nativeDriver.Close(ctx)

    connector, err := ydb.Connector(nativeDriver)
    if err != nil {
        panic(err)
    }
    defer connector.Close()

    db := sql.OpenDB(connector)
    defer db.Close()
    ...
}
Подключить собственную имплементацию логгера github.com/ydb-platform/ydb-go-sdk/v3/log.Logger
package main

import (
    "context"
    "database/sql"
    "os"

    "github.com/ydb-platform/ydb-go-sdk/v3"
    "github.com/ydb-platform/ydb-go-sdk/v3/log"
    "github.com/ydb-platform/ydb-go-sdk/v3/trace"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var logger log.Logger // logger implementation with init out of this scope
    nativeDriver, err := ydb.Open(ctx,
        os.Getenv("YDB_CONNECTION_STRING"),
        ydb.WithLogger(
            logger,
            trace.DetailsAll,
        ),
    )
    if err != nil {
        panic(err)
    }
    defer nativeDriver.Close(ctx)

    connector, err := ydb.Connector(nativeDriver)
    if err != nil {
        panic(err)
    }
    defer connector.Close()

    db := sql.OpenDB(connector)
    defer db.Close()
    ...
}
Реализовать собственный пакет логирования

Реализовать собственный пакет логирования можно на основе событий драйвера в пакете трассировки github.com/ydb-platform/ydb-go-sdk/v3/trace. Пакет трассировки github.com/ydb-platform/ydb-go-sdk/v3/trace содержит описание всех протоколируемых событий драйвера.

В YDB Java SDK для логирования используется библиотека slf4j, которая позволяет использовать различные уровни логирования (error, warn, info, debug, trace) для одного или нескольких логгеров. В текущей реализации доступны следующие логгеры:

  • Логгер tech.ydb.core.grpc предоставляет информацию о внутренней реализации grpc протокола

  • уровень debug логирует все операции по протоколу grpc, рекомедуется использовать только для отладки

  • уровень info рекомендуется использовать по умолчанию

  • Логгер tech.ydb.table.impl на уровне debug позволяет отслеживать внутреннее состояние драйвера ydb, в частности работу пула сессий.

  • Логгер tech.ydb.table.SessionRetryContext на уровне debug будет информировать о количестве ретраев, результатах выполненных запросов, времени выполнения отдельных ретраев и общем времени выполнения всей операции

  • Логгер tech.ydb.table.Session на уровне debug предоставляет информацию о тексте запроса, статусе ответа и времени выполнения для различных операций сессии

Включение и настройка логгеров Java SDK зависит от используемой реализации slf4j-api.
Здесь приведен пример конфигурации log4j2 для библиотеки log4j-slf4j-impl

<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="io.netty" level="warn" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="io.grpc.netty" level="warn" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="tech.ydb.core.grpc" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="tech.ydb.table.impl" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="tech.ydb.table.SessionRetryContext" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="tech.ydb.table.Session" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <Root level="debug" >
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

В YDB PHP SDK для логирования вам нужно использовать класс, который реализует \Psr\Log\LoggerInterface.
В YDB-PHP-SDK встроены логгеры в пространстве имен YdbPlatform\Ydb\Logger:

  • NullLogger - по умолчанию, который ничего не выводит
  • SimpleStdLogger($level) - логгер, который выводит логи в stderr.

Пример использования:

$config = [
    'logger' => new \YdbPlatform\Ydb\Logger\SimpleStdLogger(\YdbPlatform\Ydb\Logger\SimpleStdLogger::INFO)
]
$ydb = new \YdbPlatform\Ydb\Ydb($config);