本文档记录了使用 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 日志采集
- 创建 Nginx 日志采集配置 /etc/filebeat/modules.d/nginx.yml:
- 由于 filebeat 有 nginx 模块,所以我们这里直接使用
- 模块是在/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 日志采集
- 创建自定义配置文件 /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
- odoo 需要自定义,没有现成模块,所以是在 /etc/filebeat/inputs.d/odoo.yml 目录下配置
- 或者也可以直接配置到/etc/filebeat/filebeat.yml 下的 filesteram 下,但是为了模块化管理,我们还是在 inputs.d 中建立配置文件
- 使用 inputs.d 需要在/etc/filebeat/filebeat.yml 中指定好路径并启用 (enabled 为 true)
filebeat.config.inputs:
enabled: true
path: ${path.config}/inputs.d/*.yml
2. Logstash
- 新建配置文件 /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
- 检查索引是否存在:
- 应看到类似 nginx-* 和 odoo-logs-* 的索引。
curl http://localhost:9200/_cat/indices?v
- 查询测试数据:
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)筛选错误信息。