2014-10-03 95 views
0

我正在运行syslog-ng,并将日志条目存储在mysql中。在那里一切正常。问题是我需要将字段“msg”分解为列以供进一步分析。我怎么能转换这个字符串:将系统日志消息转换为mysql插入语句

'[997799.060000] ACCEPT IN=br0 OUT=eth1 
MAC=00:24:aa:ab:f0:d2:80:e6:51:10:e3:86:08:00 
SRC=192.168.1.40 DST=74.120.224.137 LEN=64 
TOS=0x00 PREC=0x00 TTL=63 ID=48537 DF PROTO=TCP 
SPT=51504 DPT=443 SEQ=2289341783 ACK=0 WINDOW=65535' 

一切都在同一行(存储在“文本”字段在MySQL表),我只是增加了知名度休息...我需要将其转换成类似:

INSERT INTO web_traffic(MAC, SRC, DST, PROTO, DPT) 
    VALUES('00:24:aa:ab:f0:d2:80:e6:51:10:e3:86:08:00', 
     '192.168.1.40', '74.120.224.137', 'TCP', '443'); 

任何其他插入格式可能会更容易也值得赞赏。我正在寻找在MySQL内部这样做,以便我可以在表上插入一个触发器。

感谢,

回答

2

你可以做这样的事情

INSERT INTO web_traffic (mac, src, dst, proto, dpt) 
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(msg, 'MAC=', -1), ' ', 1) mac, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(msg, 'SRC=', -1), ' ', 1) src, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(msg, 'DST=', -1), ' ', 1) dst, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(msg, 'PROTO=', -1), ' ', 1) proto, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(msg, 'DPT=', -1), ' ', 1) dpt 
FROM syslog 

结果:

 
|          MAC |   SRC |   DST | PROTO | DPT | 
|-------------------------------------------|--------------|----------------|-------|-----| 
| 00:24:aa:ab:f0:d2:80:e6:51:10:e3:86:08:00 | 192.168.1.40 | 74.120.224.137 | TCP | 443 | 

这里是SQLFiddle演示

+0

这是真的很酷我的朋友。正是我需要的,加上一个奖金,因为我不知道SQLFiddle! – jangeador 2014-10-03 15:45:19

+0

接受...对不起,我只有upvoted之前:) – jangeador 2014-10-03 22:42:37