У моего работодателя есть конвейерный обработчик CustomLog, который сокращает и подготавливает журналы доступа машины статического веб-контента в кошерный формат для сброса в hadoop / hive. К сожалению, он зависит от регулярного выражения для преобразования формата журнала вместе с несколько запутанной логикой, чтобы справиться с худшим, что Интернет может на него подкинуть.
Исправление состоит в том, чтобы заменить текущий сценарий и сделать весь конвейер более надежным. Одна из моих идей заключалась в том, чтобы избавиться от части регулярного выражения и сделать что-то вроде:
LogFormat "%v:%p\t%h\t%l\t%u\t%t\t\"%r\"\t%>s\t%O\t\"%{Referer}i\"\t\"%{User-Agent}i\"" vhost_combined_tabs
Хитрость в том, что ВСЕ поля будут разделены табуляцией. Так что на языке сценариев простое разделение на "\ t" могло надежно разрушить журнал доступа. Даже если одно из полей вернется как "", вкладка сохранит целостность записи.
Проблема в том, что я не смог найти в Google ничего, что упоминало бы об этом. Мне кажется интуитивно понятным отделить работу от источника, вместо того, чтобы иметь дело с проблемой скриптом. Я что-то упустил?
Я не думаю, что вы что-то упускаете, очевидная проблема заключается в том, что ни одно из полей данных без кавычек не должно иметь возможности содержать символ-разделитель. Если какие-либо поля данных в кавычках могут когда-либо содержать ваш символ-разделитель, вам придется использовать менее эффективный метод для последующего разделения полей.
Вкладка должна быть относительно безопасной
Обратите внимание, что в версиях httpd 2.0 до 2.0.46 не выполнялось экранирование строк из% ... r,% ... i и% ... o. Это было главным образом для соответствия требованиям общего формата журнала. Это означало, что клиенты могли вставлять управляющие символы в журнал, поэтому при работе с необработанными файлами журнала приходилось соблюдать осторожность.
По соображениям безопасности, начиная с 2.0.46, непечатаемые и другие специальные символы экранируются в основном с помощью последовательностей \ xhh, где hh обозначает шестнадцатеричное представление необработанного байта. Исключениями из этого правила являются символы "и \", которые экранируются добавлением обратной косой черты, а также все пробельные символы, записанные в их нотации в стиле C (\ n, \ t и т. Д.).
http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats