日志监控系统

日志监控系统

目标与方案

搭建一个查询构建状态与日志的网站:

  1. 构建服务器向监控服务器传输状态与日志
  2. 监控服务器存储状态与日志
  3. 用户访问监控网站获取状态与日志
  4. 监控服务器通过后台服务获取存储的状态与日志

方案一:

Node.js + websocket + mongodb

通过websocket连接构建服务器与监控服务器、监控网站前后台,这样可以让日志与状态实时传输并且还可以在监控服务器传递数据到构建服务器,触发构建服务器的构建。

全局安装mongodb

# mac
brew tap mongodb/brew # 安装mongodb相关homebrew指令
brew install mongodb-community # 安装mongodb

brew services start mongodb-community #作为macOS服务运行mongodb
brew services stop mongodb-community@4.2 #作为macOS服务停止mongodb
mongod --config /usr/local/etc/mongod.conf --fork #作为后台进程手动运行mongodb

ps aux | grep -v grep | grep mongod #查看mongodb是否运行

方案二:

Node.js + Filebeat + Redis

Filebeat:

是开源的轻量级数据传送工具。包含两个主要组件,输入 Input 组件定时( scan_frequency 默认10s)查看配置中指定的文件大小,确定文件是否修改,如果修改就开启另一组件:收割机 Harvester ,收割机读取文件内容,获取到最新修改的文件( backoff 默认1s)输出到,直到关闭。

Filebeat官方教程

如果Filebeat要与mongodb结合使用,需要使用logstash并增加对应插件,不如使用redis数据库。

Redis:

Redis是开源的名值对形式的存储数据库,它的数据存储于内存中,性能优异,但占用内存。

需要设置密码才能进行远程设置

# redis server
CONFIG SET requirepass "mypass" #set password

# others cli
src/redis-cli -h www.someone.website -p 6379
AUTH mypass # input password

设置 maxmemory 限制redis占用大小

redis配置

redis-cli常用指令

keys * #获取所有keys
set key value #存储一个名值对
get key #根据key获取一个存储的值
expire key 120 #设置过期时间
ttl key #查看过期时间
set key value ex 120 #在设置值的时候设置过期时间
persist key #清除过期时间

lpush key value value #存储数组
rpush key value value #存储数组
lrange key 0 -1 #获取整个数组的值
llen key #获取数组长度

del key #删除值

步骤:

构建服务器:

  1. 构建服务器安装filebeat

    cd /opt
    sudo curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz
    sudo tar xzvf filebeat-7.8.0-linux-x86_64.tar.gz
    sudo rm -rf filebeat-7.8.0-linux-x86_64.tar.gz
    sudo mv filebeat-7.8.0-linux-x86_64 filebeat
    
    
    sudo vim filebeat/filebeat.yml
    

    mac上使用brew指令启动filebeat时无效,但直接使用filebeat -e命令在控制台运行却没有问题

  2. 修改filebeat配置文件

    filebeat.inputs:
    - type: log
     enabled: true
      paths:
        - /xxx/*.log
    
    output.redis:
      hosts: ["localhost:6379"]
      password: "my_password"
      key: "filebeat"
      keys:
        - key: "filebeat-error"
          when.contains:
            message: "error"
      
     
    processors:
      - drop_fields:
          fields: ["agent", "ecs", "host", "input", "log", "cloud"]
    

    注意要注释默认的output与hosts

    drop_fields:删除原有属性

    decode_json_fields:转化json格式字段

  3. 运行filebeat

    cd /opt/filebeat
    sudo ./filebeat -e #控制台运行(debug)
    sudo ./filebeat & #后台运行
    
    ps aux | grep -v grep | grep filebeat #查看是否成功运行
    
    kill pid #关闭进程
    

监控服务器:

  1. 监控服务器安装redis

    cd /opt
    sudo wget http://download.redis.io/releases/redis-6.0.6.tar.gz
    sudo chown ec2-user redis-6.0.6.tar.gz
    sudo rm -rf redis-6.0.6.tar.gz
    sudo mv redis-6.0.6 redis
    sudo make
    
  2. 启动redis

    cd redis
    sudo ./src/redis-server &
    
    #查看是否成功运行
    sudo ./src/redis-cli
    
    
  3. 拉取监控网站服务器代码并运行

    #拉取代码略,从本地scp传输或直接git clone到监控服务器中
    
    cd /opt/monitor-build
    pm2 start src/server/app.js #启动node后台服务(端口为3002)
    

    如果更换端口或设置反向代理需要修改 /src/client/app.js 的baseURL

  4. 配置nginx,显示前端页面与反向代理node后台服务

    server {
            listen  8080  default;
            server_name  monitor-build;
    
            root /opt/monitor-build/src/client;
      
                 # 访问无需加.html后缀
            location / {
                if ($request_uri ~ ^/(.*)\.html$) {
                    return 302 /$1;
                }
                try_files $uri $uri.html $uri/ =404;
            }
      
            location /monitor-server/ {
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header Host $http_host;
               proxy_set_header X-NginX-Proxy true;
               proxy_pass http://127.0.0.1:3002/;
               proxy_redirect off;
            }
        }
    
    

    反向代理注意根路径

其他

pm2设置log相关:

pm2清空log

pm2 flush

pm2-logrotate设置日志最大存储空间

pm2 install pm2-logrotate #安装pm2 log控制工具

linux后台运行服务

Filebeat不会监控最后一行