将Apache日志转换为*时间

问题描述:

编辑:工作解决方案。下面的原始问题。将Apache日志转换为*时间

private Timestamp extractTimestamp(Object timestamp) { 
    try { 
     return Timestamp.from(Instant.ofEpochMilli(Long.valueOf(String.valueOf(timestamp)))); 
    } catch(NumberFormatException e) { 
     System.out.println("Not in Epoch format"); 
    } 
    try { 
     return Timestamp.from(Instant.parse(String.valueOf(timestamp))); 
    } catch(DateTimeParseException e) { 
     System.out.println("Not in UTC format"); 
    } 
    try { 
     return Timestamp.valueOf(String.valueOf(timestamp)); 
    } catch(IllegalArgumentException e) { 
     System.out.println("Not in SQL format"); 
    } 
    try {    
     SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy:hh:mm:ss Z"); 
     Date date = formatter.parse(String.valueOf(timestamp)); 
     return Timestamp.from(Instant.ofEpochMilli(date.getTime())); 
    } catch(ParseException e) { 
     System.out.println("Not in Apache Log format"); 
    } 
    // Return current time if none found 
    return Timestamp.from(Instant.now()); 
} 

我试图解析从Apache访问日志的时间戳,使之成为一个时代的时间戳或SQL时间戳。我已经有代码将时代转换为其他格式的SQL时间戳,所以我主要关心的是获得Epoch格式还是任何其他可轻松转换的格式。我目前正在使用Grok模式,但我正在寻找一种更有效的提取时间的方法。

下面是日志和时间戳我拉的样品和我当前的代码:

127.0.0.1 127.0.0.1 - - [04 /十一月/ 2016:08:00:02 -0400]“ GET /禄/通货膨胀” 200 163 “ - ”, “ - ” 26 163 37526

04 /十一月/ 2016:08:00:02 -0400

private Timestamp extractTimestamp(Object timestamp) { 
    try { 
    return Timestamp.from(Instant.ofEpochMilli(Long.valueOf(String.valueOf(timestamp)))); 
    } catch(NumberFormatException e) { 
    System.out.println("Not in Epoch format"); 
    } 
    try { 
    return Timestamp.from(Instant.parse(String.valueOf(timestamp))); 
    } catch(DateTimeParseException e) { 
    System.out.println("Not in UTC format"); 
    } 
    try { 
    return Timestamp.valueOf(String.valueOf(timestamp)); 
    } catch(IllegalArgumentException e) { 
    System.out.println("Not in SQL Time format"); 
    } 
    try { 
    // Sample timestamp: 04/Nov/2016:08:00:02 -0400 
    String apacheLogExpression = "%{NUMBER:day}/%{WORD:month}/%{NUMBER:year}:%{NUMBER:hour}:%{NUMBER:minute}:%{NUMBER:second}\\s%{GREEDYDATA:offset}"; 
    Grok compiledPattern = dictionary.compileExpression(apacheLogExpression); 
    Map<String, String> values = compiledPattern.extractNamedGroups(String.valueOf(timestamp)); 
    System.out.println(values); 
    } catch(Exception e) { 
    System.out.println("Not in Apache Log format"); 
    e.printStackTrace(); 
    } 
    // Return current time if none found 
    return Timestamp.from(Instant.now()); 
} 

在此先感谢您的帮助!

String logTime = "04/Nov/2016:08:00:02 -0400"; 
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy:hh:mm:ss Z"); 
    Date date = formatter.parse(logTime); 
    System.out.println(date); 

将打印Fri Nov 04 14:00:02 EET 2016基本上得到java.util.Date对象

+0

这完美地工作,谢谢!我已经使用更新后的代码编辑了我的帖子,以防将来任何人在将来遇到它。 – Mielzus