深入浅出 NXLog (二)

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 模块,比较重要的配置有以下这些。

  • File
    指定需要采集的文件名,可以使用通配符。
  • SavePos
    指定是否需要保存文件的采集位置,以防止下一次启动后重采,默认是 TRUE。
  • ReadFromLast
    指定是否从文件末尾处开始采集。如果是 TRUE,就从文件尾开始采集,忽略存量数据。如果是 FALSE,要看保存的是否有文件位置,如果有就从上一次采集后的地方开始采集,如果没有就从文件首开始采集,默认是 TRUE。

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 的主要工作,下面再详细说一下他们的流程。

  • NX_EVENT_READ
    首先从 open_files 哈希表中取出一个 file,然后读取数据放到 buf 里,接着将这些数据一行行提取出来产生很多 logdata,logdata 会首先按照 Exec 的配置进行处理,如果没有被 drop 就根据 Router 的配置查看需要发送到哪个 module (Processor 或者 Output),然后再看要发送的 module queue 的 size,当 queue 满了(size >= NX_LOGQUEUE_LIMIT) 会根据 FlowControl 的配置,要么 free 该 logdata(FlowControl disable),要么将 im_file module 的状态置成 PAUSE(FlowControl enable),从而不再产生新的 logdata,以达到流控的目的。当 queue 未满就将该 logdata 放到要发送的module 的 queue 里,最后向这个 module 发送一个 NX_EVENT_DATA_AVAILABLE event,提醒它处理该 logdata,这样每个 logdata 的处理流程就算走完了。

    当这个 file 里的数据被处理完后,会从 open_files 列表中取出下一个 file 来处理,如此循环往复。为了防止文件很大导致这个过程占用很长时间,在外面就加了一个限制,最多循环 IM_FILE_MAX_READ 次。

    当这次 READ 执行完后会再产生一个 NX_EVENT_READ event,至于下一个 event 何时执行取决于 imconf->files 列表中是否有没有读取完的文件,如果有就立即执行,如果没有就等待 poll_interval 秒后执行。

  • NX_EVENT_MODULE_SPECIFIC

      if ( im_file_check_new(module, FALSE) == TRUE )
      {
      //log_info("dircheck_event_cb detected new files in check_new()");
      got_data = TRUE;
      }
      if ( im_file_check_files(module, FALSE) == TRUE )
      {
      //log_info("dircheck_event_cb detected new files in check_files()");
      got_data = TRUE;
      }
    

    首先通过 im_file_check_new 接口检查有没有未曾处理的文件,如果 File 配置指定了一个文件夹,并且 recursive 是 TRUE,该接口会遍历这个文件夹下所有的文件,包括子目录。im_file 启动过程中就干过这件事,那次是将所有的存量文件加入到 imconf->files 哈希表中,这次则是基于存量文件检查有没有新增文件。

    新增文件检查完后,还要通过 im_file_check_files 接口查看已处理的文件有没有新数据可读,它会检查文件的 size 和偏移 filepos,当 size > filepos 代表有未处理的数据。当找到 active_files 个可读文件后,这个接口会退出,以免耗费太多时间。其实在处理 NX_EVENT_READ event 快结束的时候也干过这件事,不过那时是只检查 imconf->files,这次是连 open_files 也一起检查。

    通过上面两步如果发现有新增文件或者有新数据可读,got_data 会被置成 TRUE,这时会立即产生一个 NX_EVENT_READ event 去读取数据。接着再产生一个 NX_EVENT_MODULE_SPECIFIC event,等待 dircheck_interval 秒后执行下一次检查。

3.4 im_file 停止

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. NXLog 简介 nxlog 是用 C 语言写的一个开源日志收集处理软件,它是一个模块化、多线程、高性能的日...
    Fly_Li阅读 13,072评论 1 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,463评论 25 707
  • 虽然,小时候的我们一味的灌输只要好好学习就是好孩子的思想,但是,那时候面对这个世界充满好奇的时候,会做一些和学习无...
    夏玫小墨阅读 514评论 0 2
  • 在24岁的年纪中,总对爱情和工作有着不同程度的胡思乱想。在没碰到自己爱的那个人的时候,感觉这样没心没肺的活着挺好的...
    蓝a阅读 410评论 0 0