Last active
October 23, 2021 08:56
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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