NXLog中文文档(4):开发语言
NXlog的核心包含了一些内置的语法。它能够完成一些更加复杂的日志处理功能。当NXLog启动的时候,内置的语言就会被预编译,如果程序出错了,NXLog会提示错误信息的。
NXLog语言能在2个地方用上
-
指令中的变量
-
Exec中执行相应程序
NXLog语言不包含异常捕获程序,如果出错了,会在NXLog的日志中打印出来,如果在处理的时候出错了,那很可能就会把日志丢掉了
类型
NXLog语言是强类型程序,NXLog 语言只支持简单类型,复杂的类型例如HashMap这种是不支持的
| Unknown | 未知类型 |
| Boolean | 可用TRUE、FALSE、undefined |
| Integer | 整形 |
| String | 字符串,undefined字符串和空字符串相等,一个字符串最多放1M,编译时就决定了的 |
| Datetime | 时间戳 |
| IPv4 Address | IP地址 |
| IPv6 Address | IP地址 |
| 正则表达式 | 只能用=~ 或者!~操作符 |
| Binary | 可用保存bytes数组 |
| Variadic arguments | 变长参数 |
表达式
和常规的开发语言差不多,变量用$xxx这样声明,一些示例:
条件非
|
1
|
if not $success log_error("failure"); |
正则匹配
|
1
|
if $Message =~ /^Test message/ log_info("matched"); |
使用/g进行全局替换
|
1
|
if $SourceName =~ s/\s/_/g log_info("removed all whitespace in SourceName"); |
使用/s代替.*
|
1
|
if $Message =~ /failure/s log_info("failure string present in the message"); |
/m能代替正则的^和$
/i能忽略大小写匹配
静态计数器
NXLog有一些静态计数器,可以用create_stat来调用
|
1
2
3
4
5
6
7
8
|
if $Message =~ /login failure/{ # create will no do anything if the counter already exists create_stat('login_failures', 'RATE', 45, $EventTime); add_stat('login_failures', 1, $EventTime); if get_stat('login_failures', $EventTime) >= 3 log_warning("3 or more login failures detected within 45 seconds");} |
| COUNT | 累计计数器 |
| COUNTMIN | 计算给定变量的最小值 |
| COUNTMAX | 计算给定变量的最大值 |
| AVG | 计算给定变量的平均值 |
| AVGMIN | 计算给定变量的最小值平均值的 |
| AVGMAX | 计算给定变量的最小值平均值的 |
| RATE | 指定时间间隔的值 |
| RATEMIN | 指定时间间隔的最小值 |
| RATEMAX | 指定时间间隔的最大值 |
| GRAD | 计算在指定的时间间隔上的计数器的速率的变化, |
| GRADMIN | 计算在指定的时间间隔上的计数器的速率的最大值 |
| GRADMAX | 计算在指定的时间间隔上的计数器的速率的最小值 |
一些内置函数
| string lc(string arg); | 把字符串转成小写 |
| string uc(string arg); | 把字符串转成大写 |
| datetime now(); | 当前时间 |
| string type(unknown arg); | 返回变量类型,"boolean", "integer", "string", "datetime", "ip4addr", "ip6addr", "regexp", "binary" |
| integer microsecond(datetime datetime); | 转为微秒 |
| integer second(datetime datetime); | 转为秒 |
| integer minute(datetime datetime); | 转为分钟 |
| integer hour(datetime datetime) | 转为小时 |
| integer day(datetime datetime) | 转为天 |
| integer month(datetime datetime) | 转为月 |
| integer year(datetime datetime) | 转为年 |
| datetime fix_year(datetime datetime); | 设置当前时间的年,BSD syslog或者cisco timestamp会把年丢掉的 |
| integer dayofweek(datetime datetime) | 返回一周的第几天 |
| integer dayofyear(datetime datetime) | 返回一年的第几天 |
| string string(unknown arg); | 转为string |
| integer integer(unknown arg) | 转为integer |
| datetime datetime(integer arg) | 转为datetime |
| datetime parsedate(string arg) | 转为date,例:$EventTime = parsedate($somestring); if not defined($EventTime) $EventTime = now(); |
| string strftime(datetime datetime, string fmt); | 格式化字符串 |
| datetime strptime(string input, string fmt); | 格式化日期 |
| string hostname(); | 获取主机名 |
| string hostname_fqdn(); | 获取主机名 |
| ip4addr host_ip(); | 获取主机IP |
| ip4addr host_ip(integer nth); | 获取非本地回路IP |
| unknown get_var(string varname); | 获取变量 |
| integer get_stat(string statname); | 获取计数器的值 |
| integer get_stat(string statname, datetime time); | 获取计数器的值,如果不存在就把time设进去 |
| ip4addr ip4addr(integer arg) | 转为ipv4类型 |
| ip4addr ip4addr(integer arg, boolean ntoa); | 转为IPV4类型,ntoa代表是否反转 |
| string substr(string src, integer from); | 字符串截取 |
| string substr(string src, integer from, integer to); | 字符串截取 |
| string replace(string subject, string src, string dst); | 字符串替换 |
| string replace(string subject, string src, string dst, integer count); | 字符串替换 |
| integer size(string str); | 获取字符串长度 |
| boolean dropped(); | 如果当前事件drop了,返回True |
内置处理函数
| log_debug(unknown arg, varargs args); | 打印日志,级别为Debug |
| debug(unknown arg, varargs args); | 打印日志,级别为Debug |
| log_info(unknown arg, varargs args); | 打印日志,级别为Info |
| log_warning(unknown arg, varargs args); | 打印日志,级别为Warning |
| log_error(unknown arg, varargs args); | 打印日志,级别为Error |
| delete(unknown arg); | 删除日志里面的指定字段 |
| create_var(string varname); | 创建模块变量 |
| create_var(string varname, integer lifetime); | 创建模块变量并指定生存周期 |
| create_var(string varname, datetime expiry); | 创建模块变量并指定生存周期 |
| delete_var(string varname); | 删除变量 |
| set_var(string varname, unknown value); | 设置变量 |
| create_stat(string statname, string type); | 创建计数器 |
| create_stat(string statname, string type, integer interval); | 创建计数器 |
| create_stat(string statname, string type, integer interval, datetime time); | 创建计数器 |
| create_stat(string statname, string type, integer interval, datetime time, integer lifetime); | 创建计数器 |
| create_stat(string statname, string type, integer interval, datetime time, datetime expiry); | 创建计数器 |
| add_stat(string statname, integer value); | 添加计数器值 |
| add_stat(string statname, integer value, datetime time); | 添加计数器值 |
| sleep(integer interval); | 休眠指定时长 |
| drop(); | 放弃处理当前日志 |
| rename_field(string old, string new); | 修改日志字段名称 |
| reroute(string routename); | 动态指定路由 |
| add_to_route(string routename); | 复制一份日志动态指定路由,不影响当前日志流 |
作者:明翼(XGogo)
-------------
公众号:TSparks
微信:shinelife
扫描关注我的微信公众号感谢
-------------

浙公网安备 33010602011771号