我目前的任务是编写一个脚本,该脚本将解析mySQL错误和异常的日志文件,然后将它们插入到数据库中。
日志文件的一般格式为:
POSPER ERRORS:
01 Jan 2014 11:33:23,931 ERROR LazyInitializationException:42 - failed to lazily initialize a collection of role: org.data.moredata.CashRegister.tickets, no session or session was closed
还有更多行,但这只是错误日志当前格式化的一个例子。posper错误标题只出现一次,后续行只是更多错误。
我需要对此脚本执行的操作是将错误插入到我使用以下字段创建的表中:client_name,timestamp,error_message和error_from(Posper或其他内容。在上面的示例中,它是posper)。
那么我应该如何分解每一行的数据,将其分配给各个mySQL字段,然后将其插入数据库?请记住,日志文件将包含许多行,因此必须多次执行。我已经使用适当的字段设置了表格。
非常感谢任何帮助。
答案 0 :(得分:2)
正如Norbert van Nobelen所说,你应该使用LOAD DATA INFILE
。您需要一些技巧来处理特定的日志格式。日志中的空格有时是分隔符,有时则不是。您可以使用FIELDS TERMINATED BY ''
结合用户变量语法和MySQL字符串函数来处理它,以进行解析。例如,可以做这样的事情(在您的样本行上测试的例子):
create table log (ts datetime, msg text);
load data infile '/tmp/log.txt' into table log
fields terminated by '@@@' (@l)
set ts=str_to_date(
substring_index(@l,'ERROR',1),'%d %M %Y %H:%i:%s,%f'),
msg=substring_index(@l, 'ERROR', -1);
您可能需要额外的技巧来处理不遵循常见模式的行,但我希望这能为您提供一个开始。