日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

目錄
  • 引言
  • 1. 搭建環境準備工作
    • 1.1 安裝ruby
    • 1.2 獲取fluentd源碼
    • 1.3 修改gem源
    • 1.4 安裝Bundle
    • 1.5 構建fluentd
    • 1.6 運行fluentd
  • 2. 安裝過程遇到的問題
    • 2.1 安裝bundler沒有zlib包
    • 2.2 沒有openssl
  • 3. 完成需求及修改配置
    • 需求1 日志存放路徑應用+日期劃分
    • 需求2 存放日志文件按文件大小進行切分
    • 需求3 按照日志等級劃分日志
    • 需求4 將目錄通過nginx映射出去
    • 需求5 生成一個定大小的日志文件,并能夠即時查看日志
  • 4. 遇到的問題
    • 問題描述
    • 解決方案

引言

公司需要搭建一個日志收集服務器,用于將公司的項目日志匯總到一臺服務器上面,方便查看和減輕各項目服務器壓力。但是由于目前資源不夠充足,所以放棄使用ELK、EFK。最后在調研嘗試過Linux自帶的Syslog和fluentd之后,Linux自帶的Syslog雖然更簡單,但是匯總的數據中會有亂碼的情況(懷疑是Appender問題),并且將日志信息組合成Json格式比較麻煩,因此選擇使用fluentd來做日志收集。

1. 搭建環境準備工作

選用fluentd來做日志收集選擇使用源碼來進行安裝,并且需要安裝一些依賴的插件,如Ruby等,下面依次介紹需要安裝的組件。

1.1 安裝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版本號,安裝成功

1.2 獲取fluentd源碼

從github上拉取fluentd源碼,github地址:fluentd

git clone https://github.com/fluent/fluentd.git
cd fluentd

1.3 修改gem源

先查看當前默認源

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

1.4 安裝Bundle

gem install bundler

等待提示安裝成功

1.5 構建fluentd

進入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

安裝完成

1.6 運行fluentd

[root@localhost fluentd]# fluentd --setup ./fluent
[root@localhost fluentd]# fluentd -c ./fluent/fluent.conf -vv &

最后在控制臺顯示fluentd讀取的配置文件信息并且打印相關日志。至此日志收集服務器所需要的fluentd已經搭建完成,接下來就是配置fluentd以完成日記收集功能。

2. 安裝過程遇到的問題

2.1 安裝bundler沒有zlib包

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成功了。

2.2 沒有openssl

錯誤描述: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 = ../..

3. 完成需求及修改配置

在上一節中完成了在日志服務器上單間fluentd,該日志收集服務器有五個需求,通過修改fluentd等配置文件來完成相關的需求。

需求1 日志存放路徑應用+日期劃分

修改配置文件,在 模塊中添加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

需求2 存放日志文件按文件大小進行切分

修改配置文件,在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

需求3 按照日志等級劃分日志

為方便查看各類等級日志的情況,需要在目錄中添加日志等級并將相應的日志放入。在不修改客戶端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日志...error\r\n","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>

需求4 將目錄通過nginx映射出去

在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;
        }
    }

需求5 生成一個定大小的日志文件,并能夠即時查看日志

需求是希望能夠在項目文件夾下生成一個日志文件,與前面的日志文件不同的是該日志是顯示當前日志內容,并且大小固定。由于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,可以自定義每日定時任務的執行時間。

4. 遇到的問題

問題描述

在所有都配置好后,使用 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 日志收集的資料請關注其它相關文章!

分享到:
標簽:搭建 收集 日志 服務 服務器
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定