Skip to content

Best Practice

Andrewei edited this page Jan 2, 2018 · 12 revisions

读取的日志在不同路径下该如何配置?

  1. 可以写多份配置文件
  2. 可以使用file reader中的 tailx 模式: https://github.com/qiniu/logkit/wiki/File-Reader#tailx%E6%A8%A1%E5%BC%8F

定位logkit读取的日志来源

  1. 在所有parser中都有一个label功能,这个功能可以用于填写机器编号,ip,服务名、团队名称等各种各样用于区别logkit数据来源的标签,这些标签会附加在logkit的日志中,便于在大的方向上定位日志来源。
  2. 如果是在tailx模式下,一个配置文件可以读多个路径,可以使用 datasource_tag 功能,将读取的日志路径作为一个字段记录在日志中

不重不漏的高效发送日志数据

  1. sender模式(https://github.com/qiniu/logkit/wiki/Senders)中有一个 fault_tolerant 选项,默认是不开启的,开启后会使用磁盘队列进行容错,开启后需要填写容错的磁盘队列存储的位置,同时容错策略(ft_strategy)选择:"always_save", 此时数据就保证不重不漏了。
  2. 在开启磁盘队列后,数据就可以并发的发送,配置"ft_procs":"2",就是开2个并发发送,速度就能大大提升。
  3. 如果还嫌不够快怎么办?可以用内存队列替换磁盘队列噢,但是需要说明,使用内存队列在logkit 异常退出时有丢失数据的风险。

发送一份数据到多个数据源?

  1. 在有多个sender,并且希望sender之间互不影响的前提下,那么我们建议做成多份配置文件,而不是单份配置文件写多个sender。

多个reader读取下还想删除日志怎么办?

  1. 如果多个reader,并且每个reader都不能遗漏日志,并且还需要删除日志,那么只要每一个reader都应该对应配置一个cleaner,那么多个cleaner会协作,由最后有个读取完成的cleaner来控制日志的删除。

发送到Pandora的数据变化怎么处理?

  1. 在发送到Pandora的过程中,如果数据字段有增加,只要配置sender的 pandora_schema_free 为true即可,会自动识别并更新数据源的schema
  2. 发送到Pandora的数据,类型不能被logkit自动判别怎么办? 此时在配置 pandora_schema_free 的情况下,再配置一下 pandora_auto_create , 只需要填写那些特殊的类型即可,比如 jsonstring,其他字段依旧可以通过pandora_schema_free 自动更新。比如:
"pandora_auto_create":"filedx jsonstring"
  1. Pandora不接受的字段名称如何处理呢? 在ELK中,常见的就是@timestamp,但是 @ 符号,pandora是不支持的,此时只要使用 pandora_schema字段配置一下pandora的别名即可。同样不支持的符号还包括中划线、竖线等,目前Pandora支持的符号是数字、字母以及下划线。 具体写法如下:
"pandora_schema":"@timestamp timestamp,..."

注意最后要填写,... 表示其他字段都要。因为 pandora_schema 除了别名功能以外,还支持字段的选择,如果不加",..."则表示其他字段都不选。

Grok解析特别难怎么办?

我们特意写了一个调试grok的教程,欢迎阅读:https://github.com/qiniu/logkit/wiki/Grok-Parser#%E5%A6%82%E4%BD%95%E8%B0%83%E8%AF%95%E6%82%A8%E7%9A%84grok-patterngrokdebug%E7%94%A8%E6%B3%95

带有默认值的最佳实践配置

如下为一份配置,“#”号标注指带有默认值

{
    "name":"exportd.csv",
    #"batch_len": 1000,
    #"batch_size": 2097152,
    "reader":{
        "log_path":"/path/to/log",
        #"meta_path":"./meta/{{.env}}/reader", # defalut: CURRENT_WORK_DIR/meta/<NAME-{hash(NAME)}>/
        #"mode":"dir",
        #"ignore_hidden":"true",
        #"valid_file_pattern":"*"
    },
    "parser":{
        "name":"exportd_csv",
        "type":"csv",
	#"csv_splitter":"\t",
        "csv_schema":"logtype string, service string, timestamp long, tags jsonmap, fields jsonmap,unkown string",
        "labels":"machine {{.node}}"
    },
    "senders":[{
        "name":"pandora_sender",
        "sender_type":"pandora",
        "pandora_ak":"<your qiniu access key>",
        "pandora_sk":"<your qiniu secret key>",
        "pandora_host":"https://pipeline.qiniu.com",
        "pandora_repo_name":"<your pandora repo(工作流名称)>",
        "pandora_region":"nb",
        "pandora_schema_free":"true",
        "pandora_enable_logdb":"true",
        "fault_tolerant":"true",
        "ft_save_log_path":"./ft_log",
        "ft_strategy":"always_save",
        "ft_procs":"2"
    }]
}

无外网环境下收集日志并发往 pandora 平台

如果想把一个没有外网的集群中的日志发往 pandora 平台,只需要一台可以连外网的服务器,结合 logkithttp readerhttp sender 即可做到。 具体方法如下:

  1. 在没有外网的服务器上, logkit 都使用 http sender 将数据发往有外网的服务器上的 logkit
  2. 在可以连外网的服务器上配置 http readerpandora sender 将数据转发到 pandora 平台

注意事项:

  1. 该场景下, http sender 请使用 json 形式发送
  2. 采集的日志的 logkit 的 reader 中请填写 datasource_tag 字段,以便可以标记日志来源, 作为中转的 logkitpandora sender 中, 请将 pandora_extra_info 字段置为 false

例如,现有三台服务器,分别为服务器A(ip: 10.10.10.2/24), 服务器B(ip: 10.10.10.3/24), 服务器C(ip: 10.10.10.4/24), 其中服务器A和服务器B无法连接外网, 服务器C可以连接外网。现想要把服务器A、B上的日志发送到 pandora 平台,则各个服务器上 logkit 的配置示例如下:

  • 服务器A:
{
    "name":"serverA",
    "batch_len": 1000,
    "batch_size": 2097152,
    "reader":{
        "datasource_tag": "serverA",
        ... 此处省略
    },
    "parser":{
        ... 此处省略
    },
    "senders":[{
        "name": "serverA_sender"
        "sender_type":"http",
        "http_sender_url": "10.10.10.4:4001/logkit/data",
        "http_sender_gzip": "true",
        "http_sender_protocol": "json"
    }]
}
  • 服务器B:
{
    "name":"serverB",
    "batch_len": 1000,
    "batch_size": 2097152,
    "reader":{
        "datasource_tag": "serverB",
        ... 此处省略
    },
    "parser":{
        ... 此处省略
    },
    "senders":[{
        "name": "serverB_sender"
        "sender_type":"http",
        "http_sender_url": "10.10.10.4:4001/logkit/data",
        "http_sender_gzip": "true",
        "http_sender_protocol": "json"
    }]
}
  • 服务器C:
{
    "name":"serverC",
    "batch_len": 1000,
    "batch_size": 2097152,
    "reader":{
        "mode": "http",
        "http_service_address": ":4001",
        "http_service_path": "/logkit/data"
    },
    "parser":{
        "type": "json",
        "name": "serverC_parser"
    },
    "senders":[{
        "name":"pandora_sender",
        "sender_type":"pandora",
        "pandora_ak":"<your qiniu access key>",
        "pandora_sk":"<your qiniu secret key>",
        "pandora_host":"https://pipeline.qiniu.com",
        "pandora_repo_name":"<your pandora repo(工作流名称)>",
        "pandora_region":"nb",
        "pandora_schema_free":"true",
        "pandora_extra_info": "false"
    }]
}
Clone this wiki locally