<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
公司需要搭建一個紀錄檔收集伺服器,用於將公司的專案紀錄檔彙總到一臺伺服器上面,方便檢視和減輕各專案伺服器壓力。但是由於目前資源不夠充足,所以放棄使用ELK、EFK。最後在調研嘗試過Linux自帶的Syslog和fluentd之後,Linux自帶的Syslog雖然更簡單,但是彙總的資料中會有亂碼的情況(懷疑是Appender問題),並且將紀錄檔資訊組合成Json格式比較麻煩,因此選擇使用fluentd來做紀錄檔收集。
選用fluentd來做紀錄檔收集選擇使用原始碼來進行安裝,並且需要安裝一些依賴的外掛,如Ruby等,下面依次介紹需要安裝的元件。
下載ruby壓縮包 ruby-2.6.5.tar.gz,版本:2.6.5,並解壓
tar -zxvf ruby-2.6.5.tar.gz cd ruby-2.6.5
安裝ruby,安裝需要gcc
yum install -y gcc ./configure prefix=/export/source/ruby make && make install
安裝完成後修改系統組態檔 /etc/profile,在最後新增ruby目錄並加到path中
export RUBY_HOME=/export/source/ruby export PATH=$PATH:$JAVA_HOME/bin:$RUBY_HOME/bin
驗證是否安裝成功
[root@localhost ruby-2.6.5]# ruby -v ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
顯示ruby版本號,安裝成功
從github上拉取fluentd原始碼,github地址:fluentd
git clone https://github.com/fluent/fluentd.git cd fluentd
先檢視當前預設源
gem source *** CURRENT SOURCES *** https://rubygems.org/
移除預設源
gem sources -r https://rubygems.org/
新增源,目前可用的有ruby-china的源,新增ruby-china源
gem sources -a https://gems.ruby-china.com https://gems.ruby-china.com added to sources # 檢視當前源 gem source *** CURRENT SOURCES *** https://gems.ruby-china.com
更新快取
gem sources -u
gem install bundler
等待提示安裝成功
進入fluentd資料夾後,構建專案
[root@localhost fluentd]# bundle install Fetching gem... ... Bundle complete! 11 Gemfile dependencies, 37 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. [root@localhost fluentd]# bundle exec rake build fluentd 1.7.3 built to pkg/fluentd-1.7.3.gem. [root@localhost fluentd]# gem install pkg/fluentd-1.7.3.gem Successfully installed fluentd-1.7.3 Parsing documentation for fluentd-1.7.3 Installing ri documentation for fluentd-1.7.3 Done installing documentation for fluentd after 3 seconds 1 gem installed
安裝完成
[root@localhost fluentd]# fluentd --setup ./fluent [root@localhost fluentd]# fluentd -c ./fluent/fluent.conf -vv &
最後在控制檯顯示fluentd讀取的組態檔資訊並且列印相關紀錄檔。至此紀錄檔收集伺服器所需要的fluentd已經搭建完成,接下來就是設定fluentd以完成日記收集功能。
ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass
解決方案 安裝zlib-devel
yum -y install zlib-devel
進入ruby原始碼資料夾,安裝ruby自身提供的zlib包ruby-2.5.1/ext/zlib
cd ruby-2.6.5/ext/zlib ruby ./extconf.rb make make install
在make時會報錯
make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop.
修改目錄中Makefile檔案
zlib.o: $(top_srcdir)/include/ruby.h
改成
zlib.o: ../../include/ruby.h
到這裡就可以make成功了。
錯誤描述:cannot load such file -- openssl
/export/source/ruby/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- openssl (LoadError) 29: from /export/source/ruby/bin/gem:21:in `<main>' 28: from /export/source/ruby/lib/ruby/2.6.0/rubygems/gem_runner.rb:59:in `run' 27: from /export/source/ruby/lib/ruby/2.6.0/rubygems/command_manager.rb:148:in `run' 26: from /export/source/ruby/lib/ruby/2.6.0/rubygems/command_manager.rb:178:in `process_args' ... /export/source/ruby/lib/ruby/2.6.0/rubygems/request.rb:84:in `rescue in configure_connection_for_https': Unable to require openssl, install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources (Gem::Exception) 22: from /export/source/ruby/bin/gem:21:in `<main>' 21: from /export/source/ruby/lib/ruby/2.6.0/rubygems/gem_runner.rb:59:in `run' 20: from /export/source/ruby/lib/ruby/2.6.0/rubygems/command_manager.rb:148:in `run' 19: from /export/source/ruby/lib/ruby/2.6.0/rubygems/command_manager.rb:178:in `process_args' ...
解決方案
yum install openssl-devel -y
在ruby自身提供的額外資料夾中ruby-2.6.5/ext/openssl,執行ruby ./extconf.rb,再make
ruby ./extconf.rb make make install
make時出錯
make: *** No rule to make target `/include/ruby.h', needed by `ossl.o'. Stop.
修改Makefile檔案,在檔案頂部新增top_srcdir = ../..
在上一節中完成了在紀錄檔伺服器上單間fluentd,該紀錄檔收集伺服器有五個需求,通過修改fluentd等組態檔來完成相關的需求。
修改組態檔,在 模組中新增path屬性,如果需要將匹配相同的tag輸出到不同檔案中則需要將 的@type設定為copy,然後再 塊中新增 塊並在 中新增path屬性。
在path屬性中可以讀取過濾的tag,tag的格式為logback組態檔中的.,因此可以將應用名設定在logback組態檔中,然後再fluentd.conf中進行讀取。在path中通過${tag}預留位置讀取使用者端傳送的tag,tag屬性可以根據.切分為陣列,例如tag為test.demo時,tag[0]表示test,tag[1]表示demo。對於時間的設定可直接在path路徑中設定,並且在buffer塊加上time及timekey設定,組態檔如下:
<store> @type file @id demo path /data/log/${tag[3]}/${tag[4]}/%Y-%m-%d/${tag[4]} symlink_path /data/tmp/${tag[3]}_${tag[4]}_data.log append false time_slice_wait 10m time_slice_format %Y%m%d <buffer tag, time> flush_mode interval flush_interval 30s chunk_limit_size 5MB timekey 1d </buffer> </store>
最後得到的目錄如下
├── [ 21] dab │ └── [ 56] logdemo │ ├── [4.0K] 2019-10-14 │ │ ├── [3.2M] logdemo.20191014_0.log │ │ ├── [3.2M] logdemo.20191014_1.log │ │ ├── [3.5M] logdemo.20191014_2.log │ │ ├── [3.9M] logdemo.20191014_3.log │ │ ├── [4.3M] logdemo.20191014_4.log │ │ ├── [4.2M] logdemo.20191014_5.log ├── [ 27] sms │ └── [ 62] opapplication │ ├── [ 114] 2019-10-14 │ │ ├── [2.5M] opapplication.20191014_0.log │ │ ├── [4.3M] opapplication.20191014_1.log
修改組態檔,在match塊中新增buffer塊設定,設定內容如下
<match level.com.zhy.**> @type file @id demo path /data/log/${tag[3]}/${tag[4]}/%Y-%m-%d/${tag[5]}/${tag[4]}_${tag[5]} symlink_path /data/tmp/${tag[3]}_${tag[4]}_data.log # 不追加紀錄檔檔案 append false <buffer tag, time> # 重新整理模式 flush_mode interval # 重新整理週期 flush_interval 10s # 塊大小限制 chunk_limit_size 5MB timekey 1d </buffer> </store> </match>
將buffer重新整理模式修改為interval按固定時間間隔重新整理,並且設定重新整理的週期以及不追加檔案。這樣當buffer有內容時,每過10s將紀錄檔檔案儲存一次,或者當buffer塊達到5MB就立即存一次,保證每個紀錄檔檔案的大小都保證在5MB以內。生成的紀錄檔目錄結構如下:
. ├── [ 21] dab │ └── [ 56] logdemo │ ├── [4.0K] 2019-10-14 │ │ ├── [3.2M] logdemo.20191014_0.log │ │ ├── [1.7M] logdemo.20191014_10.log │ │ ├── [1.9M] logdemo.20191014_11.log │ │ ├── [3.2M] logdemo.20191014_1.log │ │ ├── [3.5M] logdemo.20191014_2.log │ │ ├── [3.9M] logdemo.20191014_3.log │ │ ├── [4.3M] logdemo.20191014_4.log │ │ ├── [4.2M] logdemo.20191014_5.log │ │ ├── [4.5M] logdemo.20191014_6.log │ │ ├── [4.8M] logdemo.20191014_7.log │ │ ├── [4.8M] logdemo.20191014_8.log
為方便檢視各類等級紀錄檔的情況,需要在目錄中新增紀錄檔等級並將相應的紀錄檔放入。在不修改使用者端tag情況下,在fluentd伺服器端重新生成tag以包含紀錄檔等級,此時需要 rewrite_tag_filter 外掛來完成重置tag。在使用外掛前需要安裝該外掛
[root@localhost fluentd]$ fluent-gem install fluent-plugin-rewrite-tag-filter Fetching fluent-plugin-rewrite-tag-filter-2.2.0.gem Fetching fluent-config-regexp-type-1.0.0.gem Successfully installed fluent-config-regexp-type-1.0.0 Successfully installed fluent-plugin-rewrite-tag-filter-2.2.0 Parsing documentation for fluent-config-regexp-type-1.0.0 Installing ri documentation for fluent-config-regexp-type-1.0.0 Parsing documentation for fluent-plugin-rewrite-tag-filter-2.2.0 Installing ri documentation for fluent-plugin-rewrite-tag-filter-2.2.0 Done installing documentation for fluent-config-regexp-type, fluent-plugin-rewrite-tag-filter after 0 seconds 2 gems installed
然後在fluent.conf組態檔中設定
<match com.zhy.**> @type rewrite_tag_filter <rule> key msg pattern ^[(w+)] tag level.${tag}.$1 </rule> </match>
原來的輸入紀錄檔格式如下
2019-10-14 14:44:09.000000000 +0800 com.zhy.sms.opapplication: {"msg":"[ERROR] 這是error紀錄檔...errorrn","level":"ERROR","logger":"com.sk.controller.LogController","thread":"pool-3-thread-397","message":"這是error紀錄檔...error"}
在紀錄檔資訊中msg、level對應的值都包含紀錄檔等級,因此可以從鍵msg、level中選出紀錄檔等級來組成新的tag,這裡選則提取msg對應的value中的紀錄檔等級。組態檔中的pattern屬性所寫正規表示式就是用來匹配msg中[]中的值的,然後再tag上將取出來的紀錄檔等級通過$1放到原來tag的最後面。
注意:如果match上的匹配規則和修改後的tag能夠對應,則會一直進行匹配,從而導致修改tag失敗,如下
<match com.zhy.**> @type rewrite_tag_filter <rule> key msg pattern ^[(w+)] tag ${tag}.$1 </rule> </match>
此時修改後的tag仍然是以com.zhy開頭,所以會導致修改失敗,所以在新的tag前加上level字首,level可自定義
<match com.zhy.**> @type rewrite_tag_filter <rule> key msg pattern ^[(w+)] tag level.${tag}.$1 </rule> </match>
在nginx組態檔中增加server設定,在server中新增root屬性,設定對映到伺服器根目錄下的/data目錄中,location屬性分為兩步第一步開啟檔案瀏覽,第二步設定在瀏覽器文字格式顯示檔案內容
location /log { autoindex on; }
通過autoindex來開啟檔案瀏覽功能,設定使用者端瀏覽路徑為/log
location ^/log/.*.log$ { add_header Content-Type text/plain; }
首先通過正規表示式匹配瀏覽路徑,匹配規則以/log開頭並且以.log結尾的檔案,然後設定Content-Type為text/plain,在瀏覽器便可直接瀏覽紀錄檔內容,如果不設定將會彈出下載視窗進行下載,並且需要清理瀏覽器的快取
server { listen 8002; autoindex_exact_size off; charset utf-8; autoindex_localtime on; root /data; location /log { autoindex on; } location ^/log/.*.log$ { add_header Content-Type text/plain; } }
需求是希望能夠在專案資料夾下生成一個紀錄檔檔案,與前面的紀錄檔檔案不同的是該紀錄檔是顯示當前紀錄檔內容,並且大小固定。由於fluentd的append生成的檔案雖然能夠追加到一個檔案中,但是不能夠固定大小,紀錄檔大小會無限膨脹。通過查閱資料,最後選擇使用linux自帶的紀錄檔轉存工具 logrotate 來實現這需求。
由於目前linux都會自帶logrotate,所以不需要安裝,比較便捷。並且logrotate在github的更新還是比較活躍的。github地址:logrotate
1.修改設定
在使用logrotate之前,先修改fluentd設定,使其在每個專案中生成一個對應的即時紀錄檔檔案。在 match 塊中新增一個 store 塊。
<store> @type file @id ImmediateLog path /data/log/${tag[3]}/${tag[4]}/${tag[4]}_immediate append true <buffer tag> path /data/tmp/${tag[3]}/${tag[4]}/${tag[4]}_immediate flush_mode interval flush_interval 5s </buffer> </store>
設定中主要是在對應專案資料夾下生成一個名為 appname_immediate.log 的紀錄檔檔案,並且該紀錄檔檔案用append追加內容,選擇以5s為週期性重新整理,由於是即時紀錄檔檔案,所以重新整理頻率高。之所以不用immediate模式是因為考慮的伺服器負載,如果立即重新整理的話可能會造成負載較高,所以選用延遲幾秒來追加紀錄檔內容
然後修改logrotate組態檔,器組態檔在 /etc/logrotate.conf 中,但是在該組態檔中不方便管理,因此可以自己寫一個組態檔,儲存到 /etc/logrotate.d 目錄中,在該目錄中已經儲存有幾個自帶的logrotate設定。這裡我們新建一個組態檔,命名 applog ,並在檔案中新增設定項:
/data/log/*/*/*_immediate.log { daily # 每天執行 rotate 3 # 轉存檔案最多三個 size 10M # 當待轉存檔案大於10MB時才轉存 compress # 壓縮轉存檔案 copytruncate # 複製轉存檔案並且清空原檔案 }
logrotate組態檔中第一行表示在設定轉存檔案的路徑,這裡轉存的是在/data/log目錄下的所有以_immediate.log結尾的檔案,路徑設定可以使用萬用字元。其餘設定見註釋,這裡主要的作用時每天轉存一次紀錄檔檔案,當檔案大小超過10MB時轉存,並且進行壓縮,轉存檔案最多存在3個。其餘設定參考官網:logrotate設定詳解
在完成設定後,可以通過命令檢視組態檔是否正確
# -d:debug模式,校驗組態檔 logrotate -d /etc/logrotate.conf
執行後會在控制檯顯示所讀取組態檔、轉存資訊等。如果想看實際效果,將命令中的-d變為-f強制執行。執行-f命令後會在應用對應的immediate.log目錄中生成一個以日期結尾的壓縮檔案,並且原來的紀錄檔檔案被清空。這時logrotate設定完成。
2.logrotate執行時間
logrotate是通過cron定時任務執行的,檢視cron組態檔可以看到定時任務的執行時間,CentOS使用的是anacron,組態檔在 /etc/anacrontab 中
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
組態檔中 START_HOURS_RANGE=3-22 表示定時任務開始時間,預設是在3點到22點之間, RANDOM_DELAY=45 表示啟動任務後的最大隨機延遲時間,預設最大延遲45分鐘執行。最後三行是對於不同的定時任務設定,在cron.daily行就是定義每天的定時任務執行方式,每天一次,並且強制延遲5分鐘執行,所以預設設定一般會在凌晨三點過執行。
在這裡修改START_HOURS_RANGE、RANDOM_DELAY以及cron.daily的delay,可以自定義每日定時任務的執行時間。
在所有都設定好後,使用 logrotate -d 不報錯,手動執行 logrotate -f 也能夠生成轉存檔案,但是轉存檔案卻不能按照設定每天自動生成。
檢視cron紀錄檔(cron紀錄檔地址:/var/log/cron)發現每天的定時任務都會執行
Oct 16 3:00:47 localhost anacron[24471]: Job `cron.daily' started Oct 16 3:00:47 localhost run-parts(/etc/cron.daily)[24475]: starting logrotate Oct 16 3:00:50 localhost run-parts(/etc/cron.daily)[24484]: finished logrotate Oct 16 3:00:50 localhost run-parts(/etc/cron.daily)[24475]: starting man-db.cron Oct 16 3:00:51 localhost run-parts(/etc/cron.daily)[24495]: finished man-db.cron Oct 16 3:00:51 localhost anacron[24471]: Job `cron.daily' terminated
但是沒有生成轉存檔案。
出現該問題是由於selinux的安全策略導致的,只需要給轉存紀錄檔所在的目錄增加安全上下文 var_log_t 即可
chcon -Rv --type=var_log_t /data/log
執行上面命令會對/data/log目錄中的所有檔案新增安全上下文。之後再觀察轉存檔案便能夠成功生成。
以上就是Fluentd搭建紀錄檔收集服務的詳細內容,更多關於Fluentd 紀錄檔收集的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45