按日期合并多个日志文件,包括多行

mar*_*rco 10 sorting logging command-line log-files cat

我有几个日志包含所有以时间戳开头的行,以便以下工作按预期合并它们:

cat myLog1.txt myLog2.txt | sort -n > combined.txt
Run Code Online (Sandbox Code Playgroud)

问题是,myLog2.txt还可以包含没有时间戳的行(例如java堆栈跟踪).是否有一种简单的方法,没有任何自定义脚本仍然合并它们并保留多行内容?

示例myLog1.txt

11:48:18.825 [main] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
11:48:55.784 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
Run Code Online (Sandbox Code Playgroud)

示例myLog2.txt

11:48:35.377 [qtp1484319352-19] ERROR c.w.b.c.ControllerErrorHandler -
org.springframework.beans.TypeMismatchException: Failed to convert value of type   'java.lang.String' to required type 'org.joda.time.LocalDate'; nested exception is    org.springframework.core.convert.ConversionFailedException: Failed to convert from type     java.lang.String to type @org.springframework.web.bind.annotation.RequestParam   @org.springframework.format.annotation.DateTimeFormat org.joda.time.LocalDate for value    '[2013-03-26]'; nested exception is java.lang.IllegalArgumentException: Invalid format: "    [2013-03-26]"
    at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:68) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595) ~[spring-context-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:98) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-3.2.1.RELEAS
Run Code Online (Sandbox Code Playgroud)

预期产出

11:48:18.825 [main] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
11:48:35.377 [qtp1484319352-19] ERROR c.w.b.c.ControllerErrorHandler -
org.springframework.beans.TypeMismatchException: Failed to convert value of type   'java.lang.String' to required type 'org.joda.time.LocalDate'; nested exception is    org.springframework.core.convert.ConversionFailedException: Failed to convert from type     java.lang.String to type @org.springframework.web.bind.annotation.RequestParam   @org.springframework.format.annotation.DateTimeFormat org.joda.time.LocalDate for value    '[2013-03-26]'; nested exception is java.lang.IllegalArgumentException: Invalid format: "    [2013-03-26]"
    at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:68) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595) ~[spring-context-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:98) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-3.2.1.RELEAS
11:48:55.784 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
Run Code Online (Sandbox Code Playgroud)

谢谢马可

top*_*opr 19

我正在努力解决同样的问题,最后我想我已经得到了它.尝试这样做:

sort -nbms -k1.1,1.2 -k1.4,1.5 -k1.7,1.8 -k1.10,1.12 myLog1.txt myLog2.txt > combined.txt

我自己还不完全清楚,但我会试着给出一些解释.根据使用的手册页面意思是:

-n, - numeric-sort - 根据字符串数值进行比较.

-b, - ignore-leading-blanks - 忽略领先的空白.

-s, - stable - 通过禁用最后的比较来稳定排序

-m,--merge - 合并已排序的文件; 不要排序

-k, - key = POS1 [,POS2] - 在POS1(原点1)开始一个键,在POS2结束(默认行尾)

  • 日志文件已经订购,所以我们不需要再次对它们进行排序,只确定哪一行在合并时去哪里.这就是原因-m.保持堆栈跟踪不被扰乱是至关重要的.
  • -b在这种情况下不是必需的,因为某种方式-n-m组合使堆栈跟踪线不会聚集.我留下它以防万一,因为大多数stacktrace行都是以空白开头的.
  • -n当密钥中存在非数字字符时,显然会停止比较密钥.这是保持堆栈跟踪到位的第二个关键点.重要的是,如果它-n -k1,1只是按小时排序日志文件,因为冒号是非数字的.除此之外,-n加快了数字比较,所以无论如何我们想要它.
  • 通过指向每个键中的特定字符位置来解决前一点中提到的问题,这就是为什么-k1.1,1.2(小时的-k1.4,1.5第一和第二位)(分钟的第一和第二位)等等.点之前的第一个数字始终为"1",因为它指向文件行的第一列(在我们的例子中是时间).不久,它的-kA,B地方A,并B在给定线列的位置(默认情况下通过线空白分隔).使用的A和B的格式是..请记住,每当有非数字字符AB之后的所有内容时,如果-n使用它将被忽略.
  • -s禁用默认行为,即:每当进行比较的键都完成相同的完整字符串比较.我们不希望保留原始日志条目顺序.不确定是否有必要-m.