组合log4j日志行

af7jpaap  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(438)

我正在处理一些在linux上用log4j创建的配置单元日志。使用的正则表达式是

(%d{ISO8601} %-5p [%t]: %c{2} (%F:%M(%L)) - %m%n)

. 我意识到有些线条被分成了好几行。例如

2017-02-10 10:03:29,933 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command: 

create table my_table

(std_id STRING, std_number STRING)

2017-02-10 10:03:31,296 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(209)) - Parse Completed

在linux中有没有一个命令,我可以用它来组合虚线,得到这样的输出;

2017-02-10 10:03:29,933 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command: create table my_table (std_id STRING, std_number STRING)

2017-02-10 10:03:31,296 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(209)) - Parse Completed
wyyhbhjk

wyyhbhjk1#

这应该管用。

<myfile.log sed -nr \
-e '/^.{4}-.{2}-.{2} .{2}:.{2}:.{2},.{3} [A-Z]+ /{x;1!{s/\n/ /g;p};${g;p};d}' \
-e 'H' \
-e '${g;s/\n/ /g;p}'

解释
/^.{4}-.{2}-.{2} .{2}:.{2}:.{2},.{3} [A-Z]+ 是表示新日志记录的模式,例如。 2017-03-17 03:20:19,372 WARN 第一 -e 当当前行指示新的日志记录时 x :交换模式空间(保存当前行)和保留空间的内容。 1!{s/\n/ /g;p} :如果这不是文件的第一行,(在模式空间内),请用空格替换新行并打印它 ${g;p} 如果这是文件的最后一行,请从保留空间获取并打印它 d :删除图案空间并开始新的循环(忽略以下命令)
第二 -e “h”:将模式空间附加到保留空间(仅当没有新的日志记录时)
第三 -e 如果这是文件的最后一行( $ )而不是新的日志记录 g :用保留空间的内容覆盖图案空间 s/\n/ /g;p :用空格替换新行并打印

演示

$ cat>myfile.log
2017-02-10 10:03:27,374 INFO  [main]: ql.Driver (Driver.java:compile(463)) - Semantic Analysis Completed
2017-02-10 10:03:29,933 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command:

create table my_table

(std_id STRING, std_number STRING)

2017-02-10 10:03:31,296 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(209)) - Parse Completed
2017-03-17 03:04:09,297 INFO  [main]: ql.Driver (SessionState.java:printInfo(927)) - OK
2017-03-17 03:20:19,372 WARN  [Driver]: client.SparkClientImpl (SparkClientImpl.java:run(451)) - Child process exited with code 1.
2017-03-17 03:03:55,282 ERROR [main]: ql.Driver (SessionState.java:printError(936)) - FAILED: ParseException line 1:14 cannot recognize input near 'valeus' '(' '1' in statement
org.apache.hadoop.hive.ql.parse.ParseException: line 1:14 cannot recognize input near 'valeus' '(' '1' in statement
        at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:204)
$ <myfile.log sed -nr -e '/^.{4}-.{2}-.{2} .{2}:.{2}:.{2},.{3} [A-Z]+ /{x;1!{s/\n/ /g;p};${g;p};d}' -e 'H' -e '${g;s/\n/ /g;p}'
2017-02-10 10:03:27,374 INFO  [main]: ql.Driver (Driver.java:compile(463)) - Semantic Analysis Completed
2017-02-10 10:03:29,933 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(185)) - Parsing command:   create table my_table  (std_id STRING, std_number STRING)
2017-02-10 10:03:31,296 INFO  [main]: parse.ParseDriver (ParseDriver.java:parse(209)) - Parse Completed
2017-03-17 03:04:09,297 INFO  [main]: ql.Driver (SessionState.java:printInfo(927)) - OK
2017-03-17 03:20:19,372 WARN  [Driver]: client.SparkClientImpl (SparkClientImpl.java:run(451)) - Child process exited with code 1.
2017-03-17 03:03:55,282 ERROR [main]: ql.Driver (SessionState.java:printError(936)) - FAILED: ParseException line 1:14 cannot recognize input near 'valeus' '(' '1' in statement org.apache.hadoop.hive.ql.parse.ParseException: line 1:14 cannot recognize input near 'valeus' '(' '1' in statement        at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:204)

相关问题