日志系统

创作人 Leo


编辑时间 Wed Jan 1,2020 at 10:13


日志产生

访问日志:

nginx

Apache

应用程序日志:

应用程序也应该记录访问日志,因为web的访问日志不够详细

  1. 输入输出:现在都是前后端分离,所有很容易做到这点,要注意的是某些接口数据量较大

  2. 执行时间,php 通过在开始时调用 shutdown 函数并设置回调函数,来收集执行时间,和性能统计

  3. 内部逻辑日志:在需要记录日志的关键逻辑点记录详细日志,包括不能给用户暴露的异常

  4. 异常日志:想php、java 的 EXCEPTION 应该将堆栈记录下来

日志收集

推荐使用 ELK 技术栈的 filebeat ,可以在多个子系统收集日志,并分类归集

ELK系统

elk 技术栈提供了专业的日志收集,监控,搜索一体化程序

es 分布式检索数据库

ES 基础操作

es通过RESTFull 接口操作数据

https://blog.csdn.net/qq_40846086/article/details/81238598

1.查看集群健康状况 GET /_cat/health?v&pretty

2.查看my_index的mapping和setting的相关信息 GET /my_index?pretty

3.查看所有的index GET /_cat/indices?v&pretty

curl “http://localhost:9200/_cat/indices?v&pretty” curl “http://localhost:9200/usecall-2019.06.28/_search” -D ‘{“size”: 0,“query”:{“query_string”:{ “match_all” : {}}}}’

删除索引 DELETE /my_index

删除多个索引 DELETE /index_one,indextwo DELETE /index*

删除多个索引 DELETE /_all

curl -X DELETE “http://localhost:9200/usecall*” curl -X DELETE “http://localhost:9200/applog*” curl -X DELETE “http://localhost:9200/%5B@fields%5D%5Blog_topic%5D-2019.06.28,filebeat*,logstash*,apicall*”

KIBANA

可视化平台

开启

/usr/local/kibana-7.2.0/bin/kibana –allow-root

kibana会默认连接到本机9200 的es数据库,并开始匹配

在使用之前需要配置合适的 index pattern,配置好后在发现页,就可以看到日志详细信息

LOGSTASH

logstash 类似一个管道,从数据源(filebeats从本地日志读取通过网络提供给logstash)获取数据,并格式化到ES

配置文件

input {
    beats {
        port => "5044"
    }
}
filter {
    dissect {
        mapping => {
            "message" => "%{anow}  %{alevel}   %{atype}    %{auid} %{aaccount} %{aserverhost}  %{aclientip}    %{aversion} %{adevice}  %{adevicetoken} %{aosversion}   %{aphoneseries} %{aurl} %{ainput}   %{aoutput}  %{asessionflag}"
        }
    }
}
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
        index => "applogs-%{+YYYY.MM.dd}"
    }
}

问题:

  1. 多类型日志配置

  2. nginx访问日志也应该同步过去

  3. 配置解析nginx日志

  4. 可以根据ip看到地理位置

命令:

测试 logstash 配置文件

bin/logstash -f first-pipeline.conf –config.test_and_exit

启动并设置自动重载 logstash 配置文件

bin/logstash -f first-pipeline.conf –config.reload.automatic

FILEBEAT日志采集

配置文件

#=========================== Filebeat inputs =============================
filebeat.inputs:
 
- type: log
  enabled: true
  paths:
    - /data/logs/*.log
 
#============================== Dashboards =====================================
setup.dashboards.enabled: false
#setup.dashboards.url:
 
#============================== Kibana =====================================
setup.kibana:
  host: "localhost:5601"
#================================ Outputs =====================================
output.logstash:
  hosts: ["localhost:5044"]

filebeat.inputs 指定输入源,这里采集应用程序日志

output.logstash,配置将采集的日志输出到 logstash

其他的两个是用来测试的,生产环境可以不配置

开启

./filebeat -e -c filebeat.yml -d “publish”

实战

logstash + filebeat 配置多个日志通道

filebeat
这个只需要修改input配置,配置多个专题,并设置 fields.log_topic 不同
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data/logs/apicall-*.log
  fields:
    log_topic: apicall_log
- type: log
  enabled: true
  paths:
    - /data/logs/usecall-*.log
  fields:
    log_topic: usecall_log
------------------------------------------
logstash
 
input {
    beats {
        port => "5044"
    }
}
# 在 filter 这里通过判断filebeat通过input传入的字段(在我们前面定义好的log_topic)做不同处理
filter {
    if [fields][log_topic] == "apicall_log" {
        dissect {
            mapping => {
                "message" => "%{anow}  %{alevel}   %{atype}    %{auid} %{aaccount} %{aserverhost}  %{aclientip}    %{aversion} %{adevice}  %{adevicetoken} %{aosversion}   %{aphoneseries} %{aurl} %{ainput}   %{aoutput}  %{asessionflag}"
            }
        }
    }
    if [fields][log_topic] == "usecall_log" {
        dissect {
            mapping => {
                "message" => "%{anow}  %{astartTime}   %{aendTime} %{usetime}  %{astartMem}    %{aendMem}  %{usemem}   %{aurl} %{auid} %{aplatform}    %{aserverHostName}  %{aclientIp}    %{asessionFlag}"
            }
        }
    }  
}
# output 同上,通过判断字段做不同处理,这里的处理是将不同类型日志写入到ES的不同索引
output {
    if [fields][log_topic] == "apicall_log" {
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "apicall-%{+YYYY.MM.dd}"
        }
    }
    if [fields][log_topic] == "usecall_log" {
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "usecall-%{+YYYY.MM.dd}"
        }
    }
}



阅读:495
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2332
  • Mac系统编译PHP7【20190929更新】 2208
  • zksync 和 layer2 1899
  • Hadoop 高可用集群搭建 (Hadoop HA) 1891
  • Linux 常用命令 1878
  • 安徽黄山游 1855
  • Windows 安装Swoole 1815
  • 小白鼠问题 1785
  • Hadoop 高可用YARN 配置 1785
  • 使用 Java+Thrift 实现异步事件处理服务 1684
简介
不定期分享软件开发经验,生活经验