syslog-ng для проблем с Redis, может записывать в файл, но не может писать в Redis

Мне нужно использовать Redis в качестве хранилища ключей и значений сообщений, из которого Logstash может читать. Идея состоит в том, чтобы использовать существующий сервер Syslog-ng для маршрутизации системного журнала для всех серверов на сервер Redis, чтобы Logstash мог читать с него. У меня настроен сервер Redis, и я могу подключаться и писать в Redis с сервера Syslog-ng, используя:

telnet redis.somedomain.com 6379

Таким образом, порт открыт и может быть записан, однако хранилища значений ключей не отправляются. У меня уже есть большая часть этой системы, работающей с использованием UDP, а также с добавлением к отдельным хостам в / var / log / hosts. В существующий файл syslog-ng.conf я внес следующие изменения:

# In Redis Protocol Notation
# $5 = 5 characters(LPUSH), $4 = 4 characters(logs), $(length $MSG) = character length of $MSG,
# $MSG = Log Message per syslog-ng symbols

template t_redis_lpush { template("*3\r\n$5\r\nLPUSH\r\n$4\r\nlogs\r\n$(length $MSG)\r\n$MSG\r\n"); };
destination d_redis_tcp { tcp("redis.somedomain.com" port(6379) template(t_redis_lpush)); };
log { source(remote); source(noforward); filter(f_messages);  destination(d_redis_tcp); flags(final); };

Я не включил содержимое фильтра f_messages, поскольку он уже работает и используется для отправки журналов в UDP и / var / log / hosts. Если кто-то хочет, чтобы я извлек функции фильтра, я тоже могу опубликовать их. filter (f_messages) в конечном итоге обрабатывает результат до чего-то вроде

"Jan 21 14:27:23 www1/www1 10.252.4.152 - - [21/Jan/2014:14:27:23 -0700] "POST /service.php?session_name=6tiqbpfeu1uc31pg1eimjqpvt0&url=%2Fseo%2FinContentLinks%2Fblogs.somedomain.com%7Cmusic%7C2013%7C12%7Cinterview_fredo.php%2F HTTP/1.1" 200 536 www1.nyc.somedomain.com "66.156.238.1" "-" "Arch Quickcurl" "8126464" 0 92878"

Кто-нибудь знает, почему мой шаблон Redis, пункт назначения и отправитель журналов для Syslog-ng не работают?

Заранее спасибо! Коул


person Cole Shores    schedule 21.01.2014    source источник
comment
Как насчет того, чтобы попробовать настроить централизованный Logstash? logstash.net/docs/1.3.3/tutorials/getting-started- централизованно. Настройте отправителя Logstash на сервере syslog-ng   -  person Ben Lim    schedule 22.01.2014
comment
Имеющаяся инфраструктура берет журналы из udp с каждого сервера и загружает их с помощью syslog-ng. Это не позволит мне действительно вносить изменения, не разрушая существующую структуру, и мы не можем обойтись без входа в производственные системы, или нам нужно будет кодировать решение для каждой машины, как в случае с производственными развертываниями с использованием различных форм автоматизации. Если бы я мог перехватить его на уровне syslog-ng и отправить копию хранилища ключей в Redis, тогда я мог бы передать его в новый экземпляр Logstash и в новый elasticsearch, он сработает для этого.   -  person Cole Shores    schedule 22.01.2014
comment
Я считаю, что сузил его до чего-то, связанного со спецификацией протокола или оболочкой bash. Когда я подключаюсь через telnet к серверу Redis и запускаю * 3 \ r \ n $ 5 \ r \ nLPUSH \ r \ n $ 4 \ r \ nlogs \ r \ n $ 20 \ r \ nэто некоторые данные! \ R \ n это выкидывает ошибка: -ERR Ошибка протокола: недопустимая длина нескольких блоков. он делает это, даже когда я просто пытаюсь написать * 3 \ r \ n для простого возврата каретки. Мой сервер Redis - 2.6, поэтому он должен поддерживаться, а также использовать SUSE Linux Enterprise 11.   -  person Cole Shores    schedule 22.01.2014


Ответы (1)


Извините, что не видел этого раньше. Вы смотрели на использование format-json ()?

Вот пункт назначения, который я использовал, и он работает довольно хорошо (большинство макросов поступает из парсера patterndb)

destination d_redis {
  redis (
    host("localhost")
    command("LPUSH", "logstash", "$(format-json type=bluecoat proxy_time=${PROXY.TIME} proxy_time_taken=${PROXY.TIME_TAKEN} proxy_c_ip=${PROXY.C_IP} proxy_sc_status=${PROXY.SC_STATUS} proxy_s_action=${PROXY.S_ACTION} proxy_sc_bytes=int64(${PROXY.SC_BYTES}) proxy_cs_bytes=int64(${PROXY.CS_BYTES}) proxy_cs_method=${PROXY.CS_METHOD} proxy_cs_uri_scheme=${PROXY.CS_URI_SCHEME} proxy_cs_host=${PROXY.CS_HOST} proxy_cs_uri_port=${PROXY.CS_URI_PORT} proxy_cs_uri_path=${PROXY.CS_URI_PATH} proxy_cs_uri_equery=${PROXY.CS_URI_EQUERY}  proxy_cs_username=${PROXY.CS_USERNAME} proxy_cs_auth_group=${PROXY.CS_AUTH__GROUP} proxy_s_supplier_name=${PROXY.S_SUPPLIER_NAME} proxy_content_type=${PROXY.CONTENT_TYPE} proxy_referrer=${PROXY.REFERRER} proxy_user_agent=${PROXY.USER_AGENT} proxy_filter_result=${PROXY.FILTER_RESULT} proxy_cs_categories=${PROXY.CS_CATEGORIES} proxy_x_virus_id=${PROXY.X_VIRUS_ID} proxy_s_ip=${PROXY.S_IP} proxy_any=${PROXY.ANYREST})\n")
  );
};

Кстати, я действительно предпочитаю syslog-ng выполнять синтаксический анализ, а не logstash. Мой опыт показывает, что использовать patterndb намного быстрее, чем Grok, и выполнение этого с помощью syslog-ng также делает конфигурацию более гибкой.

Удачи, джим

person Jim Hendrick    schedule 27.04.2015