最近因公司項目增多,且環境也越來複雜,開發人員找我查看錯誤日誌愈來愈頻繁,內心便念想到ELK,心之所想,念之所達,快來get一項新技能吧php
- laravel日誌:日誌源經過filebeat將日誌寫進redis中間件
- logstsh:logstash經過input將redis數據拿來分析,經過其filter模塊分析所須要的語句,而後輸出到elasticsearch 3.elasticsearch 接收logstash發送過來的數據,並提供了一個分佈式多用戶能力的全文搜索引擎
- Kibana是一個優秀的前端日誌展現框架,它能夠很是詳細的將日誌轉化爲各類圖表,爲用戶提供強大的數據可視化支持。
laravel: 172.18.109.227
redis: 172.18.215.207
elasticsearch: 172.18.215.207
kibana: 172.18.215.207
複製代碼
[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
複製代碼
yum install filebeat
複製代碼
...
#寫入源
- input_type: log
paths:
- /var/www/html/*/storage/logs/laravel-2018-12-29.log
...
#輸出至redis
output.redis:
# Array of hosts to connect to.
hosts: ["172.18.215.207:6379"]
password: "***********"
db: 0
timeout: 5
key: "php-01"
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
複製代碼
yum install redis
複製代碼
...
# bind 192.168.1.100 10.0.0.1
bind 172.18.215.207
# bind 127.0.0.1 ::1
#
...
# are explicitly listed using the "bind" directive.
protected-mode yes
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511
...
# use a very strong password otherwise it will be very easy to break.
#
requirepass ***********
# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it
複製代碼
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
複製代碼
#
# Where to fetch the pipeline configuration for the main pipeline
#
path.config: /etc/logstash/conf.d
#
# Pipeline configuration string for the main pipeline
#
# config.string:
#
...
path.config: /etc/logstash/conf.d
#
...
http.host: "127.0.0.1"
#
# Bind port for the metrics REST endpoint, this option also accept a range
# (9600-9700) and logstash will pick up the first available ports.
#
# http.port: 9600-9700
#
# ------------ Debugging Settings --------------
#
# Options for log.level:
# * fatal
# * error
# * warn
# * info (default)
# * debug
# * trace
#
# log.level: info
path.logs: /var/log/logstash
#
...
vim /etc/logstash/conf.d/nginx.conf
# 從redis將數據取出
input {
redis {
type => "php-01"
host => "172.18.215.207"
port => "6379"
db => "0"
password => "*************"
data_type => "list"
key => "php-01"
}
}
# 格式化laravel日誌
filter {
grok {
match => [ "message","\[%{TIMESTAMP_ISO8601:logtime}\] %{WORD:env}\.(?<level>[A-Z]{4,5})\: %{GREEDYDATA:msg}}" ]
}
}
output {
#過濾level爲ERROR的日誌
if [level] == "ERROR" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "laravellog"
user => "elastic"
password => "changeme"
}
}
}
複製代碼
laravel的實例日誌爲html
[2019-01-02 09:58:00] produce.INFO: {"code":200,"message":"成功","data":{"code":"1000","message":"成功"}}
[2019-01-02 10:00:03] produce.INFO: 不能充值的緣由帳戶金額不夠
[2019-01-02 10:00:03] produce.INFO: 不能充值的緣由帳戶金額不夠
[2019-01-02 10:00:03] produce.INFO: 不能充值的緣由帳戶金額不夠
[2019-01-02 10:00:34] produce.ERROR: cannot find user by this audience {"exception":"[object] (JPush\\Exceptions\\APIRequestException(code: 1011): cannot find user by this audience at /var/www/html/enjoyCarTask/vendor/jpush/jpush/src/JPush/Http.php:123) [stacktrace] #0 /var/www/html/enjoyCarTask/vendor/jpush/jpush/src/JPush/Http.php(16): JPush\\Http::processResp(Array) #1 /var/www/html/enjoyCarTask/vendor/jpush/jpush/src/JPush/PushPayload.php(537): JPush\\Http::post(Object(JPush\\Client), 'https://api.jpu...', '{\"platform\":\"al...') #2 /var/www/html/enjoyCarTask/vendor/ucar/push/Push/Jobs/JPush.php(89): JPush\\PushPayload->send() #3 [internal function]: Ucar\\Push\\Jobs\\JPush->handle(Object(JPush\\Client)) #4 /var/www/html/enjoyCarTask/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): call_user_func_array(Array, Array) #5 /var/www/html/enjoyCarTask/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}() #6 /var/www/html/enjoyCarTask/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure)) #7 /var/www/html/enjoyCarTask/vendor/laravel/framework/src/Illuminate/Container/Container.php(564): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL) 複製代碼
注意:咱們只想把ERROR的信息提取出來,因此logstash的配置文件中把level 爲ERROR的篩選了出來前端
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
複製代碼
yum install -y elasticsearch
複製代碼
chown -R elasticsearch:elasticsearch /data/es-data
chown -R elasticsearch:elasticsearch /var/log/elstic
vim /etc/elasticsearch/elasticsearch.yml
#
# Use a descriptive name for the node:
#
node.name: Elstic
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
# 數據路徑
path.data: /data/es-data
#
# Path to log files:
#日誌路徑
path.logs: /var/log/elstic
...
# 監聽地址,設置爲127,只保持本機訪問
network.host: 127.0.0.1
#
# Set a custom port for HTTP:
#
# 監聽的端口
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
複製代碼
vim /etc/kibana/kibana.ym
# Kibana is served by a back end server. This setting specifies the port to use.
# 監聽的端口
server.port: 5601
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
# 監聽地址,使用內網地址,而後用nginx反代
server.host: "127.0.0.1"
# Enables you to specify a path to mount Kibana at if you are running behind a proxy. This only affects
# the URLs generated by Kibana, your proxy is expected to remove the basePath value before forwarding requests
# to Kibana. This setting cannot end in a slash.
#server.basePath: ""
# The maximum payload size in bytes for incoming server requests.
#server.maxPayloadBytes: 1048576
# The Kibana server's name. This is used for display purposes.
#server.name: "your-hostname"
# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://localhost:9200"
# When this setting's value is true Kibana uses the hostname specified in the server.host
# setting. When the value of this setting is false, Kibana uses the hostname of the host
# that connects to this Kibana instance.
#elasticsearch.preserveHost: true
# Kibana uses an index in Elasticsearch to store saved searches, visualizations and
# dashboards. Kibana creates a new index if the index doesn't already exist.
#kibana.index: ".kibana"
# The default application to load.
....
複製代碼
$ cat /etc/nginx/conf.d/elk.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name *********;
ssl on;
ssl_certificate "**************";
ssl_certificate_key "/usr/local/certificate/************";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
#ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherli.st/ #
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
########################################################################
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
##################################
# 這裏是反向代理到kibana服務 走http協議
location / {
proxy_pass http://127.0.0.1:5601;
}
}
#配置80端口重寫443端口
server {
listen 80;
server_name *********;
rewrite ^/(.*)$ https://*********/$1;
}
複製代碼
喜歡我寫的東西的朋友能夠關注一下個人公衆號:Devops部落node