Skip to content

Instantly share code, notes, and snippets.

@rodion-solovev-7
Last active October 23, 2021 08:56
Show Gist options
  • Save rodion-solovev-7/4e7a9e79cc5756a61a7e61ec73304e49 to your computer and use it in GitHub Desktop.
Save rodion-solovev-7/4e7a9e79cc5756a61a7e61ec73304e49 to your computer and use it in GitHub Desktop.
Сами файлы логов не залились [:-|]. С учётом поправок, записей, отсутствующих в pin_log.txt, но присутствующих в pintset_finish.log - нет. out2.txt - записи из pintset_finish.log, которых нет в pin_log.txt
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
#!/usr/bin/env python
# coding: utf-8
# экспорт кода из блокнота
# # Сравнение 2-ух логов
# In[10]:
from datetime import datetime, timedelta
# !conda install -c conda-forge dateparser
# !python -m pip install dateparser
import dateparser
# ## Задание
#
#
# - Есть 2 лога:
# ```
# pin_log.txt (54.5 MB)
# pintset_finish.log (3 MB)
# ```
# - `pin_log.txt` ведется с 10-го августа, а `pintset_finish.log` - с 26-го. **Записи до 26-го августа нужно игнорировать**.
# - В `pin_log.txt` рассматривать только записи вида `"Пинцет закончил"`.
# - В `pintset_finish.log` содержатся уже отфильтрованные записи - рассматривать нужно все.
# - Записи должны совпадать посекундно. Но возможно что в `pintset_finish.log` запись будет начинаться со следующей секунды (можно увидеть по миллисекундам).
# - Время в `pin_log.txt` местное, а в `pintset_finish.log` - UTC. Т.е. **ко времени из `pintset_finish.log` нужно прибавить +5 часов**, чтобы время сошлось.
#
# Из этих 2-ух файлов нужно сформировать 2 новых файла:
# 1. вызовы из `pin_log.txt`, которых нет в `pintset_finish.log` (но таких предположительно 0)
# 2. вызовы из `pintset_finish.log`, которых нет в `pin_log.txt`
# Оригинал (для сверки в случае непонимания)
#
# ```
# 1. Вот есть 2 лога. В pin_log.txt надо смотреть записи вида "Пинцет закончил". Во втором - все подряд. Записи должны биться секунда в секунду или может быть так, что в pintset_finish.log запись уже на следующей секунде, но в её начале (тут просто есть миллисекунды).
# В общем нужно из этих 2х файлов сформировать следующие 2:
# 1) вызовы из pin_log.txt, которых нет во втором (но таких быть не должно с поправкой на то, что pin_log ведется с 10 августа, а pintset_finish с 26го, первые записи в принципе можно отрезать.
# 2) вызовы из pintset_finish, которых нет в pin_log
#
# при этом надо учесть, что время в pin_log местное, а в pintset_finish - UTC, т.е. к последнему надо прибавлять 5 часов, чтобы время сошлось
# ```
# ## Поверхностно смотрим на содержимое логов
# In[11]:
log1_filename = "pin_log.txt"
print(f"{log1_filename}:")
with open(log1_filename, 'r') as f:
for _ in range(10):
print(f.readline(), end='')
# In[12]:
log2_filename = "pintset_finish.log"
print(f"{log2_filename}:")
with open(log2_filename, 'r') as f:
for _ in range(10):
print(f.readline(), end='')
# Гипотеза: во втором логе содержатся одни и те же записи (меняются только даты)
# In[13]:
from collections import Counter
records = Counter()
with open(log2_filename, 'r') as f:
lines = map(lambda line: line[23:], f.readlines())
records = Counter(lines)
print(f"{len(records) = }")
print(*records.items(), sep='\n')
# Вывод: записи одни и те же, но меняются клиенты и адрес по которую обращаются к хосту
# ## Достаём все моменты завершения пинцета из pin_log.txt
# - Отфильтровывать записи, не содержащие `"Пинцет закончил"`
# - Записи до 26-го августа можно игнорировать
# In[14]:
pintset_finish_times1 = []
with open(log1_filename, 'r') as f:
for line in f.readlines():
# смотреть только записи вида "Пинцет закончил"
if 'Пинцет закончил' not in line:
continue
time = dateparser.parse(line[:19])
# записи до 26-го августа можно игнорировать
if time < datetime(2021, 8, 26, 18, 8, 53):
continue
pintset_finish_times1.append(time)
print(f"{len(pintset_finish_times1) = }", *pintset_finish_times1, sep='\n')
# ## Достаём все моменты завершения пинцета из pintset_finish.log
# - В pintset_finish.log содержатся уже отфильтрованные записи - рассматривать нужно все.
# - Смещаем даты на 5 часов и соотносим
# In[15]:
pintset_finish_times2 = []
with open(log2_filename, 'r') as f:
for line in f.readlines():
time = dateparser.parse(line[:23]) + timedelta(hours=5)
pintset_finish_times2.append(time)
print(f"{len(pintset_finish_times2) = }", *pintset_finish_times2, sep='\n')
# ## Совмещаем данные + ищем несовпадения
# Для каждого времени записи считаем количество соответствующих ему записей из противоположного лога. Соответствие будет определяться из разницы времени логгирования (в рамках 0.5 секунд до и 1.5 секунд после, например).
#
# Записи с 0 или >=2 соответствующими (из другого лога) записями будут претендентами для разбора полётов
# In[16]:
from bisect import bisect_left, bisect_right
def is_paired(time1: datetime, time2: datetime) -> bool:
"""
Определяет по времени логгирования, являются ли
записи в разных логах одним и тем же событием
"""
mn = timedelta(seconds=-0.3)
mx = timedelta(seconds=+1.1)
return mn <= time2 - time1 <= mx
def filter_times_in_interval(
times: list[datetime],
time: datetime,
) -> list[datetime]:
"""
Возвращает все datetime, находящиеся
во временном диапазоне [-10; +10] секунд
"""
mn, mx = timedelta(seconds=-10), timedelta(seconds=+10)
l = bisect_left(times, time + mn)
r = bisect_right(times, time + mx)
return times[l:r]
print("Время из лога | подошедшие | времена в диапазоне")
print(f"{log1_filename} -> {log2_filename}")
print('-' * 8)
not_exists_in_2 = []
for i, time in enumerate(pintset_finish_times1, 0):
times_in_interval = filter_times_in_interval(pintset_finish_times1, time)
filtered_times = [
t for t in times_in_interval
if is_paired(time, t)
]
if len(filtered_times) != 1:
not_exists_in_2.append(time)
print(time, [*map(str, filtered_times)], [*map(str, times_in_interval)])
print(f"{log2_filename} -> {log1_filename}")
print('-' * 8)
not_exists_in_1 = []
for i, time in enumerate(pintset_finish_times2, 0):
times_in_interval = filter_times_in_interval(pintset_finish_times1, time)
filtered_times = [
t for t in times_in_interval
if is_paired(t, time)
]
if len(filtered_times) != 1:
not_exists_in_1.append(time)
print(time, [*map(str, filtered_times)], [*map(str, times_in_interval)])
# In[17]:
# для ускорения
not_exists_in_1 = set(not_exists_in_1)
not_exists_in_2 = set(not_exists_in_2)
# In[18]:
out1_filename = 'out1.log'
out2_filename = 'out2.log'
with (open(log1_filename, 'r') as f,
open(out1_filename, 'w') as out):
for line in f.readlines():
# смотреть только записи вида "Пинцет закончил"
if 'Пинцет закончил' not in line:
continue
time = dateparser.parse(line[:19])
# записи до 26-го августа можно игнорировать
if time < datetime(2021, 8, 26, 18, 8, 53):
continue
if time in not_exists_in_2:
print(line, end='')
print(line, end='', file=out)
print('-' * 12)
with (open(log2_filename, 'r') as f,
open(out2_filename, 'w') as out):
for line in f.readlines():
time = dateparser.parse(line[:23]) + timedelta(hours=5)
if time in not_exists_in_1:
print(line, end='')
print(line, end='', file=out)
2021-09-09 00:18:55.587 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 00:21:55.264 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 00:44:10.396 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 00:46:35.616 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 00:55:31.568 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 00:57:55.671 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 01:17:01.693 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 01:46:20.104 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 01:48:10.700 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:00:10.024 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:09:42.812 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:12:06.694 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:19:19.579 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:22:18.747 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:24:42.884 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:27:42.037 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:30:06.161 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:37:52.575 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:40:16.707 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:42:40.331 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 02:56:27.785 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 03:03:38.464 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 03:06:02.860 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.21.0.4
2021-09-09 20:16:59.283 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-13 03:10:15.323 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:38:38.975 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:44:10.386 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:46:39.305 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:49:37.052 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:55:27.654 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 11:58:30.195 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 12:04:25.699 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 12:07:47.397 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 12:10:45.178 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 12:13:47.675 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 13:16:57.568 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 13:20:00.109 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 13:23:02.634 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-09-23 13:26:05.158 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.22.0.4
2021-10-07 11:22:44.104 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-08 12:22:53.268 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-08 12:24:33.732 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-09 11:32:33.135 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-09 11:32:42.774 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-13 03:43:28.622 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.23.0.4
2021-10-13 12:32:15.877 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-13 12:32:30.740 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-13 12:32:33.526 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-14 11:08:15.310 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-14 11:08:44.680 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-14 11:17:45.655 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-15 11:21:00.066 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-15 11:21:57.825 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 11:21:56.235 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 11:21:58.692 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 11:22:00.703 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 11:22:17.991 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 11:22:20.777 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-16 18:56:30.806 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://localhost/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-17 10:59:49.320 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:05.464 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:09.904 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:11.328 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:11.561 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:13.244 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:08:56.764 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
2021-10-21 14:21:22.545 | INFO | app.routers.custom_routers:custom_route_handler:49 - PUT http://10.98.2.21/api/v1_0/pintset_finish; client: 172.24.0.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment