Логи облачного хранилища

Пользователи облачного хранилища могут получить логи с информацией о том, какие запросы выполнялись к публичным контейнерам за определённый период времени, какие файлы и сколько раз были скачаны, каков общий объём загруженной из хранилища информации.

Логи можно получить двумя способами: через панель управления и через API. Подробно о процедуре загрузки и анализа логов будет рассказано ниже.

Получение логов через панель управления

В панели управления хранилищем перейдите на вкладку История операций.

image

image

Нажмите кнопку Сформировать отчёт.

Формирование отчёта, в особенности за длительный период, может занять продолжительное время.

По завершении операции на вы увидите ссылку на отчёт.

image

Также файл отчёта будет добавлен в контейнер Logs, который создаётся автоматически.

Получение логов через API

Логи за выбранный период времени можно также получить, выполнив запрос к API

Пример запроса:

curl -i -XPOST https://api.selcdn.ru/v1/logs -H "X-Auth-Token: rg17f50x400a38q284dcae97186lw900" -H "X-Start-Time: 2017-05-01 00:00:00" -H "X-End-Time: 2016-06-01 00:00:00"

Как видно из приведённого примера, это POST-запрос на https://api.selcdn.ru/v1/logs. Запрос содержит следующие параметры:

  • X-Auth-Token — ключ авторизации (подробнее об этом читайте в документации к API);

  • X-Start-Time —  начало отчётного периода (дата и время);

  • X-End-Time — конец отчётного периода (дата и время).

При успешном выполнении запроса API возвращает ответ с кодом 200 OK.

Получение логов: пример программы на Python 

import requests
 
import os
import re
#указываем логин и пароль для авторизации
headers = {'X-Auth-User': 'uSeR', 'X-Auth-Key': 'Pa$$w0rd'}
#отправляем запрос на авторизацию
r = requests.get('https://auth.selcdn.ru/', headers=headers)
assert r.status_code is 204

#из полученного ответа берём заголовки X-Auth-Token и X-Storage-Url и присваиваем их значения переменным
auth_token = r.headers.get('X-Auth-Token')
storage_url = r.headers.get('X-Storage-Url')

#добавляем ещё два заголовка, необходимые для получения логов
log_headers ={'X-Auth-Token': auth_token, 'X-Start-Time': '2017-05-29 00:00:00', 'X-End-Time': '2017-06-21 00:00:00'}

#запрашиваем логи
r = requests.post(storage_url+'logs', headers=log_headers)

При успешном выполнении запроса файл отчёта будет добавлен в контейнер Logs.

Анализ логов

Рассмотрим пример записи из лога: 

2016-04-20_11:24:11     path:0000.selcdn.com/images/myimage.png        method:GET      status:200      
client:12.34.567.89, 1  agent:Mozilla/5.0 (Ma   tx:340937      rx:595

В записи содержится следующая информация:

  • дата и время обращения к хранилищу;

  • путь в формате “URL хранилища/имя контейнера/имя файл”;

  • HTTP-метод, использованный в обращении к запросу;

  • код ответа;

  • программное обеспечение, которое использовалось для выполнения запроса к хранилищу, и его характеристики;

  • объём отправленной (tx) и принятой информации в байтах.

Пример программы для анализа логов

Представим себе следующую ситуацию: мы скачали файл логов, и нам нужно посчитать количество скачиваний объектов из наших контейнеров. Эту процедуру несложно автоматизировать.

Ниже мы рассмотрим пример простой программы на Python, которая будет выполнять следующие действия:

  • выбирать из файла с логом строчки, говорящие об успешном GET запросе к объекту или списку объектов;
  • считать количество таких запросов к объектам или спискам объектов;
  • выводить конечную информацию в стандартный вывод.
import argparse
from collections import Counter

def main():
    parser = argparse.ArgumentParser(
        description='Process storage access log files.')
    parser.add_argument('path_to_file', help='Path to logfile')
    args = parser.parse_args()

    stats = Counter()

    with open(args.path_to_file, "r") as logfile:
        for line in logfile:
            date, path, method, status, ip, agent, tx, rx = line.split('\t')
            if method.endswith('GET') and status.endswith('200'):
                stats[path.lstrip('path:')] += 1
    for objpath, downloads in stats.most_common():
        print('{}: {}'.format(objpath, downloads))

if __name__ == "__main__":
    main()

Для того чтобы воспользоваться данным примером, скопируйте текст программы в файл parse_logs.py и выполните команду:

python parse_logs.py /path/to/logfile.log