Skip to Content

部署ELK 监控 Odoo+Nginx 日志

本文档记录了使用 filebeat + ELK 监控分析 nginx 及 odoo 日志的方法和经验

首先安装 java 环境

sudo apt update
sudo apt install openjdk-11-jdk
java -version  # 验证安装

安装 Elasticsearch

1. 安装

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch

2. 配置 Elasticsearch

a. 修改配置文件

/etc/elasticsearch/elasticsearch.yml

network.host: 0.0.0.0  # 允许外部访问(生产环境需谨慎)
cluster.initial_master_nodes: ["节点名"]  # 单节点可填主机名

b. 调整 JVM 内存(可选)

修改 /etc/elasticsearch/jvm.options:

根据服务器情况配置

-Xms1g  # 最小内存
-Xmx1g  # 最大内存

3. 启动服务

sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

4. 验证

curl http://localhost:9200

看到 JSON 响应即表示成功。

5. 重置密码

# 使用交互式工具
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i

# 或自动生成新密码
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a

安装 Kibalna

1. 安装

sudo apt install kibana

2. 配置 Kibana

修改 /etc/kibana/kibana.yml:

server.host: "0.0.0.0"  # 允许外部访问
elasticsearch.hosts: ["http://localhost:9200"]  # Elasticsearch 地址

3. 启动服务

sudo systemctl enable kibana
sudo systemctl start kibana

4. 访问 Kibana

浏览器打开 http://服务器IP:5601

安装 Logstash

1. 安装

sudo apt install logstash

2. 配置 Logstash 管道

创建配置文件(如 /etc/logstash/conf.d/my-pipeline.conf):

input {
  file {
    path => "/var/log/*.log"  # 输入源(示例为日志文件)
    start_position => "beginning"
  }
}
filter {
  grok {  # 日志解析(按需调整)
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]  # 输出到 Elasticsearch
    index => "my-logs-%{+YYYY.MM.dd}"
  }
}

3. 启动服务

sudo systemctl enable logstash
sudo systemctl start logstash

安装 Filebeat

1. 安装

sudo apt install filebeat

2. 配置 Filebeat

编辑配置文件 /etc/filebeat/filebeat.yml:

# 禁用默认的 Elasticsearch 输出
output.elasticsearch.enabled: false

# 启用 Logstash 输出
output.logstash:
  hosts: ["localhost:5044"]
  
# 当需要调试时,可以开启下面部分 output.console,但需要同时关闭 outpu.logstash
#output.console:
#  pretty: true

3. 启动 Filebeat

sudo filebeat modules enable nginx
sudo systemctl restart filebeat



Nginx 和 ODOO 日志监控

1. Filebeat

a. 添加 Nginx 日志采集

  1. 创建 Nginx 日志采集配置 /etc/filebeat/modules.d/nginx.yml:
    1. 由于 filebeat 有 nginx 模块,所以我们这里直接使用
    2. 模块是在/etc/filebeat/modules.d/ 目录下进行配置
- module: nginx
  access:
    enabled: true
    var.paths: [
      "/var/log/nginx/access.log*",
      "/var/log/nginx/odoo_access.log*",

]
  error:
    enabled: true
    var.paths: [
      "/var/log/nginx/error.log*",
      "/var/log/nginx/odoo_error.log*",
]

b. 添加 Odoo 日志采集

  1. 建自定义配置文件 /etc/filebeat/inputs.d/odoo.yml:
- type: filestream
  id: odoo-logs
  enabled: true
  paths:
    - /var/log/odoo/odoo*.log  # 根据实际路径调整
  fields:
    app: odoo
  fields_under_root: true
  1. odoo 需要自定义,没有现成模块,所以是在 /etc/filebeat/inputs.d/odoo.yml 目录下配置
    1. 或者也可以直接配置到/etc/filebeat/filebeat.yml 下的 filesteram 下,但是为了模块化管理,我们还是在 inputs.d 中建立配置文件
    2. 使用 inputs.d 需要在/etc/filebeat/filebeat.yml 中指定好路径并启用 (enabled 为 true)
filebeat.config.inputs:
  enabled: true
  path: ${path.config}/inputs.d/*.yml

2. Logstash

  1. 新建配置文件 /etc/logstash/conf.d/nginx-odoo.conf:
input {
  beats {
    port => 5044
  }
}

filter {
  # 根据日志来源区分 Nginx 和 Odoo
  if [app] == "odoo" {
    grok {
      match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{LOGLEVEL:loglevel} %{NUMBER:pid} %{WORD:module} %{GREEDYDATA:message}" }
    }
    date {
      match => ["timestamp", "ISO8601"]
      target => "@timestamp"
    }
  } else if [fileset][name] == "access" {
    grok {
      match => { "message" => "%{IPORHOST:client_ip} - %{USER:remote_user} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:status} %{NUMBER:body_bytes_sent} \"%{DATA:referrer}\" \"%{DATA:user_agent}\"" }
    }
    date {
      match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
      target => "@timestamp"
    }
    geoip {
      source => "client_ip"
      target => "geoip"
    }
  } else if [fileset][name] == "error" {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:loglevel}\] %{NUMBER:pid}#%{NUMBER:tid}: \*%{NUMBER:connection_id} %{GREEDYDATA:error_message}" }
    }
    date {
      match => ["timestamp", "yyyy/MM/dd HH:mm:ss"]
      target => "@timestamp"
    }
  }
}

output {
  if [app] == "odoo" {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      user => "user"  # 可选
      password => "password"  # 可选
      index => "odoo-logs-%{+YYYY.MM.dd}"
      ssl_certificate_verification => false  # 可选
    }
  } else {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "nginx-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    }
  }
}

a. 重启 Logstash

sudo systemctl restart logstash

b. 验证数据写入 Elasticsearch

  1. 检查索引是否存在:
    1. 应看到类似 nginx-* 和 odoo-logs-* 的索引。
curl http://localhost:9200/_cat/indices?v
  1. 查询测试数据:
curl -X GET "http://localhost:9200/nginx-*/_search?pretty"
curl -X GET "http://localhost:9200/odoo-logs-*/_search?pretty"

3. 配置 Kibana 可视化

a. 创建索引模式:

    • 进入 Kibana → Management → Stack Management → Index Patterns (Kibana 8+ 把 Index Patterns 叫做:Data Views)。
    • 分别创建 nginx-* 和 odoo-logs-* 的索引模式。

b. 分析 Nginx 日志:

    • 进入 Discover,选择 nginx-* 索引模式:
      • 按状态码(status)、客户端 IP(client_ip)过滤。
      • 使用 geoip.location 在地图可视化中展示访问来源。

c. 分析 Odoo 日志:

    • 进入 Discover,选择 odoo-logs-* 索引模式:
      • 按日志级别(loglevel)、模块(module)筛选错误信息。