#log-format #logs #logging #format-json #parser #cli #ncsa

bin+lib redeye

将Apache风格的访问日志解析为Logstash JSON

5个不稳定版本

0.3.0 2020年3月20日
0.2.1 2018年12月7日
0.2.0 2018年10月8日
0.1.1 2018年9月9日
0.1.0 2018年9月9日

#log-format中的排名#28

GPL-3.0+

53KB
905

Redeye

Build Status crates.io

将Apache风格的访问日志解析为Logstash JSON。

关于

Redeye从stdin读取NCSA或Apache风格的访问日志,并将Logstash兼容的JSON写入stdout。这使得应用程序可以继续以他们一直以来的方式发射访问日志,同时获得在工具如Kibana中结构化日志的好处。

Redeye支持通用日志格式以及组合日志格式。关于这些格式的更多信息可以在Apache文档中找到。

通用日志格式的一个例子是

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.0" 200 2326

而组合日志格式的一个例子是

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

用法

以下是一些如何使用Redeye将日志文件解析为结构化JSON的示例。

解析文件

由于Redeye从标准输入解析日志行,因此您可以使用类似以下shell命令来解析文件。

$ cat <<EOF > logs.txt
127.0.0.1 - - [02/Oct/2018:13:55:36 -0400] "GET /index.html HTTP/1.1" 200 2326
127.0.0.1 - - [02/Oct/2018:13:55:37 -0400] "GET /favicon.ico HTTP/1.1" 200 56
127.0.0.1 - - [02/Oct/2018:13:55:38 -0400] "GET /header.png HTTP/1.1" 304 4051
EOF

这创建了一个包含一些日志条目的文件,名为logs.txt。接下来,我们解析这些条目。注意,此示例使用jq工具以很好地格式化JSON。

$ redeye --common-format < logs.txt | jq -S .
{
  "@timestamp": "2018-10-02T13:55:36-04:00",
  "@version": "1",
  "content_length": 2326,
  "message": "127.0.0.1 - - [02/Oct/2018:13:55:36 -0400] \"GET /index.html HTTP/1.1\" 200 2326",
  "method": "GET",
  "protocol": "HTTP/1.1",
  "remote_host": "127.0.0.1",
  "requested_uri": "/index.html",
  "requested_url": "GET /index.html HTTP/1.1",
  "status_code": 200
}
{
  "@timestamp": "2018-10-02T13:55:37-04:00",
  "@version": "1",
  "content_length": 56,
  "message": "127.0.0.1 - - [02/Oct/2018:13:55:37 -0400] \"GET /favicon.ico HTTP/1.1\" 200 56",
  "method": "GET",
  "protocol": "HTTP/1.1",
  "remote_host": "127.0.0.1",
  "requested_uri": "/favicon.ico",
  "requested_url": "GET /favicon.ico HTTP/1.1",
  "status_code": 200
}
{
  "@timestamp": "2018-10-02T13:55:38-04:00",
  "@version": "1",
  "content_length": 4051,
  "message": "127.0.0.1 - - [02/Oct/2018:13:55:38 -0400] \"GET /header.png HTTP/1.1\" 304 4051",
  "method": "GET",
  "protocol": "HTTP/1.1",
  "remote_host": "127.0.0.1",
  "requested_uri": "/header.png",
  "requested_url": "GET /header.png HTTP/1.1",
  "status_code": 304
}

解析服务器输出

Redeye附带一个简单的Python(版本3.4+)HTTP服务器,该服务器在stdout上以通用日志格式发射访问日志。您可以运行此服务器以演示Redeye解析输出的方式。

从Redeye代码库的根目录运行

$ python util/server.py | ./path/to/redeye --common-format | jq -S .

在另一个终端中,运行以下命令几次。

$ curl 'https://127.0.0.1:8000/'

如果您没有从Python服务器和Redeye中看到任何输出,请尝试再运行几次curl命令。Redeye为了效率而缓冲输入,因此可能需要几个请求才能发射任何输出。

跟踪文件

您还可以使用Redeye和标准UNIX工具解析写入文件中的日志行。以下是一个使用上面提到的Python服务器的示例。

首先,启动Python HTTP服务器以提供服务并写入访问日志到文件。

$ python util/server.py > access.log

在另一个终端中,开始跟踪该文件的内容并将它们通过管道传输到Redeye。

$ tail -f access.log | ./path/to/redeye --common-format | jq -S .

在另一个终端中,使用 curl 发送几个请求,以查看其实际效果。

$ curl 'https://127.0.0.1:8000/'

再次提醒,这里正在进行相当大的缓冲,因此您可能需要发送几个请求才能看到任何输出。

安装

Redeye是用Rust编写的,可以使用Rust工具 cargo 进行构建或安装。它也可以作为Docker镜像使用。以下是对这些方法的说明。

从Cargo(Rust包管理器)安装

首先,使用 rustup 安装Rust工具链。

接下来,运行以下命令以下载和安装Redeye。

$ cargo install --force redeye

这将与其他Rust二进制文件一起安装Redeye。您需要确保以这种方式安装的二进制文件在您的 $PATH 上。

从源代码 - glibc

首先,使用 rustup 安装Rust工具链。

接下来,确保您有所需的非Rust依赖项。

  • build-essential - C编译器工具链

然后,检出并构建项目

$ git clone https://github.com/tshlabs/redeye.git && cd redeye
$ cargo build --release

您的二进制文件应在 target/release/redeye

从源代码 - musl libc

首先,使用 rustup 安装Rust工具链。

然后,添加一个musl目标

$ rustup target add x86_64-unknown-linux-musl

接下来,确保您有所需的非Rust依赖项。

  • build-essential - C编译器工具链
  • musl-tools - musl libc实现

然后,检出并构建项目

$ git clone https://github.com/tshlabs/redeye.git && cd redeye
$ cargo build --release --target=x86_64-unknown-linux-musl

您的二进制文件应在 target/x86_64-unknown-linux-musl/release/redeye

Docker

Redeye的Docker镜像被推送到每个发布周期的Docker Hub。要运行最新版本,请使用以下命令。

docker run --rm --tty --interactive tshlabs/redeye:latest

文档

库文档可在 https://docs.rs/redeye/ 找到

源代码

源代码可在GitHub上找到,地址为 https://github.com/tshlabs/redeye

变更

Redeye的发行说明可在 CHANGES.md 文件中找到。

开发

Redeye使用Cargo执行各种开发任务。

要构建Redeye

$ cargo build

要运行测试

$ cargo test

$ cargo test -- --ignored

要运行基准测试

$ cargo bench

要构建文档

$ cargo doc

许可证

Redeye根据GPL,版本3的条款提供。

贡献

除非您明确说明,否则您有意提交以包含在作品中的任何贡献都应按上述方式许可,不附加任何额外条款或条件。

依赖项

~5.5–7.5MB
~131K SLoC