> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

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

> Настройка логирования DataStore для отладки и мониторинга

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

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

```python theme={null}
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 | Критические сбои |

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

```python theme={null}
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 + подробный формат
```

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

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

```python title="Query" theme={null}
config.set_log_format("simple")
```

```text title="Response" theme={null}
DEBUG - Executing SQL query
DEBUG - Cache miss for key abc123
```

### Формат Verbose

```python title="Query" theme={null}
config.set_log_format("verbose")
```

```text title="Response" theme={null}
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-запросы
* Выбор движка выполнения
* Операции с кэшем (попадания/промахи)
* Временные показатели операций
* Сведения об источнике данных

```text theme={null}
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

* Завершение важных операций
* Изменения конфигурации
* Подключения к источникам данных

```text theme={null}
INFO - Loaded 1,000,000 rows from data.csv
INFO - Execution engine set to: chdb
INFO - Connected to MySQL: localhost:3306/mydb
```

### Уровень WARNING

* Использование устаревших возможностей
* Предупреждения о производительности
* Некритические проблемы

```text theme={null}
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

* Ошибки при выполнении запросов
* Ошибки подключения
* Ошибки преобразования данных

```text theme={null}
ERROR - Failed to execute SQL: syntax error near 'FORM'
ERROR - Connection to MySQL failed: timeout
ERROR - Cannot convert column 'price' to float
```

***

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

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

```python theme={null}
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)
```

### Запись в файл

```python theme={null}
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)
```

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

```python theme={null}
import logging

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

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

***

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

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

```python theme={null}
config.enable_debug()

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

Вывод логов:

```text theme={null}
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
```

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

```python theme={null}
config.enable_debug()

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

Вывод логов:

```text theme={null}
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)
```

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

```python theme={null}
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 - Возврат кэшированного результата
```

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

```python theme={null}
config.enable_debug()
config.enable_profiling()

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

Вывод логов:

```text theme={null}
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
```

***

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

### Рекомендуемые настройки

```python theme={null}
import logging
from chdb.datastore.config import config

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

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

```python theme={null}
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)
```

***

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

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

```bash theme={null}
# Установить уровень логирования
export CHDB_LOG_LEVEL=DEBUG

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

```python theme={null}
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)` |
