日誌服務管理

日誌服務管理

系統日誌介紹

rsyslog 系統日誌服務

  • Centos 6 以後版本的系統管理服務
    • rsyslog特性
      • 多線程
      • UDP, TCP, SSL, TLS, RELP
      • MySQL, PGSQL, Oracle實現日誌存儲
      • 強大的過濾器,可實現過濾記錄日誌信息中任意部分
      • 自定義輸出格式

ELK

  • ELK:由Elasticsearch, Logstash, Kibana三個軟件組成
    • 非關係型分佈式數據庫
    • 基於apache軟件基金會jakarta項目組的項目lucene
    • Elasticsearch是個開源分佈式搜索引擎,可以處理大規模日誌數據,比如:Nginx、Tomcat、系
    • 統日誌等功能
    • Logstash對日誌進行收集、分析,過濾,並將其存儲供以後使用
    • Kibana 可以提供的日誌分析友好的 Web 界面

rsyslog 管理

  • 系統日誌術語

    • facility:設施,從功能或程序上對日誌進行歸類
    • auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-
    • local7, syslog
    • Priority 優先級別,從低到高排序
    • debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
    • 參看幫助: man 3 syslog,man logger
  • rsyslog 相關文件

    • 程序包:rsyslog
    • 主程序:/usr/sbin/rsyslogd
    • CentOS 6:/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
    • CentOS 7,8:/usr/lib/systemd/system/rsyslog.service
    • 配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
    • 庫文件: /lib64/rsyslog/*.so
  • rsyslog配置文件(由三部分組成)

    • MODULES:相關模塊配置
    • GLOBAL DIRECTIVES:全局配置
    • RULES:日誌記錄相關的規則配置

RULES配置格式:

facility.priority; facility.priority… target

facility格式:

* #所有的facility
facility1,facility2,facility3,... #指定的facility列表

priority格式:

*: 所有級別
none:沒有級別,即不記錄
PRIORITY:指定級別(含)以上的所有級別
=PRIORITY:僅記錄指定級別的日誌信息

target格式:

文件路徑:通常在/var/log/,文件路徑前的-表示異步寫入
用戶:將日誌事件通知給指定的用戶,* 表示登錄的所有用戶
日誌服務器:@host,把日誌送往至指定的遠程UDP日誌服務器 @@host 將日誌發送到遠程TCP日誌服務器
管道: | COMMAND,轉發給其它命令處理

通常的日誌文件的格式:

日誌文件有很多,如: /var/log/messages,cron,secure等,基本格式都是類似的。
格式如下:
事件產生的日期時間 主機 進程(pid):事件內容
  • 範例:日誌文件格式
[root@centos8 ~]#tail /var/log/messages
Nov 12 08:34:18 centos8 dnf[14114]: Metadata cache created.
Nov 12 08:34:18 centos8 systemd[1]: Started dnf makecache.
Nov 12 09:35:14 centos8 systemd[1]: Starting dnf makecache...
Nov 12 09:35:14 centos8 dnf[14249]: Metadata cache refreshed recently.
Nov 12 09:35:14 centos8 systemd[1]: Started dnf makecache.
Nov 12 10:21:22 centos8 systemd[1]: Starting man-db-cache-update.service...
Nov 12 10:21:22 centos8 systemd[1]: Reloading.
Nov 12 10:21:22 centos8 systemd[1]: Started man-db-cache-update.service.
[root@centos8 ~]#tail /var/log/secure
Nov 11 18:27:12 centos8 groupadd[11940]: group added to /etc/group: name=dhcpd,
GID=177
Nov 11 18:27:12 centos8 groupadd[11940]: group added to /etc/gshadow: name=dhcpd
Nov 11 18:27:12 centos8 groupadd[11940]: new group: name=dhcpd, GID=177
Nov 11 18:27:12 centos8 useradd[11948]: new user: name=dhcpd, UID=177, GID=177,
home=/, shell=/sbin/nologin
  • 範例:將ssh服務的日誌記錄至自定義的local的日誌設備
#修改sshd服務的配置
Vim /etc/ssh/sshd_config
SyslogFacility local2
Service sshd reload
#修改rsyslog的配置
Vim /etc/rsyslog.conf
Local2.* /var/log/sshd.log
Systemctl restart rsyslog
#測試
Ssh登錄後,查看/var/log/sshd.log有記錄
#logger測試
logger -p local2.info "hello

啓用網絡日誌服務

  • 啓用網絡日誌服務功能,可以將多個遠程主機的日誌,發送到集中的日誌服務器,方便統一管理。
    範例:CentOS 8 啓用網絡日誌功能
[root@centos8 ~]#vim /etc/rsyslog.conf
#### MODULES ####
...省略...
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
  • 範例:CentOS 7 和6 啓用網絡日誌功能
####MODULES####
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

常見日誌文件

  • /var/log/secure:系統安裝日誌,文本格式,應週期性分析

  • /var/log/btmp:當前系統上,用戶的失敗嘗試登錄相關的日誌信息,二進制格式,lastb命令進行查看

  • /var/log/wtmp:當前系統上,用戶正常登錄系統的相關日誌信息,二進制格式,last命令可以查看

  • /var/log/lastlog:每一個用戶最近一次的登錄信息,二進制格式,lastlog命令可以查看

  • /var/log/dmesg:CentOS7 之前版本系統引導過程中的日誌信息,文本格式,開機後的硬件變化
    將不再記錄

  • 專用命令dmesg查看,可持續記錄硬件變化的情況

  • /var/log/boot.log 系統服務啓動的相關信息,文本格式

  • /var/log/messages :系統中大部分的信息

  • /var/log/anaconda : anaconda的日誌

  • 範例:找到失敗登錄的IP

[root@centos8 ~]#awk '/Failed password/{print $(NF-3)}' /var/log/secure
192.168.39.7
192.168.39.18
192.168.39.18
  • 範例:找出失敗登錄次數最多的前10個IP
[root@centos8 ~]#lastb -f btmp-34 | awk '{ip[$3]++}END{for(i in ip){print
ip[i],i}}'|sort -nr|head
86294 58.218.92.37
43148 58.218.92.26
18036 112.85.42.201
10501 111.26.195.101
10501 111.231.235.49
10501 111.204.186.207
10501 111.11.29.199
10499 118.26.23.225
6288 42.7.26.142
4236 58.218.92.30

日誌管理工具journalctl

  • Centos 7 以後版,利用Systemd 統一管理所有 Unit 的啓動日誌。帶來的好處就是,可以只用
    journalctl一個命令,查看所有日誌(內核日誌和應用日誌)。
  • 日誌的配置文件:
/etc/systemd/journald.conf
  • journalctl命令格式
journalctl [OPTIONS...] [MATCHES...]
  • 選項說明
--no-full, --full, -l
如果字段內容超長則以省略號(...)截斷以適應列寬。
默認顯示完整的字段內容(超長的部分換行顯示或者被分頁工具截斷)。
老舊的 -l/--full 選項 僅用於撤銷已有的 --no-full 選項,除此之外沒有其他用處。

-a, --all
完整顯示所有字段內容, 即使其中包含不可打印字符或者字段內容超長。

-f, --follow
只顯示最新的日誌項,並且不斷顯示新生成的日誌項。 此選項隱含了 -n 選項。

-e, --pager-end
在分頁工具內立即跳轉到日誌的尾部。 此選項隱含了 -n1000
以確保分頁工具不必緩存太多的日誌行。 不過這個隱含的行數可以被明確設置的 -n
選項覆蓋。 注意,此選項僅可用於 less(1) 分頁器。

-n, --lines=
限制顯示最新的日誌行數。 --pager-end 與 --follow 隱含了此選項。
此選項的參數:若爲正整數則表示最大行數; 若爲 "all" 則表示不限制行數;
若不設參數則表示默認值10行。

--no-tail
顯示所有日誌行, 也就是用於撤銷已有的 --lines= 選項(即使與 -f 連用)-r, --reverse
反轉日誌行的輸出順序, 也就是最先顯示最新的日誌。

-o, --output=
控制日誌的輸出格式。 可以使用如下選項:
short
這是默認值, 其輸出格式與傳統的 syslog[1] 文件的格式相似, 每條日誌一行。
short-iso
與 short 類似,只是將時間戳字段以 ISO 8601 格式顯示。
short-precise
與 short 類似,只是將時間戳字段的秒數精確到微秒級別。
short-monotonic
與 short 類似,只是將時間戳字段的零值從內核啓動時開始計算。
short-unix
與 short 類似,只是將時間戳字段顯示爲從"UNIX時間原點"(1970-1-1 00:00:00
UTC)以來的秒數。 精確到微秒級別。
verbose
以結構化的格式顯示每條日誌的所有字段。
export
將日誌序列化爲二進制字節流(大部分依然是文本) 以適用於備份與網絡傳輸(詳見
Journal Export Format[2] 文檔)。
json
將日誌項按照JSON數據結構格式化, 每條日誌一行(詳見 Journal JSON Format[3]
文檔)。
json-pretty
將日誌項按照JSON數據結構格式化, 但是每個字段一行, 以便於人類閱讀。
json-sse
將日誌項按照JSON數據結構格式化,每條日誌一行,但是用大括號包圍, 以適應
Server-Sent Events[4] 的要求。
cat
僅顯示日誌的實際內容, 而不顯示與此日誌相關的任何元數據(包括時間戳)--utc
以世界統一時間(UTC)表示時間

--no-hostname
不顯示來源於本機的日誌消息的主機名字段。 此選項僅對 short
系列輸出格式(見上文)有效。

-x, --catalog
在日誌的輸出中增加一些解釋性的短文本, 以幫助進一步說明日誌的含義、
問題的解決方案、支持論壇、 開發文檔、以及其他任何內容。
並非所有日誌都有這些額外的幫助文本, 詳見 Message Catalog Developer
Documentation[5] 文檔。
注意,如果要將日誌輸出用於bug報告, 請不要使用此選項。

-q, --quiet
當以普通用戶身份運行時, 不顯示任何警告信息與提示信息。 例如:"-- Logs begin at
...", "-- Reboot --"
-m, --merge
混合顯示包括遠程日誌在內的所有可見日誌。

-b [ID][±offset], --boot=[ID][±offset]
顯示特定於某次啓動的日誌, 這相當於添加了一個 "_BOOT_ID=" 匹配條件。
如果參數爲空(也就是 ID 與 ±offset 都未指定), 則表示僅顯示本次啓動的日誌。
如果省略了 ID , 那麼當 ±offset 是正數的時候, 將從日誌頭開始正向查找,
否則(也就是爲負數或零)將從日誌尾開始反響查找。 舉例來說, "-b
1"表示按時間順序排列最早的那次啓動, "-b 2"則表示在時間上第二早的那次啓動; "-b
-0"表示最後一次啓動, "-b -1"表示在時間上第二近的那次啓動, 以此類推。 如果
±offset 也省略了, 那麼相當於"-b -0", 除非本次啓動不是最後一次啓動(例如用
--directory 指定了另外一臺主機上的日誌目錄)。
如果指定了32字符的 ID , 那麼表示以此 ID 所代表的那次啓動爲基準
計算偏移量(±offset), 計算方法同上。 換句話說, 省略 ID 表示以本次啓動爲基準
計算偏移量(±offset)--list-boots
列出每次啓動的 序號(也就是相對於本次啓動的偏移量)32字符的ID、
第一條日誌的時間戳、最後一條日誌的時間戳。

-k, --dmesg
僅顯示內核日誌。隱含了 -b 選項以及 "_TRANSPORT=kernel" 匹配項。

-t, --identifier=SYSLOG_IDENTIFIER
僅顯示 syslog[1] 識別符爲 SYSLOG_IDENTIFIER 的日誌項。
可以多次使用該選項以指定多個識別符。

-u, --unit=UNIT|PATTERN
僅顯示屬於特定單元的日誌。 也就是單元名稱正好等於 UNIT 或者符合 PATTERN
模式的單元。 這相當於添加了一個 "_SYSTEMD_UNIT=UNIT" 匹配項(對於 UNIT 來說),
或一組匹配項(對於 PATTERN 來說)。
可以多次使用此選項以添加多個並列的匹配條件(相當於用"OR"邏輯連接)--user-unit=
僅顯示屬於特定用戶會話單元的日誌。 相當於同時添加了 "_SYSTEMD_USER_UNIT=""_UID=" 兩個匹配條件。
可以多次使用此選項以添加多個並列的匹配條件(相當於用"OR"邏輯連接)-p, --priority=
根據日誌等級(包括等級範圍)過濾輸出結果。 日誌等級數字與其名稱之間的對應關係如下
(參見 syslog(3))"emerg" (0), "alert" (1), "crit" (2), "err" (3),
"warning" (4), "notice" (5), "info" (6), "debug" (7) 。
若設爲一個單獨的數字或日誌等級名稱, 則表示僅顯示小於或等於此等級的日誌
(也就是重要程度等於或高於此等級的日誌)。 若使用 FROM..TO.. 設置一個範圍,
則表示僅顯示指定的等級範圍內(含兩端)的日誌。 此選項相當於添加了 "PRIORITY="
匹配條件。

-c, --cursor=
從指定的遊標(cursor)開始顯示日誌。
[提示]每條日誌都有一個"__CURSOR"字段,類似於該條日誌的指紋。

--after-cursor=
從指定的遊標(cursor)之後開始顯示日誌。 如果使用了 --show-cursor 選項,
則也會顯示遊標本身。

--show-cursor
在最後一條日誌之後顯示遊標, 類似下面這樣,以"--"開頭:

-- cursor: s=0639...
遊標的具體格式是私有的(也就是沒有公開的規範), 並且會變化。

-S, --since=, -U, --until=
顯示晚於指定時間(--since=)的日誌、顯示早於指定時間(--until=)的日誌。
參數的格式類似 "2012-10-30 18:17:16" 這樣。 如果省略了"時:分:秒"部分,
則相當於設爲 "00:00:00" 。 如果僅省略了"秒"的部分則相當於設爲 ":00" 。
如果省略了"年-月-日"部分, 則相當於設爲當前日期。 除了"年-月-日 時:分:秒"格式,
參數還可以進行如下設置: (1)設爲 "yesterday", "today", "tomorrow"
以表示那一天的零點(00:00:00)(2)設爲 "now" 以表示當前時間。
(3)可以在"年-月-日 時:分:秒"前加上 "-"(前移)"+"(後移)
前綴以表示相對於當前時間的偏移。 關於時間與日期的詳細規範, 參見
systemd.time(7)

-F, --field=
顯示所有日誌中某個字段的所有可能值。 [譯者注]類似於SQL語句:"SELECT DISTINCT
某字段 FROM 全部日誌"

-N, --fields
輸出所有日誌字段的名稱
--system, --user
僅顯示系統服務與內核的日誌(--system)、 僅顯示當前用戶的日誌(--user)。
如果兩個選項都未指定,則顯示當前用戶的所有可見日誌。

-M, --machine=
顯示來自於正在運行的、特定名稱的本地容器的日誌。 參數必須是一個本地容器的名稱。

-D DIR, --directory=DIR
僅顯示來自於特定目錄中的日誌, 而不是默認的運行時和系統日誌目錄中的日誌。

--file=GLOB
GLOB 是一個可以包含"?""*"的文件路徑匹配模式。 表示僅顯示來自與指定的 GLOB
模式匹配的文件中的日誌, 而不是默認的運行時和系統日誌目錄中的日誌。
可以多次使用此選項以指定多個匹配模式(多個模式之間用"OR"邏輯連接)--root=ROOT
在對日誌進行操作時, 將 ROOT 視爲系統的根目錄。 例如 --update-catalog 將會創建
ROOT/var/lib/systemd/catalog/database

--new-id128
此選項並不用於顯示日誌內容, 而是用於重新生成一個標識日誌分類的 128-bit ID 。
此選項的目的在於 幫助開發者生成易於辨別的日誌消息, 以方便調試。

--header
此選項並不用於顯示日誌內容, 而是用於顯示日誌文件內部的頭信息(類似於元數據)--disk-usage
此選項並不用於顯示日誌內容,
而是用於顯示所有日誌文件(歸檔文件與活動文件)的磁盤佔用總量。

--vacuum-size=, --vacuum-time=, --vacuum-files=
這些選項並不用於顯示日誌內容,
而是用於清理日誌歸檔文件(並不清理活動的日誌文件), 以釋放磁盤空間。
--vacuum-size= 可用於限制歸檔文件的最大磁盤使用量 (可以使用 "K", "M", "G", "T"
後綴)--vacuum-time= 可用於清除指定時間之前的歸檔 (可以使用 "s", "m", "h",
"days", "weeks", "months", "years" 後綴)--vacuum-files=
可用於限制日誌歸檔文件的最大數量。 注意,--vacuum-size=--disk-usage
的輸出僅有間接效果, 因爲 --disk-usage 輸出的是歸檔日誌與活動日誌的總量。
同樣,--vacuum-files= 也未必一定會減少日誌文件的總數,
因爲它同樣僅作用於歸檔文件而不會刪除活動的日誌文件。
此三個選項可以同時使用,以同時從三個維度去限制歸檔文件。
若將某選項設爲零,則表示取消此選項的限制。

--list-catalog [128-bit-ID...]
簡要列出日誌分類信息, 其中包括對分類信息的簡要描述。
如果明確指定了分類ID(128-bit-ID), 那麼僅顯示指定的分類。

--dump-catalog [128-bit-ID...]
詳細列出日誌分類信息 (格式與 .catalog 文件相同)。
如果明確指定了分類ID(128-bit-ID), 那麼僅顯示指定的分類。

--update-catalog
更新日誌分類索引二進制文件。
每當安裝、刪除、更新了分類文件,都需要執行一次此動作。

--setup-keys
此選項並不用於顯示日誌內容, 而是用於生成一個新的FSS(Forward Secure
Sealing)密鑰對。 此密鑰對包含一個"sealing key"與一個"verification key""sealing key"保存在本地日誌目錄中, 而"verification key"則必須保存在其他地方。
詳見 journald.conf(5) 中的 Seal= 選項。

--force
與 --setup-keys 連用, 表示即使已經配置了FSS(Forward Secure Sealing)密鑰對,
也要強制重新生成。

--interval=--setup-keys 連用,指定"sealing key"的變化間隔。
較短的時間間隔會導致佔用更多的CPU資源, 但是能夠減少未檢測的日誌變化時間。
默認值是 15min

--verify
檢查日誌文件的內在一致性。 如果日誌文件在生成時開啓了FSS特性, 並且使用
--verify-key= 指定了FSS"verification key",
那麼,同時還將驗證日誌文件的真實性。
--verify-key=--verify 選項連用, 指定FSS"verification key"

--sync
要求日誌守護進程將所有未寫入磁盤的日誌數據刷寫到磁盤上,
並且一直阻塞到刷寫操作實際完成之後才返回。 因此該命令可以保證當它返回的時候,
所有在調用此命令的時間點之前的日誌, 已經全部安全的刷寫到了磁盤中。

--flush
要求日誌守護進程 將 /run/log/journal 中的日誌數據 刷寫到 /var/log/journal 中
(如果持久存儲設備當前可用的話)。 此操作會一直阻塞到操作完成之後纔會返回,
因此可以確保在該命令返回時, 數據轉移確實已經完成。
注意,此命令僅執行一個單獨的、一次性的轉移動作, 若沒有數據需要轉移,
則此命令什麼也不做, 並且也會返回一個表示操作已正確完成的返回值。

--rotate
要求日誌守護進程滾動日誌文件。 此命令會一直阻塞到滾動完成之後纔會返回。

-h, --help
顯示簡短的幫助信息並退出。

--version
顯示簡短的版本信息並退出。

--no-pager
不將程序的輸出內容管道(pipe)給分頁程序
  • 範例:journalctl用法
#查看所有日誌(默認情況下 ,只保存本次啓動的日誌)
journalctl
#查看內核日誌(不顯示應用日誌)
journalctl -k
#查看系統本次啓動的日誌
journalctl -b
journalctl -b -0
#查看上一次啓動的日誌(需更改設置)
journalctl -b -1
#查看指定時間的日誌
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
#顯示尾部的最新10行日誌
journalctl -n
#顯示尾部指定行數的日誌
journalctl -n 20
#實時滾動顯示最新日誌
journalctl -f
#查看指定服務的日誌
journalctl /usr/lib/systemd/systemd
#查看指定進程的日誌
journalctl _PID=1
#查看某個路徑的腳本的日誌
journalctl /usr/bin/bash
#查看指定用戶的日誌
journalctl _UID=33 --since today
#查看某個 Unit 的日誌
journalctl -u nginx.service
journalctl -u nginx.service --since today
#實時滾動顯示某個 Unit 的最新日誌
journalctl -u nginx.service -f
#合併顯示多個 Unit 的日誌
journalctl -u nginx.service -u php-fpm.service --since today
#查看指定優先級(及其以上級別)的日誌,共有8級
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
#日誌默認分頁輸出,--no-pager 改爲正常的標準輸出
journalctl --no-pager
#日誌管理journalctl
#以 JSON 格式(單行)輸出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)輸出,可讀性更好
journalctl -b -u nginx.serviceqq -o json-pretty
#顯示日誌佔據的硬盤空間
journalctl --disk-usage
#指定日誌文件佔據的最大空間
journalctl --vacuum-size=1G
#指定日誌文件保存多久
journalctl --vacuum-time=1years
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章