logstash

1、kafka

input {
  kafka {
    bootstrap_servers => "127.0.0.1:9092"
    topics => ["SCHOOL_AQDL"]
    group_id => "logstash-group"
    consumer_threads => 3
    codec => "json"
  }
}

2、syslog

input {
  syslog {
    port => 12345
    codec => cef
    syslog_field => "syslog"
    grok_pattern => "<%{POSINT:priority}>%{SYSLOGTIMESTAMP:timestamp} CUSTOM GROK HERE"
  }
}

3、解析前面带key的json中指定字段值

1、原始数据:
oct 09 RADIUS:{"devsn":"12365","level":"low","user_mac":"12-56-aa"}

2、logstash解析level字段的值,并保存到level_new字段中
filter {
    grok {
        match => { "message" => "%{DATA:month} %{DATA:day} %{DATA:dbName}:.*?\"level\":\"%{DATA:level_new}\",.*?" }
    }
}

  4、# 转换@timestamp字段为时间戳,赋值给字段 [message][@timestamp]

  ruby{
    code => "event.set('[message][@timestamp]',(event.get('@timestamp').to_f.round(3)*1000).to_i)"
  }
#将时间修改为东八区
ruby {
    code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}

# 格式化时间为年月日
ruby{
    code => "event.set('day', (event.get('@timestamp').time.localtime + 8*60*60).strftime('%Y.%m.%d'))"
}

#转换数据类型为integer
mutate{ 
    convert => ["time","integer"]
}

5、使用ruby正则解析content数据

  mutate {
      split => { "content" => "</br>" }
  }
  ruby {
      code => '
          event.get("content").each do |item|
              if item.match(/^(\S+):\s*(.*)$/)
                  key = $1.strip
                  value = $2.strip
                  event.set(key, value)
              end
          end
          event.remove("content")
      '
  }

6、使用k,v函数解析数据

# 解析 other_fields 中的键值对
kv {
   source => "other_fields"
   field_split => "," # 数据中两个字段之间的分隔符【name:黄大锤,add:七楼】
   value_split => ":" # 数据中key和value的分隔符【name:黄大锤】
}

7、遍历删除多余的字段,保留指定字段

# 保留解析后的 name 字段,删除其他字段
ruby {
     code => "
         event.to_hash.each do |key, value|
             if key != 'name' && key != 'message'
                event.remove(key)
             end
         end
      "
}

 8、根据枚举值替换replace替换

  # 根据枚举,修改为对应的值-行为类别:behaviour_type
  if [behaviour_type] == "0" {
      mutate {
          replace => { "behaviour_type" => "违规行为" }
      }
  }

9、字段重命名

#重命名普通字段  
mutate { rename => {"level" => "critical_level"} }
mutate { rename => ["ip", "host_ip"] }
#重命名对象嵌套字段
mutate { rename => ["[raw][user]", "host_user_name"] }

10、新增字段

  # 如果s_id字段不存在,则新增字段并设置默认值
  if ![s_id]{
    mutate { add_field => { "[s_id]" => "" } }
  } 

11、使用Grok解析数据

# 原始数据
# 违规操作日志,日志内容:通过网卡连接互联网, 计算机(标识码:0100071003600010, IP:192.168.1.1, MAC:b8:b8:b8:b8:b8:b8, 网卡名:enaphyt4i0)违规连接互联网络!即将断开网络连接,审计时间:2024-02-19 16:37:13,操作用户:secadm,主机IP:192.168.1.1,主机MAC:ABB8B8,部门名称:cs,责任人:test,硬盘序列号:20240617
 
# grok解析语法
%{DATA:log_type},.*?计算机\((标识码:%{DATA:host_id}, .*? MAC:%{DATA:host_mac}, 网卡名:%{DATA:net_card})\).*?责任人:%{DATA:host_user_name},硬盘序列号:%{DATA:hd_code}$
 
【.*?】相当于通配符*,忽略中间其他内容;
【$】grok最后一个字符是占位符没有匹配到数据使用$或者\z标注行的结束。因为原数据序列号后面没有其他符号可以作为判断,所以使用$表名行的结束,这样hd_code=硬盘序列号的值

11.1、Grok获取不到最后一个字段的值

解决办法:最后一个字段后面加上$或者使用(?<add_value>.*)?解析
日志【name:黄大锤;add:七楼】
Grok解析
1、【name:%{DATA:name_value};add:%{DATA:add_value}】-解析后的add_value为空;
2、【name:%{DATA:name_value};add:%{DATA:add_value}$】-解析后的add_value为正确值(最后一个字段后面加$);
3、【name:%{DATA:name_value};add:(?<add_value>.*)?】-解析后的add_value为正确值

12、拼接字段

# 拼接 desc 字段内容,如果additional_info有值,则拼接【additional_info和action_type的值】,否则只拼接【action_type】的值
if [action_type] {
    if [additional_info] {
        mutate {
            add_field => {
                "desc" => "详细描述: %{additional_info},%{action_type}"
            }
        }
    } else {
        mutate {
            add_field => {
                "desc" => "详细描述: %{action_type}"
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨咖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值