深入浅出 NXLog (二)

2017-11-24  本文已影响0人  Fly_Li

1. Nxlog 模块简介

在之前的文章当中我已经提到过 Nxlog 的 module 共分为4种,它们分别是 input, output, processor, extension。 Input module 负责从各种数据源(如 file, archive, tcp, udp等)中采集数据,Output module 定义了该如何处理采集的数据,我们可以以文件的方式保存下来,也可能通过 tcp,udp 发出去。Processor module 负责对采集的数据进行处理,比如做一些内容过滤,格式转换之类的。Extension module 主要是用来扩展读写数据的接口,它可以针对特定的数据类型进行特定的处理,比如多行合并,将csv文件解析成不能的fields等,我的解释可能不太准确,官方的说法是:'These modules can enhance the features of nxlog in different ways, such as exporting new functions and procedures, registering additional I/O reader and writer functions to be used with modules supporting the OutputType and InputType directives'

这里面 input 和 output 模块是必不可少的,processor 和 extension 可有可无。下面我以 im_file 模块为例来讲解一下每个模块的工作流程。im_file 是个 Input 模块,它主要是用来采集文件的。

2. Module 状态机

说到工作流程,那不得不提 状态机(FSM, Finite State Machines),通过状态机可以帮我们很好的理解 module 的工作过程。

状态机
如上图所示,每个 Module 总共有 4 种状态,它们分别是UNINITIALIZED, STOPPED, RUNNING, PAUSED。每个 Module 创建成功之后会通过 nx_module_config 调用自己 config 接口加载配置,这个时候还处在 UNINITIALIZED 状态。然后通过 nx_module_init 调用自己 init 接口进行初始化,状态转换为 STOPPED。接着通过 nx_module_start_shelf 调用自己 start 接口启动该 module,状态转换为 RUNNING。这时模块就开始产生各种 event 来工作,在这个过程中它的状态也可能会变为 PAUSED,比如当 im_file 模块采集了很多数据而 Output 模块又没有及时处理时,它的状态会变成 PAUSED,等缓存的数据被消费后它的状态会再变为 RUNNING。

当进程要退出时,会通过 nx_module_stop_self 接口调用各个模块的 stop 接口,状态转换为 STOPPED,接着通过 nx_module_shutdown_self 调用 shutdown 接口回归到最初的 UNINITIALIZED 状态。

3. im_file 详解

接下来我详细讲一下 im_file 的配置,启动,工作,停止流程。

3.1 im_file 配置

每个模块在启动的过程中都要加载配置,针对 im_file 模块,比较重要的配置有以下这些。

3.2 im_file 启动

    im_file_check_new(module, imconf->readfromlast);
    im_file_add_poll_event(module, FALSE);
    im_file_add_dircheck_event(module, FALSE);

start 接口主要干了 3 件事。

  1. 将配置文件中 File 指定的所有文件打开(当文件数目大于 ActiveFiles 时,其它的文件会关闭),然后把所有的 file 结构体保存在 imconf->files 哈希表中,其中 key 是文件名,value 是 file 结构体地址。当文件个数很多时,这个过程会很慢。
  2. 产生一个 poll event,这个 event 是用来读取所有 open_files 的数据。
  3. 产生一个 dircheck event, 这个 event 是用来检查有没有未处理的文件以及已处理的文件有没有新数据可读。

3.3 im_file 工作

im_file 的工作主要是处理启动阶段产生的两个 event。其中 NX_EVENT_READ 就是上面的 poll event, NX_EVENT_MODULE_SPECIFIC 就是上面的 dircheck event。

static void im_file_event(nx_module_t *module, nx_event_t *event)
{
    ASSERT(event != NULL);

    switch ( event->type )
    {
    case NX_EVENT_READ:
        im_file_read(module);
        break;
    case NX_EVENT_MODULE_SPECIFIC:
        im_file_dircheck_event_cb(module);
        break;
    default:
        nx_panic("invalid event type: %d", event->type);
    }
}

上面已经介绍了这两个 event 的主要工作,下面再详细说一下他们的流程。

3.4 im_file 停止

stop 就比较简单了,首先将所有的 open_files 关闭,然后销毁所有的 imconf->files 结构,释放内存,这时会判断 savepos 是否为 TRUE,如果是 TRUE 会将文件的 filepos 保存到 ctx->config_cache 结构中,最后等所有的 module 退出后会将 ctx->config_cache 写入磁盘。这样
nxlog 下次启动时就知道上一次文件采集到了什么位置,不会重采。

上一篇 下一篇

猜你喜欢

热点阅读