чат лог что это
САМП помогите))
Мои документы\ГТА Сан Андреас Юзер Файлес\Самп\Чатлог. тхт
[17:57:45] Connecting to 185.169.134.3:7777.
[17:57:47] Connected. Joining the game.
[17:57:47] Добро пожаловать на Arizona Role Play!
[17:57:55] Connected to
[17:57:55] Объявление: Куплю а/м модель Турисмо или Буллет. Цена: договорная. Отправил: Kerry_Brothers[79] Тел. 1596127
[17:57:55] Отредактировал сотрудник СМИ [ SF ] : Kreit_Truster[629]
[17:57:58] Объявление: Продам дом в опасном районе. Цена: 950тыс. Отправил: Andy_Mury[322] Тел. 3850253
[17:57:58] Отредактировал сотрудник СМИ [ LV ] : Bruno_Orfanelli[66]
[17:58:03]
[17:58:03]
[17:58:04]
[17:58:04]
[17:58:12] Отредактировал сотрудник СМИ [ SF ] : German_Holmes[664]
[17:58:12] Объявление: Продам большой дом на колесах. Цена: 6 млн. Отправил: Ron_Harlam[966] Тел. 5759457
[17:58:12] Отредактировал сотрудник СМИ [ SF ] : Jake_Borrow[522]
[17:58:21]
[17:58:21] Объявление: Продам дом около казино 4 дракона. Цена: 800 тыс.. Отправил: Pakistan_Vendetta[969] Тел. 5970090
[17:58:21] Отредактировал сотрудник СМИ [ LS ] : Vitaliy_Pride[541]
[17:58:22] Объявление: Продам трейлер, среднего класса. Цена: договорная. Отправил: Rudy_Hernandez[187] Тел. 4832842
[17:58:22] Отредактировал сотрудник СМИ [ SF ] : Kreit_Truster[629]
[17:58:37] Объявление: Продам большой дом на колесах. Цена: Договорная. Отправил: Uncle_Bobby[933] Тел. 6255661
[17:58:37] Отредактировал сотрудник СМИ [ LV ] : Bruno_Orfanelli[66]
[17:58:41] Лидеры онлайн:
[17:58:45]
[17:58:45] Mickey_Kraus[482] кричит: Приму в семью!!
[17:58:48]
[17:58:51] Maks_Korduk пытается завести двигатель
Анализ сообщений коммерческого чата на предмет игнорирования вопроса клиента на основе модели nlp
Задача – «Провести анализ сообщений коммерческого чата на предмет игнорирования вопроса клиента менеджером компании»
На входе: лог чатов с клиентом компании в csv формате:
План решения:
Выбор инструмента для определения похожих сообщений внутри каждого чата
Анализ полученных результатов
Подготовка данных
Применяются следующие инструменты:
Выполнена загрузка CSV файлов в DataFrame. Форматы дат в разных логах отличаются, поэтому они приведены к единому виду. Сортировка выполнена по номерам чатов и датам сообщений, также проводиться сброс/упорядочивание индексов.
Размер DF, rows = 144584
На основании группировки делаем вывод, что основная часть сообщений чата приходиться на клиентов и консультантов компании. Изредка наблюдаются автоматические сообщения системы.
Размер большинства чатов – 25 сообщений.
Проведена обработка текста: нижний регистр, игнорирование сообщений с одним словом, оставляем только русские буквы, пробел и тире. Удалены из сообщений тексты о вложениях документов вида «картинка.jpg».
Заменяем несколько пробелов одним пробелом.
Чистим от частотных/не значимых словосочетаний:
Приводим слова к нормальной форме, удалим из текста частотные слова
Выбор инструмента для поиска похожих сообщений внутри каждого чата
Найдем расстояние Левенштейна всех заявок по всем текстам:
В результате тестирования была обнаружена самая производительная библиотека для расчета редакционного расстояния Левенштейна – editdistance.
Расчет затраченного времени в секундах на обработку 29463 сообщений чата представлен ниже. В тесте участвовали import edit_distance, import editdistance, import textdistance, from jellyfish import:
Библиотека editdistance производительнее аналогов от 18 до 31 раза.
Чтобы определить допустимую схожесть текстов используем метрику CURRENT_LEVEN, которая ограничит допустимое значение отношения редакционного расстоянию двух сравниваемых текстов к длине первого текста — editdistance (text1, text2)/ длину текста(text1).
Значение параметра CURRENT_LEVEN подбирается опытным путем. Проведением итерации расчета и добавления стоп-слов. Значение зависит от средней длины сравниваемых текстов и индивидуально для каждого исследования. В моем случае рабочий CURRENT_LEVEN составил 0.25.
Анализ полученных результатов
Формируется dataframe из расчетных данных:
Разворот сообщений в строки:
Добавляются признаки к датафрейму df_users_rep_msg
Посмотрим на сообщения, количество которых повторяются более 6 раз в одном чате
Следует уделить внимание на чаты, в которых присутствуют частотные сообщения от клиентов, как в примере выше, и выяснить причину настойчивости и удовлетворённость клиента сервисом.
Разметим основной дата фрейм
Получим минимальный и максимальный индекс по каждому совпавшему сообщению
В примере ниже видно, как обращение перехватил бот/автоматизированная система, клиент не игнорирован
Проверяем остальные случаи
Количество обработанных сообщений:
Заключение
С помощью NLP модели, построенной на измерении редакционного расстояния по Левенштейну, удалось сократить кол-во проверяемых чатов с 5406 ед. до 339 ед. Из них определить высоко-рисковые чаты — 103 ед. Определить и использовать в расчетах высокопроизводительную библиотеку для расчета дистанции редактирования между текстами, позволяющую масштабировать проверку на большие объемы информации.
Что такое логирование?
Известно, что программисты проводят много времени, отлаживая свои программы, пытаясь разобраться, почему они не работают — или работают неправильно. Когда говорят про отладку, обычно подразумевают либо отладочную печать, либо использование специальных программ – дебагеров. С их помощью отслеживается выполнение кода по шагам, во время которого видно, как меняется содержимое переменных. Эти способы хорошо работают в небольших программах, но в реальных приложениях быстро становятся неэффективными.
Сложность реальных приложений
Возьмем для примера типичный сайт. Что он в себя включает?
И это только самый простой случай. Реальность же значительно сложнее: множество разноплановых серверов, системы кеширования (ускорения доступа), асинхронный код, очереди, внешние сервисы, облачные сервисы. Все это выглядит как многослойный пирог, внутри которого где-то работает нами написанный код. И этот код составляет лишь небольшую часть всего происходящего. Как в такой ситуации понять, на каком этапе был сбой, или все пошло не по плану? Для этого, как минимум, нужно определить, в каком слое произошла ошибка. Но даже это не самое сложное. Об ошибках в работающем приложении узнают не сразу, а уже потом, — когда ошибка случилась и, иногда, больше не воспроизводится.
Логирование
И для всего этого многообразия систем существует единое решение — логирование. В простейшем случае логирование сводится к файлу на диске, куда разные программы записывают (логируют) свои действия во время работы. Такой файл называют логом или журналом. Как правило, внутри лога одна строчка соответствует одному действию.
Выше небольшой кусок лога веб-сервера Хекслета. Из него видно ip-адрес, с которого выполнялся запрос на страницу и какие ресурсы загружались, метод HTTP, ответ бекенда (кода) и размер тела ответа в HTTP. Очень важно наличие даты. Благодаря ей всегда можно найти лог за конкретный период, например на то время, когда возникла ошибка. Для этого логи грепают:
Когда программисты только начинают свой путь, они, часто не зная причину ошибки, опускают руки и говорят «я не знаю, что случилось, и что делать». Опытный же разработчик всегда первым делом говорит «а что в логах?». Анализировать логи — один из базовых навыков в разработке. В любой непонятной ситуации нужно смотреть логи. Логи пишут все программы без исключения, но делают это по-разному и в разные места. Чтобы точно узнать, куда и как, нужно идти в документацию конкретной программы и читать соответствующий раздел документации. Вот несколько примеров:
Многие программы логируют прямо в консоль, например Webpack показывает процесс и результаты сборки:
Во фронтенде файлов нет, поэтому логируют либо прямо в консоль, либо к себе в бекенды (что сложно), либо в специализированные сервисы, такие как LogRocket.
Уровни логирования
Чем больше информации выводится в логах, тем лучше и проще отладка, но когда данных слишком много, то в них тяжело искать нужное. В особо сложных случаях логи могут генерироваться с огромной скоростью и в гигантских размерах. Работать в такой ситуации нелегко. Чтобы как-то сгладить ситуацию, системы логирования вводят разные уровни. Обычно это:
Поддержка уровней осуществляется двумя способами. Во-первых, внутри самой программы расставляют вызовы библиотеки логирования в соответствии с уровнями. Если произошла ошибка, то логируем как error, если это отладочная информация, которая не нужна в обычной ситуации, то уровень debug.
Во-вторых, во время запуска программы указывается уровень логирования, необходимый в конкретной ситуации. По умолчанию используется уровень info, который используется для описания каких-то ключевых и важных вещей. При таком уровне будут выводиться и warning, и error. Если поставить уровень error, то будут выводиться только ошибки. А если debug, то мы получим лог, максимально наполненный данными. Обычно debug приводит к многократному росту выводимой информации.
Уровни логирования, обычно, выставляются через переменную окружения во время запуска программы. Например, так:
Существует и другой подход, основанный не на уровнях, а на пространствах имен. Этот подход получил широкое распространение в JS-среде, и является там основным. Фактически, он построен вокруг одной единственной библиотеки debug для логирования, которой пронизаны практически все JavaScript-библиотеки как на фронтенде, так и на бекенде.
Принцип работы здесь такой. Под нужную ситуацию создается специализированная функция логирования с указанием пространства имен, которая затем используется для всех событий одного процесса. В итоге библиотека позволяет легко отфильтровать только нужные записи, соответствующие нужному пространству.
Запуск с нужным пространством:
Ротация логов
Со временем количество логов становится большим, и с ними нужно что-то делать. Для этого используется ротация логов. Иногда за это отвечает сама программа, но чаще — внешнее приложение, задачей которого является чистка. Эта программа по необходимости разбивает логи на более мелкие файлы, сжимает, перемещает и, если нужно, удаляет. Подобная система встроена в любую операционную систему для работы с логами самой системы и внешних программ, которые могут встраиваться в нее.
С веб-сайтами все еще сложнее. Даже на небольших проектах используется несколько серверов, на каждом из которых свои логи. А в крупных проектах тысячи серверов. Для управления такими системы созданы специализированные программы, которые следят за логами на всех машинах, скачивают их, складывают в заточенные под логи базы данных и предоставляют удобный способ поиска по ним.
Здесь тоже есть несколько путей. Можно воспользоваться готовыми решениями, такими как DataDog Logging, либо устанавливать и настраивать все самостоятельно через, например, ELK Stack
Логирование в Java / quick start
В ходе моей работы в компании DataArt я, в числе прочего, занимаюсь менторской деятельностью. В частности это включает в себя проверку учебных заданий сделанных практикантами. В последнее время в заданиях наметилась тенденция «странного» использования логеров. Мы с коллегами решили включить в текст задания ссылку на статью с описанием java logging best practices, но оказалось, что такой статьи в которой бы просто и без лишних деталей на практике объяснялось бы как надо писать в лог на Java, вот так вот с ходу не находится.
Данная статья не содержит каких-то откровений, в ней не рассматриваются тонкости какого либо из многочисленных java logging frameworks. Здесь рассказываю как записать в лог так, чтобы это не вызвало удивления у Ваших коллег, основная цель написания включить ее в список обязательного чтения для практикантов. Если все еще интересно, читайте дальше
Пример №1
Хорошо
Плохо
По сути тоже самое но букв больше и читается не так легко.
Замечание между примерами
Пример №2
Хорошо
Плохо
Если логировать только ex.toString(), то потом Вы не сможете понять в какой строке изначально сработало исключение.
Пример №3
Логер надо конфигурировать. Есть конфигурация по умолчанию она выводит в консоль все сообщения с уровнем INFO и выше. Она достаточно хороша, для разработки из IDE, но для реального приложения ее обычно неплохо бы подправить.
Какие тут есть варианты
По умолчанию: Файл logging.properties для уровня INFO, вывод в консоль
#Console handler
handlers= java.util.logging.ConsoleHandler
.level=INFO
Делаем логирование более подробным выводим еще и сообщения уровня FINE
#Console handler
handlers= java.util.logging.ConsoleHandler
.level=FINE
java.util.logging.ConsoleHandler.level = FINE
Выводим лог сообщения куда-то еще
Чтобы решить эти проблемы был придуман java.util.logging.FileHandler — хэндлер который выводит лог сообщения в файл. При этом он умеет ротировать файлы, т.е. после достижения максимально допустимого размера, он дописывает в файл текщуее лог сообщение и открывает новый файл с инкрементальным префиксом. И так по кругу. Например
создаст вот такие файлы (последняя колонка — размер в байтах)
Мы указали максимальный размер 50 байтов, в реальной жизни надо скорее указывать не меньше мегабайта, например вот так (я знаю, что 1000000 это чуть меньше мегабайта, но кому охота по памяти писать 1048576, если суть дела это фактически не меняет)
В примере, как мы видим, файлы получились больше 50 байт потому что размер по сути округляется вверх до последнего целого лог сообщения. Т.е. если Вы укажете размер 1 байт и запишете лог сообщение размером в 1000 байт то размер файла станет 1000 байт и после этого лог сообщения файл закроется и откроется следующий.
copy & paste конфиг для реальной жизни, его вполне хватает для большинства service, console и desktop приложений.
Последняя часть магии
Первый чуть более правильный ибо он декларативный и работает сразу, до того как начал работать код Вашего приложения.
Вот так
java Djava.util.logging.config.file=logging.properties com.dataart.application.ClassName
Но к сожалению менять строку запуска не всегда можно или не всегда удобно. Второй способ тоже неплохо работает.
Что осталось за кадром
[LR WEB] Chat Logging fix
Версия | Дата выпуска | Скачивания | Оценка |
---|---|---|---|
fix | 17 Мар 2021 | 193 | 3.00 звёзд 1 оценок |
2.3 [ NEW CORE ] | 16 Мар 2021 | 30 | 0.00 звёзд 0 оценок |
2.3 | 13 Ноя 2020 | 107 | 5.00 звёзд 1 оценок |
Новое ядро
1) Формат сообщений перенесён в файл перевода «translations/webtogame.phrases.txt»
Спасибо за идею @lar1ch
3) Улучшена поддержка CSS (Отображение цветов в сообщениях и воспроизведение звуков)
Спасибо @lar1ch
4) Выход из BETA ветки в релиз
Порядок обновления:
WEB: Заменить папки
— chatlog\web\module_page_chatlog\ext
— chatlog\web\module_page_chatlog\forward
Game: Заменить плагин в папке plugins
Перезагрузить плагин командой «sm plugins reload webtogame» / изменить карту / перезагрузить сервер
1) Исправлены ошибки в плагине, оптимизирована работа
2) Исправлены ошибки на стороне Web, улучшено логирование и оптимизировано взаимодействие с игрой
1) GAME: Выключить сервер или прописать в консоли «sm plugins unload webtogame»
2) Загрузить новый плагин
— csgo\addons\sourcemod\plugins\webtogame.smx
3) WEB: Заменить папки и файлы
— chatlog\web\module_page_chatlog\ext
— chatlog\web\module_page_chatlog\forward
— chatlog\web\module_page_chatlog\includes\players.php
4) Включить сервер, или изменить карту, или прописать в консоли «sm plugins load webtogame»