Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Логирование DataStore

DataStore использует стандартный модуль логирования Python. В этом руководстве объясняется, как настроить логирование для отладки.

Быстрый старт

from pathlib import Path
Path("data.csv").write_text("""\
name,age,city,salary,department
Alice,25,NYC,55000,Engineering
Bob,30,LA,65000,Product
Charlie,35,NYC,80000,Engineering
Diana,28,SF,70000,Design
Eve,42,NYC,95000,Product
""")

from chdb import datastore as pd
from chdb.datastore.config import config

# Включить отладочное логирование
config.enable_debug()

# Теперь все операции будут записывать детали в лог
ds = pd.read_csv("data.csv")
result = ds.filter(ds['age'] > 25).to_df()

Уровни журналирования

Уровень Значение Описание
DEBUG 10 Подробная информация для отладки
INFO 20 Общая служебная информация
WARNING 30 Предупреждения (по умолчанию)
ERROR 40 Сообщения об ошибках
CRITICAL 50 Критические сбои

Настройка уровня логирования

import logging

from chdb.datastore.config import config

# Использование стандартных уровней логирования
config.set_log_level(logging.DEBUG)
config.set_log_level(logging.INFO)
config.set_log_level(logging.WARNING)  # По умолчанию
config.set_log_level(logging.ERROR)

# Использование быстрого пресета
config.enable_debug()  # Устанавливает уровень DEBUG + подробный формат

Формат логирования

Простой формат (по умолчанию)

Querypython
config.set_log_format("simple")
Responsetext
DEBUG - Executing SQL query
DEBUG - Cache miss for key abc123

Формат Verbose

Querypython
config.set_log_format("verbose")
Responsetext
2024-01-15 10:30:45.123 DEBUG datastore.core - Executing SQL query
2024-01-15 10:30:45.456 DEBUG datastore.cache - Cache miss for key abc123

Что записывается в лог

Уровень DEBUG

  • Сгенерированные SQL-запросы
  • Выбор движка выполнения
  • Операции с кэшем (попадания/промахи)
  • Временные показатели операций
  • Сведения об источнике данных
DEBUG - Creating DataStore from file 'data.csv'
DEBUG - SQL: SELECT * FROM file('data.csv', 'CSVWithNames') WHERE age > 25
DEBUG - Using engine: chdb
DEBUG - Execution time: 0.089s
DEBUG - Cache: Storing result (key: abc123)

Уровень INFO

  • Завершение важных операций
  • Изменения конфигурации
  • Подключения к источникам данных
INFO - Loaded 1,000,000 rows from data.csv
INFO - Execution engine set to: chdb
INFO - Connected to MySQL: localhost:3306/mydb

Уровень WARNING

  • Использование устаревших возможностей
  • Предупреждения о производительности
  • Некритические проблемы
WARNING - Large result set (>1M rows) may cause memory issues
WARNING - Cache TTL exceeded, re-executing query
WARNING - Column 'date' has mixed types, using string

Уровень ERROR

  • Ошибки при выполнении запросов
  • Ошибки подключения
  • Ошибки преобразования данных
ERROR - Failed to execute SQL: syntax error near 'FORM'
ERROR - Connection to MySQL failed: timeout
ERROR - Cannot convert column 'price' to float

Настраиваемая конфигурация логирования

Использование логирования в Python

import logging

# Настройка корневого логгера
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('datastore.log'),
        logging.StreamHandler()
    ]
)

# Получение логгера DataStore
ds_logger = logging.getLogger('chdb.datastore')
ds_logger.setLevel(logging.DEBUG)

Запись в файл

import logging

# Создать обработчик файла
file_handler = logging.FileHandler('datastore_debug.log')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
))

# Добавить в логгер DataStore
ds_logger = logging.getLogger('chdb.datastore')
ds_logger.addHandler(file_handler)

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

import logging

# Отключить все журналы DataStore
logging.getLogger('chdb.datastore').setLevel(logging.CRITICAL)

# Или через config
config.set_log_level(logging.CRITICAL)

Сценарии отладки

Отладка генерации SQL

config.enable_debug()

ds = pd.read_csv("data.csv")
result = ds.filter(ds['age'] > 25).groupby('city').sum()

Вывод логов:

DEBUG - Creating DataStore from file 'data.csv'
DEBUG - Building filter: age > 25
DEBUG - Building groupby: city
DEBUG - Building aggregation: sum
DEBUG - Generated SQL:
        SELECT city, SUM(*) 
        FROM file('data.csv', 'CSVWithNames')
        WHERE age > 25
        GROUP BY city

Отладка выбора движка

config.enable_debug()

result = ds.filter(ds['x'] > 10).apply(custom_func)

Вывод логов:

DEBUG - filter: selecting engine (eligible: chdb, pandas)
DEBUG - filter: using chdb (SQL-compatible)
DEBUG - apply: selecting engine (eligible: pandas)
DEBUG - apply: using pandas (custom function)

Отладка работы кэша

config.enable_debug()

# Первое выполнение
result1 = ds.filter(ds['age'] > 25).to_df()
# DEBUG - Промах кэша для хэша запроса abc123
# DEBUG - Выполнение запроса...
# DEBUG - Кэширование результата (ключ: abc123, размер: 1.2MB)

# Второе выполнение (тот же запрос)
result2 = ds.filter(ds['age'] > 25).to_df()
# DEBUG - Попадание в кэш для хэша запроса abc123
# DEBUG - Возврат кэшированного результата

Устранение проблем с производительностью

config.enable_debug()
config.enable_profiling()

# В журнале будет отображаться время выполнения каждой операции
result = (ds
    .filter(ds['amount'] > 100)
    .groupby('region')
    .agg({'amount': 'sum'})
    .to_df()
)

Вывод логов:

DEBUG - filter: 0.002ms
DEBUG - groupby: 0.001ms
DEBUG - agg: 0.003ms
DEBUG - SQL generation: 0.012ms
DEBUG - SQL execution: 89.456ms  <- Основное время затрачивается здесь
DEBUG - Result conversion: 2.345ms

Конфигурация продакшна

import logging

from chdb.datastore.config import config

# Продакшн: минимальное логирование
config.set_log_level(logging.WARNING)
config.set_log_format("simple")
config.set_profiling_enabled(False)

Ротация логов

import logging

from logging.handlers import RotatingFileHandler

# Создать обработчик с ротацией файлов
handler = RotatingFileHandler(
    'datastore.log',
    maxBytes=10*1024*1024,  # 10 МБ
    backupCount=5
)
handler.setLevel(logging.WARNING)

# Добавить в логгер DataStore
logging.getLogger('chdb.datastore').addHandler(handler)

Переменные окружения

Вы также можете настроить логирование через переменные окружения:

# Установить уровень логирования
export CHDB_LOG_LEVEL=DEBUG

# Установить формат логирования
export CHDB_LOG_FORMAT=verbose
import os
import logging

# Чтение из переменных окружения
log_level = os.environ.get('CHDB_LOG_LEVEL', 'WARNING')
config.set_log_level(getattr(logging, log_level))

Сводка

Задача Команда
Включить отладку config.enable_debug()
Установить уровень config.set_log_level(logging.DEBUG)
Установить формат config.set_log_format("verbose")
Записывать в файл Используйте обработчики логирования в Python
Подавить вывод журналов config.set_log_level(logging.CRITICAL)
Navigation