日志介紹
日志:
歷史事件:時間,地點,人物,事件 日志級別:事件的關鍵性程度,Loglevel
系統日志服務:
sysklogd :CentOS 5之前版本
syslogd: system application 記錄應用日志 klogd: linux kernel 記錄內核日志
事件記錄格式:
日期時間 主機 進程[pid]: 事件內容
C/S架構:通過TCP或UDP協議的服務完成日志記錄傳送,將分布在不同主機的日志實現集中管理
rsyslog
rsyslog特性:CentOS6和7
多線程 UDP, TCP, SSL, TLS, RELP MySQL, PGSQL, Oracle實現日志存儲 強大的過濾器,可實現過濾記錄日志信息中任意部分 自定義輸出格式
ELK:elasticsearch, logstash, kibana
非關系型分布式數據庫 基於apache軟件基金會jakarta項目組的項目lucene Elasticsearch是個開源分布式搜索引擎 Logstash對日志進行收集、分析,並將其存儲供以后使用 kibana 可以提供的日志分析友好的 Web 界面
術語,參見man logger
facility:設施,從功能或程序上對日志進行歸類
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-local7(自定義log日志級別), syslog
Priority 優先級別,從低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
參看幫助: man 3 syslog
程序包:rsyslog 主程序:/usr/sbin/rsyslogd CentOS 6:service rsyslog {start|stop|restart|status} CentOS 7:/usr/lib/systemd/system/rsyslog.service 配置文件:/etc/rsyslog.conf ,/etc/rsyslog.d/*.conf 庫文件: /lib64/rsyslog/*.so
配置文件格式:由三部分組成
MODULES:相關模塊配置 GLOBAL DIRECTIVES:全局配置 RULES:日志記錄相關的規則配置
RULES配置格式: facility.priority; facility.priority… target
facility:
*: 所有的facility facility1,facility2,facility3,...:指定的facility列表
priority:
*: 所有級別 none:沒有級別,即不記錄 PRIORITY:指定級別(含)以上的所有級別 =PRIORITY:僅記錄指定級別的日志信息
target:
文件路徑:通常在/var/log/,文件路徑前的-表示異步寫入 用戶:將日志事件通知給指定的用戶,* 表示登錄的所有用戶 日志服務器:@host,把日志送往至指定的遠程服務器記錄 管道: | COMMAND,轉發給其它命令處理
我們來講sshd服務的日志文件單獨存放
(1)在sshd配置文件中添加一個本地自定義的Local
[root@centos7~]#vim /etc/ssh/sshd_config
(2)在rsyslog配置文件中將自定義的local級別指定相應的文件路徑
[root@centos7~]#vim /etc/rsyslog.conf
(3)改完配置文件之后重新啟動sshd和rsyslog服務,重啟之后就會自定生成 /var/log/sshd.log文件
[root@centos7~]#systemctl restart sshd rsyslog
(4)查看sshd跟蹤日志結果:
tail /var/log/sshd.log -f
實驗:基於網絡日志
基於UDP協議網絡日志
A主機:192.168.34.101
B主機:192.168.34.100
(1)在A主機把UDP協議注釋去掉,修改rsyslog配置文件
[root@centos7~]#vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514
*.info;mail.none;authpriv.none;cron.none @192.168.34.100 指向B主機的IP地址
(2)重啟rsyslog服務
[root@centos7~]#systemctl restart rsyslog
(3)測試結果,查看對方系統日志是否可以收到自己的消息
[root@centos7~]#logger 'I am 192.168.34.101'
實現TCP協議基於網絡日志
(1)修改rsyslog配置文件內容,打開TCP協議
[root@centos7~]#vim /etc/rsyslog.conf $ModLoad imtcp $InputTCPServerRun 514
*.info;mail.none;authpriv.none;cron.none @@192.168.34.102
(2)重啟rsyslog服務
[root@centos7~]#systemctl restart rsyslog
通常的日志格式:
事件產生的日期時間 主機 進程(pid):事件內容
如: /var/log/messages,cron,secure等
其它的日志文件
/var/log/secure:系統安裝日志,文本格式,應周期性分析 /var/log/btmp:當前系統上,用戶的失敗嘗試登錄相關的日志信息,二進制格式,lastb命令進行查看 /var/log/wtmp:當前系統上,用戶正常登錄系統的相關日志信息,二進制格式,last命令可以查看 /var/log/lastlog:每一個用戶最近一次的登錄信息,二進制格式,lastlog命令可以查看
/var/log/dmesg:系統引導過程中的日志信息,文本格式
文本查看工具查看 專用命令dmesg查看
/var/log/messages :系統中大部分的信息
/var/log/anaconda : anaconda的日志
日志管理journalctl
Systemd 統一管理所有 Unit 的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內核日志和應用日志)。日志的配置文件/etc/systemd/journald.conf
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
以 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
rsyslog將日志記錄於MySQL中
實驗准備:
A主機:192.168.34.100 (當做數據庫)
B主機:192.168.34.101 (當做日志存放)
C主機:192.168.34.102 (安裝LAP軟件)
(1)A主機安裝數據庫並啟動mariadb服務
[root@centos7~]#yum install mariadb-server -y
(2)在B主機上安裝rsyslog-mysql
[root@centos7~]#yum install rsyslog-mysql
(3)在B主機上查看rsyslog-mysql配置文件
[root@centos7yum.repos.d]#rpm -ql rsyslog-mysql /usr/lib64/rsyslog/ommysql.so /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
(4)將配置文件復制到A主機里
[root@centos7yum.repos.d]#scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 192.168.34.100: The authenticity of host '192.168.34.100 (192.168.34.100)' can't be established. ECDSA key fingerprint is SHA256:nl4GdONb/BsSo/TpR+UHsM/gFo4+tLpD40NhCklkf7M. ECDSA key fingerprint is MD5:55:a8:61:99:c3:52:fd:25:80:95:21:88:2b:98:1b:87. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.34.100' (ECDSA) to the list of known hosts. mysql-createDB.sql 100% 1046 274.8KB/s 00:00
(5)在A主機上導入傳過來的配置文件,並在A主機mysql數據庫創建一個loguser用戶賬號
[root@centos7~]#mysql < mysql-createDB.sql [root@centos7~]#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | Syslog | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec) MariaDB [(none)]> grant all on Syslog.* to loguser@'192.168.34.%' identified by 'centos'; Query OK, 0 rows affected (0.00 sec)
(6)在B主機上安裝mysql客戶端,並修改rsyslog配置文件內容
[root@centos7yum.repos.d]#yum install mariadb [root@centos7~]#vim /etc/rsyslog.conf $ModLoad ommysql *.info;mail.none;authpriv.none;cron.none :ommysql:192.168.34.100,Syslog,loguser,centos
重啟rsyslog日志服務
[root@centos7yum.repos.d]#systemctl restart rsyslog
驗證rsyslog日志存放在mysql數據庫中
在B主機上測試
[root@centos7yum.repos.d]#logger 'this is a test log from 192.168.34.100'
在A主機上查看當前的結果
基於LAMP搭建一個loganalyzer,獲取日志信息
官網:https://loganalyzer.adiscon.com/downloads
下載loganalyzer包:
(1)在C主機安裝LAP包,並啟動httpd服務
[root@centos777yum.repos.d]#yum install httpd php php-mysql php-gd -y [root@centos777yum.repos.d]#systemctl start httpd
(2)將下載下來的loganalyzer包傳到linux系統中,解壓此包,並將src目錄復制到/var/www/html目錄下
rz [root@centos777]#tar -xvf loganalyzer-4.1.7.tar.gz [root@centos777loganalyzer-4.1.7]#cd loganalyzer-4.1.7/ [root@centos777loganalyzer-4.1.7]#cp -r src /var/www/html/log
(3)在/var/www/html/log目錄下新建一個文件,並修改權限為666
[root@centos777log]#touch /var/www/html/log/config.php [root@centos777log]#chmod 666 /var/www/html/log/config.php
在網頁上按照步驟往下一步走:192.168.34.102/log,並修改網頁和mysql數據庫連接
在B主機上驗證日志效果:
[root@centos7yum.repos.d]#logger 'this is 2st test log from 192.168.34.100'
可以在loganalyzer上已經獲取了對應的日志信息
顯示畫圖的效果:
(4)配置完之后,將chonfig.php文件的權限改為644
[root@centos777log]#chmod 644 /var/www/html/log/config.php
Logrotate日志存儲
logrotate 程序是一個日志文件管理工具。用來把舊的日志文件刪除,並創建新的日志文件,稱為日志轉儲或滾動。可以根據日志文件的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程序來執行
配置文件是 /etc/logrotate.conf
主要參數如下
compress 通過gzip 壓縮轉儲以后的日志 nocompress 不需要壓縮時,用這個參數 copytruncate 用於還在打開中的日志文件,把當前日志備份並截斷 nocopytruncate 備份日志文件但是不截斷 create mode owner group 轉儲文件,使用指定的文件模式創建新的日志文件 nocreate 不建立新的日志文件 delaycompress 和 compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮 nodelaycompress 覆蓋 delaycompress 選項,轉儲並壓縮 errors address 轉儲時的錯誤信息發送到指定的Email 地址 ifempty 即使是空文件也轉儲,是缺省選項。 notifempty 如果是空文件的話,不轉儲 mail address 把轉儲的日志文件發送到指定的E-mail 地址 nomail 轉儲時不發送日志文件 olddir directory 轉儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統 noolddir 轉儲后的日志文件和當前日志文件放在同一個目錄下 prerotate/endscript 在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行 postrotate/endscript 在轉儲以后需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行 daily 指定轉儲周期為每天 weekly 指定轉儲周期為每周 monthly 指定轉儲周期為每月 size 大小 指定日志超過多大時,就執行日志轉儲 rotate count 指定日志文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份 Missingok 如果日志不存在,提示錯誤 Nomissingok如果日志不存在,繼續下一次日志,不提示錯誤