1. Введение
Здесь описывается проект LogPipe.
logpipe-input-file
logpipe-input-tcp
logpipe-input-exec
logpipe-input-kafka
logpipe-output-file
logpipe-output-tcp
logpipe-output-stdout
logpipe-output-kafka
logpipe-output-es
logpipe-output-hdfs
К сожалению, без контекста сложно точно определить тематику и содержание исходного текста. Однако можно предположить, что речь идёт о программном обеспечении для обработки логов (журналов событий) под названием LogPipe. В тексте описывается архитектура и компоненты этого ПО, а также приводятся инструкции по его сборке и запуску.
В тексте также упоминаются различные плагины и настройки, которые могут быть использованы при работе с LogPipe, но их конкретное назначение не раскрывается.
Для более точного перевода и понимания содержания исходного текста рекомендуется обратиться к специалистам в области разработки программного обеспечения или предоставить контекст использования данного фрагмента. Перевод текста запроса на русский язык:
-std=gnu99 -c worker.c gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o logpipe main.o monitor.o worker.o -L. -L/home/calvin/lib -rdynamic -ldl -lz -llogpipe_api
��ִ�г���logpipe������־�ɼ����ش�������̬��liblogpipe_api.so����������á�
Ȼ��װ����Ŀ�꣬Ĭ��`logpipe`��װ��`$HOME/bin`��`liblogpipe_api.so`��װ��`$HOME/lib`��`logpipe_api.h`��һЩͷ�ļ���װ��`$HOME/include/logpipe`�������Ҫ�ı䰲װĿ¼����`makeinstall`���`_HDERINST`��`_LIBINST`��`_BININST`��
$ make -f makefile.Linux install rm -f /home/calvin/bin/logpipe cp -rf logpipe /home/calvin/bin/ rm -f /home/calvin/lib/liblogpipe_api.so cp -rf liblogpipe_api.so /home/calvin/lib/ rm -f /home/calvin/include/logpipe/rbtree.h cp -rf rbtree.h /home/calvin/include/logpipe/ rm -f /home/calvin/include/logpipe/LOGC.h cp -rf LOGC.h /home/calvin/include/logpipe/ rm -f /home/calvin/include/logpipe/fasterjson.h cp -rf fasterjson.h /home/calvin/include/logpipe/ rm -f /home/calvin/include/logpipe/rbtree_tpl.h cp -rf rbtree_tpl.h /home/calvin/include/logpipe/ rm -f /home/calvin/include/logpipe/logpipe_api.h cp -rf logpipe_api.h /home/calvin/include/logpipe/
Файлы в директориях src и src-plugins:
$ cd ../src-plugins
$ make -f makefile.Linux
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include -std=gnu99 -I/home/calvin/include/logpipe -c logpipe-input-file.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o logpipe-input-file.so logpipe-input-file.o -shared -L. -L/home/calvin/so -L/home/calvin/lib -llogpipe_api -rdynamic
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include -std=gnu99 -I/home/calvin/include/logpipe -c logpipe-output-file.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o logpipe-output-file.so logpipe-output-file.o -shared -L. -L/home/calvin/so -L/home/calvin/lib -llogpipe_api -rdynamic
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include -std=gnu99 -I/home/calvin/include/logpipe -c logpipe-input-tcp.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o logpipe-input-tcp.so logpipe-input-tcp.o -shared -L. -L/home/calvin/so -L/home/calvin/lib -llogpipe_api -rdynamic
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include -std=gnu99 -I/home/calvin/include/logpipe -c logpipe-output-tcp.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o logpipe-output-tcp.so logpipe-output-tcp.o -shared -L. -L/home/calvin/so -L/home/calvin/lib -llogpipe_api -rdynamic
Ȼ��װ����Ŀ�꣬Ĭ���Դ������װ��$HOME/so
�������Ҫ�ı䰲װĿ¼����makeinstall
���_LIBINST
��
$ make -f makefile.Linux install
rm -f /home/calvin/so/logpipe-input-file.so
cp -rf logpipe-input-file.so /home/calvin/so/
rm -f /home/calvin/so/logpipe-output-file.so
cp -rf logpipe-output-file.so /home/calvin/so/
rm -f /home/calvin/so/logpipe-input-tcp.so
cp -rf logpipe-input-tcp.so /home/calvin/so/
rm -f /home/calvin/so/logpipe-output-tcp.so
cp -rf logpipe-output-tcp.so /home/calvin/so/
### 2.1.3. Установка плагинов logpipe
#### 2.1.3.1. logpipe-output-hdfs
Настройка переменных окружения для работы с hadoop:
`~/.bash_profile`
export HADOOP_HOME=/home/hdfs/expack/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_CLASSPATH=hadoop classpath --glob
export CLASSPATH=$HADOOP_CLASSPATH:$CLASSPATH
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH
`makefile.Linux`
... CFLAGS_hdfs = $(CFLAGS) -I/home/hdfs/expack/hadoop/include ... LFLAGS_hdfs = $(LFLAGS) -L/home/hdfs/expack/hadoop/lib/native -lhdfs -L$(HOME)/expack/jdk1.8.0_152/jre/lib/amd64/server -ljvm ...
��`src-plugins`���ֹ������������Ƶ�`$HOME/so`Ŀ¼
$ make -f makefile.Linux logpipe-output-hdfs.so gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include -std=gnu99 -I/home/calvin/include/logpipe -I/home/hdfs/expack/hadoop/include -c logpipe-output-hdfs.c gcc -g -fPIC -O2 -Wall -Werror -fno-strong-aliasing -o logpipe-output-hdfs.so 4.2. Конфигурация
4.2.1. logpipe-input-file
inotify — это механизм ядра Linux, который отслеживает изменения в файловой системе и уведомляет об этом приложения.
Параметры:
— path — путь к файлу или каталогу, за которым будет вестись наблюдение;
— files, files2, files3 — регулярные выражения для имён файлов, которые будут отслеживаться;
— exclude_files, exclude_files2, exclude_files3 — регулярные выражения для исключения файлов из наблюдения;
— rotate_size — размер файла после достижения которого произойдёт ротация;
— exec_before_rotating — команда, которая будет выполнена перед ротацией;
— exec_after_rotating — команда, которая будет выполнена после ротации;
— compress_algorithm — алгоритм сжатия данных;
— max_append_count — максимальное количество добавлений в файл;
— max_usleep_interval — максимальный интервал ожидания между проверками размера файла;
— min_usleep_interval — минимальный интервал ожидания между проверками размера файла;
— inheritance_lines_after_rotating — количество строк, которые будут унаследованы новым файлом после ротации;
— line_mode — режим работы с файлами, содержащими строки;
Переменные окружения:
— LOGPIPE_ROTATING_PATHNAME — имя файла до ротации;
— LOGPIPE_ROTATING_OLD_FILENAME — старое имя файла после ротации;
— LOGPIPE_ROTATING_NEW_FILENAME — новое имя файла после ротации.
Пример конфигурации:
{ "plugin":"so/logpipe-input-file.so" , "path":"/home/ecif/log" , "compress_algorithm":"deflate" }
Пример расширенной конфигурации:
{ "plugin":"so/logpipe-input-file.so" , "path":"/home/calvin/log" , "exec_before_rotating":"echo \"BEFORE ROTATING ${LOGPIPE_ROTATING_OLD_FILENAME}\">>/tmp/logpipe_case2_collector.log" , "rotate_size":10 , "exec_after_rotating":"echo \"AFTER ROTATING ${LOGPIPE_ROTATING_NEW_FILENAME}\">>/tmp/logpipe_case2_collector.log" , "compress_algorithm":"deflate" }
Обратите внимание, что в примере расширенной конфигурации используется переменная окружения LOGPIPE_ROTATING_OLD_FILENAME, которая содержит старое имя файла после ротации. Это позволяет выполнить команду echo с этим именем файла и записать результат в лог-файл.
Также обратите внимание на использование переменной окружения LOGPIPE_ROTATING_NEW_FILENAME. Она содержит новое имя файла после ротации и позволяет выполнить аналогичную команду с новым именем файла.
4.2.2. logpipe-output-file
Конфигурация logpipe-output-file определяет параметры вывода данных в файл.
Параметры:
— path — путь к выходному файлу;
— uncompress_algorithm — алгоритм распаковки данных;
— rotate_size — размер выходного файла, при достижении которого происходит ротация;
— exec_after_rotating — команда, выполняемая после ротации файла.
Переменные окружения:
— LOGPIPE_ROTATING_PATHNAME — путь к входному файлу до ротации;
— LOGPIPE_ROTATING_NEW_FILENAME — путь к новому файлу после ротации.
Пример конфигурации:
{ "plugin":"so/logpipe-output-file.so" , "path":"/home/iblog/log" , "uncompress_algorithm":"deflate" }
4.2.3. logpipe-input-tcp
Конфигурация logpipe-input-tcp определяет параметры ввода данных через TCP-соединение.
Параметры:
— ip — IP-адрес сервера;
— port — порт, на котором сервер ожидает подключения.
Пример конфигурации:
{ "plugin":"so/logpipe-input-tcp.so" , "ip":"158.1.0.55" , "port":5151 }
4.2.4. logpipe-output-tcp
Конфигурация logpipe-output-tcp определяет параметры отправки данных через TCP-соединение.
Параметры:
— ip — IP-адрес клиента;
— port — порт клиента;
— ip2~8 — дополнительные IP-адреса клиентов;
— port2~8 — порты дополнительных клиентов;
— disable_timeout — отключение таймаута ожидания ответа от клиента.
Пример конфигурации:
{
"plugin":"so/logpipe-output-tcp.so",
"ip":"192.168.0.1",
"port":6001,
"ip2":"192.168.0.2",
"port2":6002,
"disable_timeout":false
}
``` ```
funcLoadOutputPluginConfig LoadOutputPluginConfig ;
int LoadOutputPluginContext( struct LogpipeEnv *p_env , struct LogpipeOutputPlugin *p_logpipe_output_plugin , void **pp_context )
{
struct OutputPluginContext **pp_plugin_ctx = (struct OutputPluginContext **)pp_context ;
/* �ͷ��ڴ��Դ�Ų�������� */
*pp_plugin_ctx = malloc( sizeof(struct OutputPluginContext) ) ;
if ( *pp_plugin_ctx == NULL ) {
return -1 ;
}
memset( *pp_plugin_ctx , 0 , sizeof(struct OutputPluginContext) );
return 0;
}
В коде есть функция LoadInputPluginConfig
, которая загружает конфигурацию входного плагина, и функция UnloadInputPluginConfig
, которая выгружает эту конфигурацию.
Функции InitInputPluginContexth
и CleanInputPluginContext
инициализируют и очищают контекст входного плагина соответственно.
Функция OnInputPluginEvent
обрабатывает события входного плагина и вызывает функцию WriteAllOutputPlugins
, которая записывает данные во все выходные плагины.
Также в коде есть функции BeforeReadOutputPlugin
и BeforeWriteOutputPlugin
, которые выполняют предварительную обработку перед чтением и записью данных соответственно.
Есть функции ReadInputPlugin
и AfterReadOutputPlugin
, которые читают и обрабатывают данные из входных плагинов.
После чтения данных из входного плагина функция ReadInputPlugin
возвращает значение LOGPIPE_READ_END_OF_INPUT
, если достигнут конец ввода.
Здесь представлен код на языке C, который реализует логику работы с входными и выходными плагинами в системе Logpipe. FilterPluginContext
{ ... } ;
func LoadFilterPluginConfig LoadFilterPluginConfig; int LoadFilterPluginConfig(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, struct LogpipePluginConfigItem *p_plugin_config_items, void **pp_context) { struct FilterPluginContext *p_plugin_ctx = NULL;
p_plugin_ctx = (struct FilterPluginContext *)malloc(sizeof(struct FilterPluginContext));
if (p_plugin_ctx == NULL)
{
ERRORLOG("malloc failed, errno[%d]", errno);
return -1;
}
memset(p_plugin_ctx, 0x00, sizeof(struct FilterPluginContext));
p_plugin_ctx->... = QueryPluginConfigItem(p_plugin_config_items, "...");
INFOLOG("...[%s]", p_plugin_ctx->...);
...
/* Здесь что-то происходит */
(*pp_context) = p_plugin_ctx;
return 0;
}
func InitFilterPluginContext InitFilterPluginContext; int InitFilterPluginContext(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void *p_context) { struct FilterPluginContext *p_plugin_ctx = (struct FilterPluginContext *)p_context;
...
/* Что-то происходит */
AddFilterPluginEvent(p_env, p_logpipe_filter_plugin, .); /* Здесь вызывается OnFilterPluginEvent */
return 0;
}
func BeforeProcessFilterPlugin BeforeProcessFilterPlugin; /* Здесь что-то происходит */ int BeforeProcessFilterPlugin(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void *p_context, uint16_t filename_len, char *filename) { struct FilterPluginContext *p_plugin_ctx = (struct FilterPluginContext *)p_context;
...
return 0;
}
func ProcessFilterPlugin ProcessFilterPlugin; int ProcessFilterPlugin(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void *p_context, uint32_t *p_block_len, char *block_buf) { struct FilterPluginContext *p_plugin_ctx = (struct FilterPluginContext *)p_context;
...
return 0;
}
func AfterProcessFilterPlugin AfterProcessFilterPlugin; /* Здесь что-то происходит */ int AfterProcessFilterPlugin(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void *p_context, uint16_t filename_len, char *filename) { struct FilterPluginContext *p_plugin_ctx = (struct FilterPluginContext *)p_context;
...
return 0;
}
func CleanFilterPluginContext CleanFilterPluginContext; int CleanFilterPluginContext(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void *p_context) { return 0; }
func UnloadFilterPluginConfig UnloadFilterPluginConfig; int UnloadFilterPluginConfig(struct LogpipeEnv *p_env, struct LogpipeFilterPlugin *p_logpipe_filter_plugin, void **pp_context) { struct FilterPluginContext **pp_plugin_ctx = (struct FilterPluginContext **)pp_context;
/* Освобождение памяти */
free((*pp_plugin_ctx)); (*pp_plugin_ctx) = NULL;
return 0;
} connected to [s1, k1]
2017-12-17 23:33:15,389 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:137)] Starting new configuration: { sourceRunners:{s1=EventDrivenSourceRunner: { source:Spool Directory source s1: { spoolDir: /home/calvin/log } }} sinkRunners:{k1=SinkRunner: { policy:org.apache.flume.sink.DefaultSinkProcessor@4224eda0 counterGroup:{ name:null counters:{} } }} channels:{c1=org.apache.flume.channel.MemoryChannel{name: c1}} }
2017-12-17 23:33:15,394 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:144)] Starting Channel c1
2017-12-17 23:33:15,395 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:159)] Waiting for channel: c1 to start. Sleeping for 500 ms
2017-12-17 23:33:15,432 (lifecycleSupervisor-1-2) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.register(MonitoredCounterGroup.java:119)] Monitored counter group for type: CHANNEL, name: c1: Successfully registered new MBean.
2017-12-17 23:33:15,432 (lifecycleSupervisor-1-2) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.start(MonitoredCounterGroup.java:95)] Component type: CHANNEL, name: c1 started
2017-12-17 23:33:15,900 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:171)] Starting Sink k1
2017-12-17 23:33:15,901 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.sink.RollingFileSink.start(RollingFileSink.java:110)] Starting org.apache.flume.sink.RollingFileSink{name:k1, channel:c1}...
2017-12-17 23:33:15,901 (conf-file-poller-0) [INFO - org.apache.flume.node.Application.startAllComponents(Application.java:182)] Starting Source s1
2017-12-17 23:33:15,903 (lifecycleSupervisor-1-4) [INFO - org.apache.flume.source.SpoolDirectorySource.start(SpoolDirectorySource.java:83)] SpoolDirectorySource source starting with directory: /home/calvin/log
2017-12-17 23:33:15,904 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.register(MonitoredCounterGroup.java:119)] Monitored counter group for type: SINK, name: k1: Successfully registered new MBean.
2017-12-17 23:33:15,904 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.start(MonitoredCounterGroup.java:95)] Component type: SINK, name: k1 started
2017-12-17 23:33:15,908 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.sink.RollingFileSink.start(RollingFileSink.java:142)] RollingFileSink k1 started.
2017-12-17 23:33:15,962 (lifecycleSupervisor-1-4) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.register(MonitoredCounterGroup.java:119)] Monitored counter group for type: SOURCE, name: s1: Successfully registered new MBean.
2017-12-17 23:33:15,962 (lifecycleSupervsor-1-4) [INFO - org.apache.flume.instrumentation.MonitoredCounterGroup.start(MonitoredCounterGroup.java:95)] Component type: SOURCE, name: s1 started
2017-12-17 23:33:23,822 (pool-3-thread-1) [INFO - org.apache.flume.client.avro.ReliableSpoolingFileEventReader.readEvents(ReliableSpoolingFileEventReader.java:324)] Last read took us just up to a file boundary. Rolling to the next file, if there is one.
2017-12-17 23:33:23,823 (pool-3-thread-1) [INFO - org.apache.flume.client.avro.ReliableSpoolingFileEventReader.rollCurrentFile(ReliableSpoolingFileEventReader.java:433)] Preparing to move file /home/calvin/log/a.log to /home/calvin/log/a.log.COMPLETED
�鿴�ɼ�Ŀ¼�鼯Ŀ¼
$ cd $HOME/log
$ ls -l
������ 109896
-rw-rw-r-- 1 calvin calvin 112530011 12�� 17 23:33 a.log.COMPLETED
$ cd $HOME/log3
$ ls -l ������ 131008 -rw-rw-r-- 1 calvin calvin 112530011 12�� 17 23:33 1513524795383-1**
$ ps aux | grep java
calvin 39254 2.4 8.0 3136484 81028 pts/8 Sl+ 23:33 0:15 /home/calvin/expack/jdk1.8.0_152/bin/java -Xmx20m -Dflume.root.logger=INFO,console -cp /home/calvin/expack/apache-flume-1.8.0-bin/conf:/home/calvin/expack/apache-flume-1.8.0-bin/lib/:/lib/ -Djava.library.path= org.apache.flume.node.Application -n a1 -f conf/test.conf**
Примечание: в тексте запроса присутствуют непечатаемые символы, которые не удалось перевести. Logpipe
Logpipe — это программа, которая используется для обработки и анализа лог-файлов. Она позволяет настраивать различные параметры для фильтрации, обработки и вывода данных.
В приведённом тексте описывается конфигурация программы logpipe. В ней определены следующие параметры:
Конфигурация программы logpipe представлена в виде JSON-объекта. В нём определены различные параметры, такие как пути к файлам, имена хостов, порты и другие настройки.
Также в тексте описываются функции, связанные с работой программы logpipe: LoadInputPluginConfig, InitInputPluginContext, OnInputPluginIdle, OnInputPluginEvent, BeforeReadInputPlugin, ReadInputPlugin, AfterReadInputPlugin, CleanInputPluginContext, UnloadInputPluginConfig. Эти функции используются для загрузки конфигурации входных плагинов, инициализации контекста, обработки событий, чтения данных и других операций.
На основе предоставленного текста можно сделать вывод, что программа logpipe представляет собой инструмент для обработки лог-данных. Она может быть использована для различных задач, таких как анализ производительности, мониторинг безопасности и т. д.
Функции работы с входными плагинами
Функции LoadInputPluginConfig и UnloadInputPluginConfig используются для загрузки и выгрузки конфигурации входных плагинов соответственно. Они принимают в качестве параметров структуру LogpipeEnv, указатель на входной плагин и указатель на контекст.
Функция InitInputPluginContext используется для инициализации контекста входного плагина. Она принимает в качестве параметров структуру LogpipeEnv, входной плагин и контекст.
Функции OnInputPluginIdle и OnInputPluginEvent используются для обработки событий, связанных с входным плагином. Они принимают в качестве параметров структуру LogpipeEnv и входной плагин.
Функции BeforeReadInputPlugin и AfterReadInputPlugin используются для управления чтением данных из входного файла. Они принимают в качестве параметров структуру LogpipeEnv, входной плагин, контекст, смещение файла, номер строки и другие параметры.
Функция ReadInputPlugin используется для чтения блока данных из файла. Она принимает в качестве параметров структуру LogpipeEnv, входной плагин, контекст, смещение файла, номер строки, размер блока и буфер для хранения данных.
Функция CleanInputPluginContext используется для очистки контекста входного плагина после его использования. Она принимает в качестве параметров структуру LogpipeEnv и входной плагин.
Эти функции представляют собой основные операции, связанные с использованием входных плагинов в программе logpipe. Они позволяют настроить параметры чтения данных, обработать события и выполнить другие операции.
Процесс работы программы
Программа logpipe работает следующим образом:
Этот процесс повторяется до тех пор, пока не будут обработаны все данные. Программа logpipe может использоваться для различных целей, таких как мониторинг производительности, анализ безопасности и другие задачи. ### 7.4.5. ES
Инициализация контекста плагина вывода InitOutputPluginContext для Kafka с использованием протокола HTTP.
OnOutputPluginEvent:
rd_kafka_poll — не удалось перевести.
Инициализация контекста плагина вывода InitOutputPluginContext для HDFS.
Путь: $system/$path/YYYYMMDD_hhmmss.
Перед записью данных в плагин вывода BeforeWriteOutputPlugin происходит проверка существования каталога YYYYMMDD в HDFS и его создание, если он отсутствует.
После записи данных вызывается метод hdfsHFlush для синхронизации данных с диском.
Информация о проекте logpipe.
Ссылки:
Контакты разработчика:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )