• 数据转换
    • script Transformer
    • pandora_key_convert Transformer
    • urlparam Transformer
    • Cloudtrail Transformer
    • IP Transformer
    • arrayexpand Transformer
    • Convert Transformer
      • DSL 语法
    • Discard Transformer
    • Date Transformer
    • Replace Transformer
    • Trim Transformer
    • UserAgent Transformer
    • k8stag Transformer
    • JSON Transformer
    • label Transformer
    • rename Transformer
    • split Transformer
    • xml Transformer

    数据转换

    script Transformer

    针对指定的字段进行替换,执行指定字段的脚本,同时支持输入脚本内容或输入脚本路径进行执行。

    • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • 新的字段名(new): 将脚本执行结果存入一个新的字段,不改变原来字段所存的内容,如果不想改变 key 指定字段所存内容又想记录脚本执行结果,可以通过这个参数设置。默认情况下无需填写,脚本执行结果会替换 key 指定字段所存内容。

    • 脚本执行解释器:字段可以设置脚本执行解释器,默认为 bash。

    • 指定脚本路径(scriptpath):字段支持指定脚本文件路径,如果填写了该字段,会优先执行该脚本文件,不执行 key 指定字段的脚本。默认情况下无需填写,默认会执行 key 指定字段的脚本。

    • 指定脚本内容(script):字段支持指定所需执行脚本内容,如果填写了该字段,会优先执行该脚本内容,不执行 scriptpath 和 key 指定字段的脚本。默认情况下无需填写,默认会执行 key 指定字段的脚本。

    script Transformer 可以对指定的 key 进行脚本执行结果的替换。 key 指定的字段里存的如果是具体脚本的路径,则支持执行该脚本并将脚本执行结果替换 key 指定字段的值,或者创建 new 指定的字段并将脚本执行结果存入该字段 key 指定的字段里存的如果不是路径,则需要填写 script 或者 scriptpath 内容,此时会执行 script 或者 scriptpath,并将脚本执行结果存入 key 或者 new 字段。

    pandora_key_convert Transformer

    将不符合 Pandora 字段类型的 key 字符转化为下划线,如 a.b/c 改为 a_b_c。

    urlparam Transformer

    将带有 url parameter 格式的字符串(如 uid=123&name=tom&age=10或/mytest?uid=123&name=tom&age=10),并将其转化为键值对填充到原数据中。

    • 要进行Transform变化的键(key): 指定要解析的数据所在字段,支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    示例:

    parser 解析后的数据为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "params": "/mytest?uid=123&name=tom&age=10"
    5. }

    经过 urlparam transformer 变换后的数据将变为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "params": "/mytest?uid=123&name=tom&age=10",
    5. "params_uid": "123",
    6. "params_name": "tom",
    7. "params_age": "10",
    8. "params_url_param_path": "/mytest",
    9. }

    !>注意:当 url param 中扩展开来的字段名与数据中原有的字段名称冲突时,该 transformer 会在其扩展名后面添加数字以便区分。

    示例:

    1. {
    2. "params_uid": "aaaa",
    3. "field2": "bbbb",
    4. "params": "uid=123&name=tom&age=10"
    5. }

    解析后数据将变成:

    1. {
    2. "params_uid": "aaaa",
    3. "field2": "bbbb",
    4. "params": "uid=123&name=lily&age=10",
    5. "params_uid1": "233",
    6. "params_name": "lily",
    7. "params_age": "10"
    8. }

    Cloudtrail Transformer

    Cloudtrail Transformer 是针对 AWS CloudTrail 的数据做格式转换的 Transformer,可以将CloudTrail 的 json 格式中的 Records逐条变为数据。

    示例:

    将数据由一条:

    1. {"Records": [{
    2. "eventVersion": "1.04",
    3. "userIdentity": {
    4. "type": "IAMUser",
    5. "principalId": "EX_PRINCIPAL_ID",
    6. "arn": "arn:aws:iam::123456789012:user/Alice",
    7. "accountId": "123456789012",
    8. "accessKeyId": "EXAMPLE_KEY_ID",
    9. "userName": "Alice"
    10. },
    11. "eventTime": "2016-07-14T19:15:45Z",
    12. "eventSource": "cloudtrail.amazonaws.com",
    13. "eventName": "UpdateTrail",
    14. "awsRegion": "us-east-2",
    15. "sourceIPAddress": "205.251.233.182",
    16. "userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
    17. "errorCode": "TrailNotFoundException",
    18. "errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
    19. "requestParameters": {"name": "myTrail2"},
    20. "responseElements": null,
    21. "requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
    22. "eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
    23. "eventType": "AwsApiCall",
    24. "recipientAccountId": "123456789012"
    25. },{
    26. "eventVersion": "1.0",
    27. "userIdentity": {
    28. "type": "IAMUser",
    29. "principalId": "EX_PRINCIPAL_ID",
    30. "arn": "arn:aws:iam::123456789012:user/Alice",
    31. "accountId": "123456789012",
    32. "accessKeyId": "EXAMPLE_KEY_ID",
    33. "userName": "Alice"
    34. },
    35. "eventTime": "2014-03-24T21:11:59Z",
    36. "eventSource": "iam.amazonaws.com",
    37. "eventName": "CreateUser",
    38. "awsRegion": "us-east-2",
    39. "sourceIPAddress": "127.0.0.1",
    40. "userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
    41. "requestParameters": {"userName": "Bob"},
    42. "responseElements": {"user": {
    43. "createDate": "Mar 24, 2014 9:11:59 PM",
    44. "userName": "Bob",
    45. "arn": "arn:aws:iam::123456789012:user/Bob",
    46. "path": "/",
    47. "userId": "EXAMPLEUSERID"
    48. }}
    49. }]}

    转变为两条:

    1. {
    2. "eventVersion": "1.04",
    3. "userIdentity": {
    4. "type": "IAMUser",
    5. "principalId": "EX_PRINCIPAL_ID",
    6. "arn": "arn:aws:iam::123456789012:user/Alice",
    7. "accountId": "123456789012",
    8. "accessKeyId": "EXAMPLE_KEY_ID",
    9. "userName": "Alice"
    10. },
    11. "eventTime": "2016-07-14T19:15:45Z",
    12. "eventSource": "cloudtrail.amazonaws.com",
    13. "eventName": "UpdateTrail",
    14. "awsRegion": "us-east-2",
    15. "sourceIPAddress": "205.251.233.182",
    16. "userAgent": "aws-cli/1.10.32 Python/2.7.9 Windows/7 botocore/1.4.22",
    17. "errorCode": "TrailNotFoundException",
    18. "errorMessage": "Unknown trail: myTrail2 for the user: 123456789012",
    19. "requestParameters": {"name": "myTrail2"},
    20. "responseElements": null,
    21. "requestID": "5d40662a-49f7-11e6-97e4-d9cb6ff7d6a3",
    22. "eventID": "b7d4398e-b2f0-4faa-9c76-e2d316a8d67f",
    23. "eventType": "AwsApiCall",
    24. "recipientAccountId": "123456789012"
    25. }
    1. {
    2. "eventVersion": "1.0",
    3. "userIdentity": {
    4. "type": "IAMUser",
    5. "principalId": "EX_PRINCIPAL_ID",
    6. "arn": "arn:aws:iam::123456789012:user/Alice",
    7. "accountId": "123456789012",
    8. "accessKeyId": "EXAMPLE_KEY_ID",
    9. "userName": "Alice"
    10. },
    11. "eventTime": "2014-03-24T21:11:59Z",
    12. "eventSource": "iam.amazonaws.com",
    13. "eventName": "CreateUser",
    14. "awsRegion": "us-east-2",
    15. "sourceIPAddress": "127.0.0.1",
    16. "userAgent": "aws-cli/1.3.2 Python/2.7.5 Windows/7",
    17. "requestParameters": {"userName": "Bob"},
    18. "responseElements": {"user": {
    19. "createDate": "Mar 24, 2014 9:11:59 PM",
    20. "userName": "Bob",
    21. "arn": "arn:aws:iam::123456789012:user/Bob",
    22. "path": "/",
    23. "userId": "EXAMPLEUSERID"
    24. }}
    25. }

    IP Transformer

    对 ip 字段进行数据的扩展,扩展出如下字段:

    1. "Region" 区域信息
    2. "City":城市信息
    3. "Country":国家信息
    4. "Isp":运营商信息
    • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • IP 数据库路径(data_path):你拥有的 ip 数据库文件路径,可以在 ipip.net 下载,也可以使用logkit 源码包中的 ip 数据库。

    arrayexpand Transformer

    解析数组类型,并将其转化为键值对填充到原数据中。

    • 要进行Transform变化的键(key):要解析的数据所在字段名称,支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    示例:
    parser 解析后的数据为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "arrayfield": ["a", 1, 3.0, "d", "e"]
    5. }

    经过 arrayexpand 后的数据将变为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "arrayfield": ["a", 1, 3.0, "d", "e"],
    5. "arrayfield0": "a",
    6. "arrayfield1": 1,
    7. "arrayfield2": 3.0,
    8. "arrayfield3": "d",
    9. "arrayfield4": "e"
    10. }

    !>注意:若 arrayexpand 解析生成的字段与数据中原有字段冲突,则会再加一个数字位进行重命名。 例如:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "arrayfield3": "xxx",
    5. "arrayfield": ["a", "b", "c", "d", "e"]
    6. }

    经过 arrayexpand 后的数据将变为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "arrayfield3": "xxx",
    5. "arrayfield": ["a", "b", "c", "d", "e"]
    6. "arrayfield0": "a",
    7. "arrayfield1": "b",
    8. "arrayfield2": "c",
    9. "arrayfield3_0": "b",
    10. "arrayfield4": "e"
    11. }

    Convert Transformer

    除了通过可视化界面配置以外,logkit 还支持手动书写 dsl: 针对 dsl 指定的字段和类型做数据格式转换,dsl 中可以包含多个数据字段和类型。如将 field1 转为 long、field2 转为 string 则写为 “field1 long, field2 string”。

    DSL 语法

    DSL 规则为<字段名称> <类型>,字段名称和类型用空格符隔开,不同字段用逗号隔开。若字段必填,可以转换的类型包括:

    • long 类型(int64): long,LONG,l,L
    • float 类型(float64): float,FLOAT,F,f
    • string 类型: string,STRING,S,s
    • bool 类型: bool,BOOL,B,b,boolean
    • array 类型: array,ARRAY,A,a;括号中跟具体array元素的类型,如a(l),表示array里面都是long。同时,也可以省略小括号前的array类型申明,直接写(l),表示 array 类型,里面的元素是long
    • map 类型: map,MAP,M,m;使用花括号表示具体类型,表达map里面的元素,如map{a l,b map{c b,x s}}, 表示map结构体里包含a字段,类型是long,b字段又是一个map,里面包含c字段,类型是bool,还包含x字段,类型是string。同时,也可以省略花括号前面的map类型,直接写{s l},表示map类型,里面的元素s为long类型。

    Discard Transformer

    删除指定的数据字段, 如数据{“a”:123,”b”:”xx”}, 指定删除 a,变为{“b”:”xx”}

    要进行 Transform 变化的键(key):

    • 支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。
    • 也支持写多个,用逗号分隔,比如 field1,field2 表示删除field1和field2 2个key。

    应用场景

    数据解析完后,有一些字段是不需要的,就可以用来做反选,去掉这些字段,节省传输和存储成本。

    Date Transformer

    对指定的 key 转换为指定的时间格式,这个 key 里面存的实际值可以是一个字符串,也可以是一个 timestamp 数字。 也可以对时间进行变换,如解析的时间没有带时区,被默认作为了 UTC 时间,但是又想变换为东八区时间,这样就只要在 Offset 处设置为 -8 即可。

    • 要进行Transform变化的键(key): 支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • 时间样式(time_layout_before): 设置自己的时间类型的样式,在你的数据无法自动解析的情况下,可以通过这个参数设置。默认情况下无需填写,系统会自动解析。

    • 解析后时间样式(time_layout_after): 设置解析后的时间,Pandora接受的时间类型(date)类型本质上是RFC3339的字符串,所以此处如果不填,默认转为RFC3339的字符串,也可根据需要转为其他样式。

    时间格式(layout)的写法

    时间格式的写法符合 golang 的时间格式定义方法,具体参见https://golang.org/pkg/time/#pkg-constants类似如下。

    1. ANSIC = "Mon Jan _2 15:04:05 2006"
    2. UnixDate = "Mon Jan _2 15:04:05 MST 2006"
    3. RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
    4. RFC822 = "02 Jan 06 15:04 MST"
    5. RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
    6. RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
    7. RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
    8. RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
    9. RFC3339 = "2006-01-02T15:04:05Z07:00"
    10. RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    11. Kitchen = "3:04PM"
    12. // Handy time stamps.
    13. Stamp = "Jan _2 15:04:05"
    14. StampMilli = "Jan _2 15:04:05.000"
    15. StampMicro = "Jan _2 15:04:05.000000"
    16. StampNano = "Jan _2 15:04:05.000000000"

    简单来说,年份必须是 2006,月份必须是 1 或者 Jan,日必须是 2, 时必须是 3(两位数必须是 15,一位数时后面要跟 PM,类似 Kitchen 的描述),分必须是 4,秒必须是 5,时区必须是 +7。比如 RFC3339 的格式定义为2006-01-02T15:04:05+07:00,又或者我们自己定义一个简单版的时间 2006|01|02|03|04|05,年月日时分秒分别用竖线|分隔,假设当前时间为 2017 年 6 月 6 日 20 时 38 分 12 秒,则按我们定义的格式显示为 2017|06|06|20|38|12。

    Replace Transformer

    • 要进行Transform变化的键(key): 支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • 是否启用正则匹配(regex): Replace Transformer 支持正则表达式,当 regex 标志位为 true 时,把 old 字段对应的字符串当作正则表达式处理。

    Trim Transformer

    去掉字符串前后多余的字符,如 abc123, 设置 trim 的字符为 abc,变化后为 123。

    • 修整位置(place):只去掉前缀(prefix)、后缀(suffix)或者前缀后缀都去掉(both)。

    UserAgent Transformer

    解析 User Agent 中的用户信息,如下:

    • UA_Family: 族信息,通常一个公司的一系列产品会形成一个族。
    • UA_Major:大版本号
    • UA_Minor: 小版本号
    • UA_Patch:补丁版本
    • UA_Device_Family:设备族信息
    • UA_Device_Brand: 设备品牌
    • UA_Device_Model: 设备类型
    • UA_OS_Family: 操作系统族信息
    • UA_OS_Patch: 操作系统补丁版本
    • UA_OS_Major: 操作系统大版本号
    • UA_OS_Minor: 操作系统小版本号
    • UA_OS_PatchMinor: 操作系统补丁的小版本号
    • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • UserAgent 解析正则表达式文件路径(regex_yml_path):默认可以不填,也可以填写你拥有的 useragent 正则表达式 yaml 文件,最新的文件可以在ua-parser/uap-core上获取。

    示例:

    传入一个 useragent 字符串,假设为:

    1. Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true

    得到的数据为:

    1. "ua": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",
    2. "UA_Family": "Amazon Silk",
    3. "UA_Major": "1",
    4. "UA_Minor": "1",
    5. "UA_Patch": "0-80",
    6. "UA_OS_Family": "Android",
    7. "UA_Device_Family": "Kindle",
    8. "UA_Device_Brand": "Amazon",
    9. "UA_Device_Model": "Kindle"

    k8stag Transformer

    为 Kubernetes 用户量身定做的 Transformer,对于收集的 Kubernetes 用户,其日志路径信息就带有包括 k8s_pod_name,k8s_namespace,k8s_container_name,k8s_container_id 在内的信息,所以 logkit Pro 通过收集到 Kubernetes 日志的路径,获取这些标签。

    在 File Reader 的配置中,datasource_tag 这个选项会记录文件路径。logkit Pro 默认开启这个选项,并记录为 datasource 字段。

    JSON Transformer

    解析 json 并加入到数据中,如 json 为 {“a”:123},加入后变为 {“myNewKey”:{“a”:123}}。

    • 要进行 Transform 变化的键(key):指定要解析的json数据所在的字段,支持多级嵌套,多级间用. 符号连接,表示data[“abc”][“xyz”] 中的数据。

    • 解析后数据的字段名(new):指定要解析 json 数据字段的新字段,必须指定新字段。

    示例:

    例如, parser 解析后的数据为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "myOldKey": "{"uid":123,"name":"tom","age":10}"
    5. }

    经过 json 变换后的数据将变为:

    1. {
    2. "field1": "aaaa",
    3. "field2": "bbbb",
    4. "myOldKey": "{\"uid\":123,\"name\":\"tom\",\"age\":10}"
    5. "myNewKey": {"uid":123,"name":"tom","age":10}
    6. }

    label Transformer

    增加标签, 如设置标签 {key:a,value:b}, 则数据中加入 {“a”:”b”}

    • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • 要添加的数据值(仅限string类型)(value):要填充的label值,值的类型只能是string类型。

    高级选项

    • 要进行 Transform 变化的键已存在时,是否覆盖原有的值(override):默认为 false,选择 true 就表示如果原来有值,覆盖原有值,此处如果覆盖,原来该字段的数据就丢失了

    rename Transformer

    用新的字段重命名旧的字段, 如 {a:123} 改为 {b:123}。

    • 要进行 Transform 变化的键(key):支持多级嵌套,多级间用.符号连接,如 abc.xyz,表示 data[“abc”][“xyz”]中的数据,重命名后会删除该字段,并将数据赋予到新的字段名称。

    • 修改后的字段名(new_key_name):支持多级嵌套,多级间用.符号连接,如 abc1.xyz1,表示 data[“abc1”][“xyz1”] 中的数据。

    split Transformer

    针对 key 指定的字段做数据切割,按 step 指定的字符切分,转换为一个字符串数组,并填充到 newfield 指定的字段中。例如 “a,b,c” 切割为 [“a”,”b”,”c”]。

    • 要进行 Transform 变化的键(key): 指定要切分的数据所在字段,支持多级嵌套,多级间用.符号连接,如abc.xyz,表示 data[“abc”][“xyz”]中的数据。

    • 分隔符(sep): 指定切分的分隔符,通常情况下分隔符为逗号(“,”)、空格(“ “)、横线(“-“)、制表符(“\t”)等等。

    • 解析后数据的字段名(newfield): 指定切分后的数据进的新字段,可以指定为新的字段,如果指定新的字段跟key字段名称相同,则相当于替换原始字段。

    xml Transformer

    解析 xml, 将 xml 格式转变为 map 结构。

    • 要进行 Transform 变化的键(key): 指定要解析的 xml 数据所在的字段,支持多级嵌套,多级间用 . 符号连接,表示 data[“abc”][“xyz”] 中的数据。

    • 解析后数据的字段(new): 指定要解析 xml 数据字段的新字段,必须指定新字段。

    示例:

    例如, parser 解析后的数据为:

    1. {
    2. "key1": "value1",
    3. "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    4. <note>
    5. <to>Tove</to>
    6. <from>Jani</from>
    7. <heading>Reminder</heading>
    8. <body>Don't forget me this weekend!</body>
    9. </note>"
    10. }

    经过 xml 变换后的数据将变为:

    1. {
    2. "key1": "value1",
    3. "xml":{
    4. "note": {
    5. "heading": "Reminder",
    6. "body": "Don't forget me this weekend!",
    7. "to": "Tove",
    8. "from": "Jani",
    9. },
    10. },
    11. },