Parsing a tabular log file into a hashmap
This is indeed way too complex. In fact I think there's enough responsibilities in this one method to be spread over a few classes.


managing the history file
parsing history records
processing history records
counting lines
logging


These points may map to simply a helper method or a separate class.

Try organizing this behavior in several levels of abstraction. Try checking the existence of the file prior to tryig to parse its contents. Making a class that models the content of one record will definitely help. It'll make a good home for some of the validation and parsing logic. Don't be afraid to make private helper methods. They can greatly improve readability and lower complexity per method significantly.

The top level version of this method could look like this :

public ExchangeHistory loadHistory(String path) {
    List&lt;HistoryRecord&gt; records = new ArrayList&lt;&gt;();
    for (String line : new LineIterable(getHistoryReader(path))) {
        records.add(HistoryRecord.fromTokenizedString(line));
    }
    return ExchangeHistory.fromHistoryRecords(nonNulls(records));
}


In which 


getHistoryReader(path) will fetch or create the file and wrap it as a reader.
LineIterable abstracts reading the BufferedReader to an Iterable (enabling the advanced for loop)
HistoryRecord parses the tokens of a line, and can be queried for the parsed data.

fromTokenizedString(line) returns a valid HistoryRecord or null

nonNulls() filters nulls out of a List
ExchangeHistory.fromHistoryRecords() creates the ExchangeHistory based on a List/Iterable of HistoryRecords


As for logging, it always clutters code. Your error logging currently seems to be a placeholder for decent exception handling. The other logging appears to be used for debugging. I like AOP to do logging, since it allows you to focus on the code, and the logging can be coded separately.