內外網分離日誌方案 rsyslog logstash tencent oss rabbitMq

在公司的一週時間中,整理了一下咱們本身的日誌方案python

需求

  1. 分爲內網和外網
  2. 分爲實時日誌和非實時日誌
  3. 實時日誌經過消息隊列通道傳到內網中,處理後存儲到ES中
  4. 非實時日誌上傳到騰訊雲OSS,而後同步到內網中,做爲後續的日誌分析,處理後存儲到ES和內網中CEPH對象存儲中

技術選型

系統 ubuntu18.04,其餘帶有rsyslog8.x的系統便可,沒有也能夠安裝一個docker

利用系統服務:rsyslog 8.4.20json

logstash 7.13.0ubuntu

elasticsearch 7.8.0vim

日誌格式咱們使用了服務器

HOSTNAME PROGRAME JSON字符串
複製代碼

爲何使用JSON字符串,確定方便後續的程序去處理它,雖然增長了一些空間。markdown

工做流程

程序寫rsyslog日誌 -> rsyslog轉發到logstash -> logstash對實時日誌和非實時日誌分流到消息隊列和對象存儲併發

一個簡單的日誌格式

data yq-data: {"type": "off-line", "time": "2021-06-23T07:03:55.122584Z", "msg": "I am a log message", "level": "DEBUG"}
複製代碼

配置rsyslog

vim /etc/rsyslog.confelasticsearch

增長下面配置高併發

local7.* @@logstash-host:5514
複製代碼

logstash-host:5514 爲logstash啓動syslog的IP和端口 local7爲rsyslog的facility

增長一個rsyslog的配置,在/etc/rsyslog.d下面

vim /etc/rsyslog.d/20-default.conf,填入下面內容

template(name="DynaFile" type="string" string="/var/log/%programname%/%programname%.log")

local7.* action(type="omfile" dynaFile="DynaFile")
複製代碼

配置完成後重啓systemctl restart rsyslog

什麼意思呢,就是從local7發過來的日誌,都會存儲到/var/log/日誌格式中的PROGRAME/日誌格式中的PROGRAME.log文件

爲何要這樣作呢?是爲了避免僅僅咱們將日誌發到logstash,還在咱們本地也存放一份,畢竟不能保證logstash徹底百分百分一直運轉,當他出錯的時候咱們能夠經過filebeats重新抽取一遍,或者直接丟給咱們的日誌程序去處理一下

python logging爲例

# address rsyslog的IP和端口
SysLogHandler(facility=SysLogHandler.LOG_LOCAL7, address=("172.16.102.227", 514))
複製代碼

再來配置logrotate

顧名思義,就是日誌輪轉,咱們配置天天輪轉,保存30天的日誌,具體的去看下logrotate的文檔就好了

vim /etc/logrotate/custom-log

/var/log/yq*/*.log
{
    rotate 30
    daily
    missingok
    notifempty
    delaycompress
    nocompress
    postrotate
        systemctl kill -s HUP rsyslog.service
    endscript
}
複製代碼

這裏爲何用yq*,由於項目太多了,因此咱們爲全部的項目定一個前綴,固然你也能夠本身處理它

配置 logstash

vim /etc/logstash/conf.d/my.conf

input {
    syslog {
        port => 5514
    }
}

filter {
    json {
        source => "message"
    }
    prune {
        whitelist_names => [ "msg", "logsource", "program", "time", "level", "type" ]
    }
    mutate {
        remove_field => ["@timestamp", "timestamp"]
    }
}

output {
    # 對於內網直接存儲到ES
    if [type] == "off-line" {
        elasticsearch {
            hosts => ["ES-HOST"]
            index => "my-log"
        }
    }
    # 對於外網直接存儲到騰訊雲OSS 同上面的二者取其一
    if [type] == "off-line" {
        s3 {
            endpoint => "https://cos.ap-nanjing.myqcloud.com"
            access_key_id => "xxxx"
            secret_access_key => "xxxx"
            region => "ap-nanjing"
            bucket => "xxxx"
            # 10分鐘
            time_file => 10
            codec => "json_lines"
            canned_acl => "public-read"
        }
    }
    
    if [type] == "real-time" {
        rabbitmq {
            exchange => "my-exchange"
            host => "localhost"
            exchange_type => "direct"
            key => "logstash"
            user => "admin"
            password => "admin"
        }
    }
    stdout {}
}
複製代碼

調試模式 /user/share/logstash/bin/logstash -f /etc/logstash/conf.d/my.conf

生產環境下 去掉stdout {}

systemctl restart logstash

docker遷移方案

以docker-compose爲例

logging:
    driver: "syslog"
    options:
        syslog-address: "udp://127.0.0.1:514"
        tag: yq-service-manager
        syslog-facility: local7
複製代碼

後續的

本身能夠從ES去查詢或分析日誌了。。。也能夠從kibana可視查看

一些想聊得

  • logstash沒必要每一個服務器都部署,平均多個節點,對應一個logstash節點就能夠了
  • rsyslog服務不要使用遠程host的方式,在高併發的日誌寫環境下,遠程syslog並不能很好的處理它,甚至會丟棄一些數據
  • 處理離線日誌時候可使用flink或者spark,

我用過得flink,在4核8G的一個服務器中,部署了一個10slot的集羣,平均處理速度在1k多條數據每秒,這個速度能夠隨着slot數量的提高而加快,在不考慮ES性能的狀況下。

相關文章
相關標籤/搜索