【发布时间】:2015-09-29 19:32:01
【问题描述】:
我正在尝试使用 org.apache.hadoop.hive.serde2.RegexSerDe 创建一个配置单元外部表,用于分析一些 Log4J 日志。
但是,我的regex 在http://www.regexr.com/ 中进行测试时即使正常也无法正常工作。
我的问题是当我有多行日志时,例如,带有相应 StackTrace 的异常日志。
这是一个例子:
@@@@ 2015-09-29T11:20:45,549 INFO MYHOSTNAME my-app org.hibernate.jpa.internal.util.LogHelper HHH000204: Processing PersistenceUnitInfo [
name: name
...] @@@@
我在日志的开头和结尾添加了一个模式,以帮助在多行时提取它。
这是我的正则表达式:
@@@@ (.{23}) ([\\w]+) ([\\w]+) ([\\w\\-]+) ([\\w\\.$]+) ([\\s\\S]+) @@@@
这是我的桌子:
CREATE EXTERNAL TABLE log4j(
dt STRING,
level STRING,
host STRING,
app_name STRING,
clazz STRING,
message STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "@@@@ (.{23}) ([\\w]+) ([\\w]+) ([\\w\\-]+) ([\\w\\.$]+) ([\\s\\S]+) @@@@")
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/logs/';
使用单行日志可以正常工作,但是对于示例中的多行日志,它会提取多行且所有列都为空。
【问题讨论】:
-
您可以尝试在正则表达式的开头添加
(?s)吗?喜欢这里regex101.com/r/qF0rD1/1 -
没用,出现同样的问题。