本文共 8803 字,大约阅读时间需要 29 分钟。
Logtail是日志服务提供的高性能低耗的日志收集客户端, 参考了解更多背景.
目前Logtail的配置有多种, 本节介绍如何快速有效的通过CLI创建各种Logtail的配置项.Logtail配置项目包含如下内容:
基于文本文件的:
自建产品
这里假设已经完成了CLI的.
首先CLI中配置默认区域和账户, 以便后续操作, 这一步也是一次性的. 如果之前已经做过, 这里可以跳过.
这里配置一个杭州公有云的账户
> aliyunlog configure AKID****123 AKKEY****123 cn-hangzhou.log.aliyuncs.com
参考:
极简模式是对文件进行单行分隔, 放入到名为content
的域中的最简单模式. 适用于简单存储处理的情况.
这里我们在项目组project1
中创建一个极简模式的logtail配置:
> aliyunlog log create_logtail_config --project_name="project1" --config_detail="file://simple_1.json"
文件simple_1.json
的内容如下:
{ "configName": "simple_1", "inputDetail": { "logType": "common_reg_log", "logPath": "/user", "filePattern": "*.log" }, "inputType": "file", "outputDetail": { "logstoreName": "logstore1" }}
这里创建了一个属于日志库logstore1
的名叫simple_1
的logtail的配置. 主要的配置项就是日志的路径logPath
以及文件名模式filePattern
. 这里扫描/user
下包含深度子目录的所有.log
文件.
注意: 除了以上项目, 还需要如上所示填入相关信息: 其中inputType
是file
, inputDetail.logType
是common_reg_log
.
简单模式的日志时间采用的是系统收集的时间, 也就是抓取到这条日志的时间.
JSON模式适用于文件本身就是JSON的情况.
这里我们在项目组project1
中创建一个JSON模式的logtail配置:
> aliyunlog log create_logtail_config --project_name="project1" --config_detail="file://json_1.json"
文件json_1.json
的内容如下:
{ "configName": "json_1", "inputDetail": { "logType": "json_log", "filePattern": "*.json", "logPath": "/json_1" }, "inputType": "file", "outputDetail": { "logstoreName": "logstore1" }}
这里创建了一个属于日志库logstore1
的名叫json_1
的logtail的配置. 主要的配置项就是日志的路径logPath
以及文件名模式filePattern
. 这里扫描/user
下包含深度子目录的所有.json
文件.
注意:
inputType
必须是file
, inputDetail.logType
是json_log
.{ "from": "nanjing", "to": "shanghai", "people": "xiaoming", "travel_time": "2018-1-1 10:10:10"}
会自动配置域from
, to
和people
和travel_time
.
默认情况下, 日志的时间会使用系统时间, 也就是抓取到这条日志的时间. 如果日志本身包含了更加准确的时间, 例如上面旅行日志的例子, 可以在logtail的配置中指定travel_time
为日志时间如下:
{ "inputDetail": { "timeFormat": "%Y-%M-%D %h:%m:s", "timeKey": "travel_time" }}
这里通过inputDetail.timeKey
指定travel_time
为时间关键字, 通过inputDetail.timeFormat
配置其格式为%Y-%M-%D %h:%m:s
, 针对时间格式, 可以进一步参考
分隔符模式适用于文件本身基于某个分隔符分隔的文件, 例如CSV, TSV等等.
日志服务支持最多3个字符组合的分隔, 例如一个旅行日志的文件内如是:
2017-1-1 10:10:00&#&nanjing&#&shanghai&#&xiao ming2017-1-1 20:10:00&#&beijing&#&hangzhou&#&xiao wang
分隔符就是&#&
可以分隔出时间
, 出发城市
, 达到城市
, 旅客
.
这里我们在项目组project1
中创建一个分隔符模式的logtail配置:
> aliyunlog log create_logtail_config --project_name="project1" --config_detail="file://sep_1.json"
文件sep_1.json
的内容如下:
{ "configName": "sep_1", "logSample": "2017-1-1 10:10:00&#&nanjing&#&shanghai&#&xiao ming", "inputDetail": { "logType": "delimiter_log", "logPath": "/user", "filePattern": "travel.log", "separator": "&#&", "key": [ "travel_time", "from_city", "to_city", "people" ] }, "inputType": "file", "outputDetail": { "logstoreName": "logstore1" }}
这里创建了一个属于日志库logstore1
的名叫json_1
的logtail的配置. 主要的配置包括:
/user
下包含深度子目录的所有travel.json
文件.&#&
, 以及对应的域名, 这里是travel_time
, from_city
, to_city
和people
.logSample
中填写一个例子.inputType
必须是file
, inputDetail.logType
是delimiter_log
.注意, 多个域的分隔符必须是一致的, 例如下面的文件,期望配置分隔符&|
, 并不会起作用.
2017-1-1 10:10:00&nanjing|&shanghai|xiao ming2017-1-1 20:10:00|beijing&hangzhou|xiao wang
因为这里的文件分隔符并不是一致的, 这种情况就需要用到完整正则表达式的方式了.
默认情况下, 日志的时间会使用系统时间, 也就是抓取到这条日志的时间. 如果日志本身包含了更加准确的时间, 例如上面旅行日志的例子, 可以在logtail的配置中指定travel_time
为日志时间如下:
{ "inputDetail": { "timeFormat": "%Y-%M-%D %h:%m:s", "timeKey": "travel_time" }}
这里指定travel_time
为时间关键字, 配置其格式为%Y-%M-%D %h:%m:s
, 针对时间格式, 可以进一步参考
正则表达式模式利用了强大的正则表达式的解析能力, 提取非结构化文本中的特定模式的域. 适用于文件本身结构较为特殊的情况.
完整的正则表达式可以参考一个典型的例子是NGNIX日志:
10.1.1.1 - - [2018-1-1 10:10:10] "GET / HTTP/1.1" 0.011 180 404 570 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 360se)"10.1.1.1 - - [2018-1-1 10:10:20] "GET / HTTP/1.1" 0.011 180 404 570 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 360se)"
可以看到模式是: IP - - [时间] "HTTP请求" 响应时间 请求大小 HTTP状态号 响应大小 "-" "客户端"
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) - - \[([^\]+])\] "([\w\s\/\.]+) ([\d\.]+) ([\d\.]+) ([\d\.]+) ([\d\.]+) "-" "[^\"]+"
这里我们在项目组project1
中创建一个正则表达式模式的logtail配置:
> aliyunlog log create_logtail_config --project_name="project1" --config_detail="file://reg_1.json"
文件reg_1.json
的内容如下:
{ "configName": "ngnix_1", "logSample": "10.1.1.1 - - [13/Mar/2016:10:00:10 +0800] \"GET / HTTP/1.1\" 0.011 180 404 570 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 360se)\"", "inputDetail": { "logType": "common_reg_log", "logPath": "/ngnix", "filePattern": "*.log", "regex": "(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}) - - \\[([^\\]+])\\] \"([\\w\\s\/\\.]+) ([\\d\\.]+) ([\\d\\.]+) ([\\d\\.]+) ([\\d\\.]+) \"-\" \"[^\\\"]+\"", "key": [ "client_ip", "request_time", "method_type", "process_period", "request_bytes", "http_status", "response_bytes", "client_agent" ], "timeFormat": "%Y-%M-%D %h:%m:%s" }, "inputType": "file", "outputDetail": { "logstoreName": "logstore1" }}
这里创建了一个属于日志库logstore1
的名叫ngnix_1
的logtail的配置. 主要的配置包括:
/ngnix
下包含深度子目录的所有*.log
文件.regex
中, 以及对应的域名放在key
中.logSample
中填写一个例子.inputType
必须是file
, inputDetail.logType
是delimiter_log
.默认情况下, 日志的时间会使用系统时间, 也就是抓取到这条日志的时间. 如果日志本身包含了更加准确的时间, 例如上面NGNIX日志的例子, 可以在logtail的配置中指定request_time
为日志时间如下:
{ "inputDetail": { "timeKey": "request_time", "timeFormat": "%Y-%M-%D %h:%m:s" }}
这里通过inputDetail.timeFormat
配置其格式为%Y-%M-%D %h:%m:s
, 针对时间格式, 可以进一步参考
注意: 如果只配置了inputDetail.timeFormat
而没有配置inputDetail.timeKey
, 默认使用域time
.
syslog与文件方式互补, 收集部署上更方便. 除了通过CLI进行配置外, 还需要在logtail客户端通过本地配置文件的方式进行进一步配置. 具体参考.
这里我们在项目组project1
中创建一个syslog模式的logtail配置:
> aliyunlog log create_logtail_config --project_name="project1" --config_detail="file://syslog_1.json"
文件syslog_1.json
的内容如下:
{ "configName": "syslog_1", "inputDetail": { "tag": "tag1" }, "inputType": "syslog", "outputDetail": { "logstoreName": "logstore1" }}
这里创建了一个属于日志库logstore1
的名叫syslog_1
的logtail的配置. 主要的配置包括:
tag
.inputType
必须是syslog
, 注意这里没有域inputDetail.logType
.要想让syslog配置其作用, 除了通过CLI进行配置外, 还需要在logtail客户端通过本地配置文件的方式进行进一步配置. 具体参考.
对于时间的配置, 目前syslog使用系统时间来作为日志的时间.很多应用的日志可能偶尔会出现多行的情况, 例如Java的日志会打印一些堆栈信息. 这种情况就需要多行配置.
注意: 目前仅正则表达式模式
支持多行配置. 例如:
com.journaldev.log.LoggingExample::main::2017-1-1 01:42:43::Msg977com.journaldev.log.LoggingExample::main::2017-1-1 03:42:43::Break at File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1599, inglobals = debugger.run(setup['file'], None, None, is_module) File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1026, in run pydev_imports.execfile(file, globals, locals) # execute the script File "/Users/wjo1212/GithubProjects/aliyun-log-cli/aliyunlogcli/cli.py", line 5, in main()com.journaldev.log.LoggingExample::main::2017-1-1 05:42:43::Msg978
这种情况就需要配置logBeginRegex
来指定每一条日志的首行模式:
{ "inputDetail": { "logBeginRegex": "com.journaldev.log.LoggingExample::main::.*" }}
这里配置了inputDetail.logBeginRegex
指定了每行新的日志都是以com.journaldev.log.LoggingExample::main::.*
作为第一行的.
注意: 这里的正则表达式最后使用了.*
对首行进行完整匹配. 这一点是必须的, 例如如下的配置将不起作用:
{ "inputDetail": { "logBeginRegex": "com.journaldev.log.LoggingExample::main::" }}
Logtail也支持针对特定目标文件, 定义一些高级行为, 所有基于文本的收集方式都支持如下配置:
本地缓存 (localStorage):
上传原始日志 (enableRawLog):
Topic生成方式 (topicFormat):
支持:
none
): 不配置主题.group_topic
): 基于所引用的机器组的Topic属性来配置.日志文件编码 (fileEncoding):
utf8
和gbk
utf8
最大监控目录深度 (maxDepth):
超时属性 (preserve)
如果一个日志文件在指定时间内没有任何更新,则认为该文件已超时。您可以对超时属性指定以下配置。
永不超时
(true): 指定持续监控所有日志文件,永不超时。超时30分钟超时
(false): 如日志文件在30分钟内没有更新,则认为已超时,并不再监控该文件。永不超时
(true)最大超时目录深度 (preserveDepth):
30分钟超时
时, 需要配置深度, 范围1-3过滤器配置:
filterKey
和对应内容正则表达式filterRegex
.如下示例, 这里关闭了本地存储
, 打开了原始文件上传
, 配置了一个自定义的基于正则表达式的Topic方式
, 文件编码为gbk
, 最大目录深度200
, 检测文件变化
30分钟, 对应深度为3. 同时配置了只抓取关键字from_city
和to_city
满足特定正则的日志..
{ "inputDetail": { "localStorage": false, "enableRawLog": true, "topicFormat": "/user.+/(\\w+).log", "fileEncoding": "gbk", "maxDepth": 200, "preserve": false, "preserveDepth": 3, "filterKey": [ "from_city", "to_city" ], "filterRegex": [ "nanjing|shanghai", "beijing|hangzhou" ] }}
完成Logtail的配置后, 还需要应用配置到机器组, 可以通过操作来完成.
转载地址:http://tvcra.baihongyu.com/