在公司的一週時間中,整理了一下咱們本身的日誌方案python
系統 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.conf
elasticsearch
增長下面配置高併發
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-compose爲例
logging:
driver: "syslog"
options:
syslog-address: "udp://127.0.0.1:514"
tag: yq-service-manager
syslog-facility: local7
複製代碼
本身能夠從ES去查詢或分析日誌了。。。也能夠從kibana可視查看
我用過得flink,在4核8G的一個服務器中,部署了一個10slot的集羣,平均處理速度在1k多條數據每秒,這個速度能夠隨着slot數量的提高而加快,在不考慮ES性能的狀況下。