我对键值对的复杂sqlldr解析的搜索很薄。所以发布一个符合我需求的例子,你可以适应。
问题:数百万行Tomcat访问日志,例如
time='[01/Jan/2001:00:00:03 +0000]' srcip='192.168.0.1' localip='10.0.0.1' referer='-' url='/limsM/SamplesGet-SampleMaster?samplefilters=%5B%22parent_sample%20%3D%208504571%22%2C%22status%20%3D%20'D'%22%5D&depthfilters=%5B%22scale_id%20%3D%2011311%22%5D' servername='yo.yo.dyne.org' rspms='218' rspbytes='2198'
将被解析到此Oracle表中,以便于分析所选参数。
create table transfer.loganal (
time date
, timestr varchar2(30)
, srcip varchar2(75)
, localip varchar2(15)
, referer clob
, uri clob
, servername varchar2(50)
, rspms number
, rspbytes number
, logsource varchar2(50)
);
sqlldr控制脚本看起来会是什么样的呢?
答案 0 :(得分:1)
这是我的第一个工作解决方案。随时欢迎改进,建议和改进。
在目录中给出Tomcat访问日志,例如
yoyotomcat/
combined.20010101
combined.20010102
...
此文件保存为combined.ctl,作为yoyotomcat的兄弟姐妹
-- Load an Apache common log format
-- essentially key-value pairs
-- example line of source data
-- time='[01/Jan/2001:00:00:03 +0000]' srcip='192.168.0.1' localip='10.0.0.1' referer='-' url='/limsM/SamplesGet-SampleMaster?samplefilters=%5B%22parent_sample%20%3D%208504571%22%2C%22status%20%3D%20'D'%22%5D&depthfilters=%5B%22scale_id%20%3D%2011311%22%5D' servername='yo.yo.dyne.org' rspms='218' rspbytes='2198'
--
LOAD DATA
INFILE 'yoyodyne/combined.2001*' "STR '\n'"
TRUNCATE INTO TABLE transfer.loganal
TRAILING NULLCOLS
(
time enclosed by "time='[" and "+0000]' " "to_date(:time, 'dd/Mon/yyyy:hh24:mi:ss')"
, srcip enclosed by "srcip='" and "' "
, localip enclosed by "localip='" and "' "
, referer char(10000) enclosed by "referer='" and "' "
, uri char(10000) enclosed by "url='" and "' "
, servername enclosed by "servername='" and "' "
, rspms enclosed by "rspms='" and "' " "decode(:rspms, '-', null, to_number(:rspms))"
, rspbytes enclosed by "rspbytes='" and "'" "decode(:rspbytes, '-', null, to_number(:rspbytes))"
, logsource "'munchausen'"
)
通过从命令提示符
运行来加载假设的示例内容sqlldr userid=buckaroo@banzai direct=true control=combined.ctl
您的里程可能会有所不同。我在Oracle 12上。这里使用的功能可能相对较新。不确定。
照明
""的变体。功能适用于键值对。它不是正则表达式,但性能很好。
将列名称视为绑定变量并将可用的SQL函数应用于它的能力可以提供更大的灵活性。
有一些具有非常长的GET的日志,因此规定了不合理的长字符串值。默认情况下,255还不够。
Rspms和rspbytes有时会有' - '。使用SQL来解决频繁的#34;而不是数字"错误。
写入的控制文件假定所有字段都存在。随着时间的推移不是一个好假设在机箱不匹配时寻找配置以允许空列。
干杯。