protected void process ( BufferedReader bufferedReader ) throws IOException { Matcher eventMatcher ; Matcher exceptionMatcher ; String line ; while ( ( line = bufferedReader . readLine ( ) ) != null ) { //skip empty line entries eventMatcher = regexpPattern . matcher ( line ) ; if ( line . trim ( ) . equals ( "" ) ) { continue ; } exceptionMatcher = exceptionPattern . matcher ( line ) ; if ( eventMatcher . matches ( ) ) { //build an event from the previous match (held in current map) LoggingEvent event = buildEvent ( ) ; if ( event != null ) { if ( passesExpression ( event ) ) { doPost ( event ) ; } } currentMap . putAll ( processEvent ( eventMatcher . toMatchResult ( ) ) ) ; } else if ( exceptionMatcher . matches ( ) ) { //an exception line additionalLines . add ( line ) ; } else { //neither...either post an event with the line or append as additional lines //if this was a logging event with multiple lines, each line will show up as its own event instead of being //appended as multiple lines on the same event.. //choice is to have each non-matching line show up as its own line, or append them all to a previous event if ( appendNonMatches ) { //hold on to the previous time, so we can do our best to preserve time-based ordering if the event is a non-match String lastTime = ( String ) currentMap . get ( TIMESTAMP ) ; //build an event from the previous match (held in current map) if ( currentMap . size ( ) > 0 ) { LoggingEvent event = buildEvent ( ) ; if ( event != null ) { if ( passesExpression ( event ) ) { doPost ( event ) ; } } } if ( lastTime != null ) { currentMap . put ( TIMESTAMP , lastTime ) ; } currentMap . put ( MESSAGE , line ) ; } else { additionalLines . add ( line ) ; } } } //process last event if one exists LoggingEvent event = buildEvent ( ) ; if ( event != null ) { if ( passesExpression ( event ) ) { doPost ( event ) ; } } }
Read parse and optionally tail the log file converting entries into logging events .