【问题标题】:Convert time from Apache Log to Epoch time将时间从 Apache Log 转换为 Epoch 时间
【发布时间】:2017-09-16 05:36:33
【问题描述】:

编辑:工作解决方案。下面是原始问题。

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 访问日志中解析时间戳并将其转换为 Epoch 时间戳或 SQL 时间戳。我已经有代码可以从 epoch 转换为其他格式的 SQL 时间戳,所以我主要关心的是获取 Epoch 格式或任何其他易于转换的格式。我目前正在使用 Grok 模式,但是我正在寻找一种更有效的方法来提取时间。

下面是我正在提取的日志和时间戳的示例以及我当前的代码:

127.0.0.1 127.0.0.1 - - [04/Nov/2016:08:00:02 -0400] "GET /loc/ation" 200 163 "-" "-" 26 163 37526

04/Nov/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());
}

提前感谢您的帮助!

【问题讨论】:

    标签: java sql epoch grok


    【解决方案1】:
        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 对象

    【讨论】:

    • 效果很好,谢谢!我已经用更新的代码编辑了我的帖子,以防将来有人偶然发现它。
    • 我认为这有一个潜在的错误:SimpleDateFormat 中的“hh”代码应该大写“HH”,以便它是 24 小时制的小时数(13 = 1pm)而不是 am/下午。
    猜你喜欢
    • 2021-07-28
    • 2018-06-28
    • 2012-04-01
    • 2019-12-24
    • 2011-10-09
    • 2017-03-23
    • 2013-01-04
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多