導航:首頁 > 編程語言 > python監控日誌並報警

python監控日誌並報警

發布時間:2023-04-04 02:35:53

1. 怎麼用python寫一個期貨突破新高報警的程序

1、首先用python寫一個期貨突破新高報警的程伏掘序包含兩個菜單欄。
2、其次使用Python語言編寫缺局核該策略,也非常容易實現。
3、最後加上臘睜回測配置信息,有70行代碼,實際可以更加精簡。

2. Loguru:Python 日誌終極解決方案

日誌的作用非常重要,日誌可以記錄用戶的操作、程序的異常,還可以為數據分析提供依據,日誌的存在意義就是為了能夠在程序在運行過程中記錄錯誤,方便維護和調試,能夠快速定位出錯的地方,減少維護成本。每個程序員都應該知道,不是為了記錄日誌而記錄日誌,日誌也不是隨意記的。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程、每個過程到底執行到哪的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節!

最常見的是把輸出函數 print() 當作日誌記錄的方式,直接列印各種提示信息,常見於個人練習項目里,通常是懶得單獨配置日誌,而且項目太小不需要日誌信息,不需要上線,不需要持續運行,完整的項目不推薦直接列印日誌信息,現實中也幾乎沒有人這么做。

我們可以在不少小項目裡面看到作者自己寫了一個日誌模板,通常利用 print() 或者 sys.stdout 稍微封裝一下即可實現簡單的日誌輸出,這里的 sys.stdout 是 Python 中的標准輸出流, print() 函數是對 sys.stdout 的高級封裝,當我們在 Python 中列印對象調用 print(obj) 時候,事實上是調用了 sys.stdout.write(obj+'\n') , print() 將內容列印到了控制台,然後追加了一個換行符 \n 。

自寫日誌模板適合比較小的項目,可以按照自己的喜好編寫模板,不需要太多復雜配置,方便快捷,但是這種記錄日誌的方式並不是很規范,有可能你自己覺得閱讀體驗不錯,但是別人在接觸你的項目的時候往往需要花費一定的時間去學習日誌的邏輯、格式、輸出方式等,比較大的項目同樣不推薦這種方法。

一個簡單的自寫日誌模板舉例:

日誌模板 log.py:

調用日誌模塊:

日誌輸出:

在一個完整的項目中,大多數人都會引入專門的日誌記錄庫,而 Python 自帶的標准庫 logging 就是專門為日誌記錄而生的,logging 模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日誌系統。由標准庫模塊提供日誌記錄 API 的關鍵好處是所有 Python 模塊都可以使用這個日誌記錄功能。所以,你的應用日誌可以將你自己的日誌信息與來自第三方模塊的信息整合起來。

logging 模塊雖然強大,但是其配置也是比較繁瑣的,在大型項目中通常需要單獨初始化日誌、配置日誌格式等等,K哥在日常使用中通常都會對 logging 做如下的封裝寫法,使日誌可以按天保存,保留15天的日誌,可以配置是否輸出到控制台和文件,如下所示:

輸出日誌:

它在控制台中是這樣的:

當然,如果你不需要很復雜的功能,希望簡潔一點,僅僅需要在控制台輸出一下日誌的話,也可以只進行簡單的配置:

對於 logging 模塊,即便是簡單的使用,也需要自己定義格式,這里介紹一個更加優雅、高效、簡潔的第三方模塊:loguru,官方的介紹是:Loguru is a library which aims to bring enjoyable logging in Python. Loguru 旨在為 Python 帶來愉快的日誌記錄。這里引用官方的一個 GIF 來快速演示其功能:

Loguru 僅支持 Python 3.5 及以上的版本,使用 pip 安裝即可:

Loguru 的主要概念是只有一個:logger

控制台輸出:

可以看到不需要手動設置,Loguru 會提前配置一些基礎信息,自動輸出時間、日誌級別、模塊名、行號等信息,而且根據等級的不同,還自動設置了不同的顏色,方便觀察,真正做到了開箱即用!

如果想自定義日誌級別,自定義日誌格式,保存日誌到文件該怎麼辦?與 logging 模塊不同,不需要 Handler,不需要 Formatter,只需要一個 add() 函數就可以了,例如我們想把日誌儲存到文件:

我們不需要像 logging 模塊一樣再聲明一個 FileHandler 了,就一行 add() 語句搞定,運行之後會發現目錄下 test.log 裡面同樣出現了剛剛控制台輸出的 debug 信息。

與 add() 語句相反, remove() 語句可以刪除我們添加的配置:

此時控制台會輸出兩條 debug 信息:

而 test.log 日誌文件裡面只有一條 debug 信息,原因就在於我們在第二條 debug 語句之前使用了 remove() 語句。

Loguru 對輸出到文件的配置有非常強大的支持,比如支持輸出到多個文件,分級別分別輸出,過大創建新文件,過久自動刪除等等。 下面我們來詳細看一下 add() 語句的詳細參數:

基本語法:

基本參數釋義:

當且僅當 sink 是協程函數時,以下參數適用:

當且僅當 sink 是文件路徑時,以下參數適用:

這么多參數可以見識到 add() 函數的強大之處,僅僅一個函數就能實現 logging 模塊的諸多功能,接下來介紹幾個比較常用的方法。

add() 函數的 rotation 參數,可以實現按照固定時間創建新的日誌文件,比如設置每天 0 點新創建一個 log 文件:

設置超過 500 MB 新創建一個 log 文件:

設置每隔一個周新創建一個 log 文件:

add() 函數的 retention 參數,可以設置日誌的最長保留時間,比如設置日誌文件最長保留 15 天:

設置日誌文件最多保留 10 個:

也可以是一個 datetime.timedelta 對象,比如設置日誌文件最多保留 5 個小時:

add() 函數的 compression 參數,可以配置日誌文件的壓縮格式,這樣可以更加節省存儲空間,比如設置使用 zip 文件格式保存:

其格式支持: gz 、 bz2 、 xz 、 lzma 、 tar 、 tar.gz 、 tar.bz2 、 tar.xz

Loguru 在輸出 log 的時候還提供了非常友好的字元串格式化功能,相當於 str.format() :

輸出:

在 Loguru 里可以直接使用它提供的裝飾器就可以直接進行異常捕獲,而且得到的日誌是無比詳細的:

日誌輸出:

在控制台的輸出是這樣的:

相比 Logging,Loguru 無論是在配置方面、日誌輸出樣式還是異常追蹤,都遠優於 Logging,使用 Loguru 無疑能提升開發人員效率。本文僅介紹了一些常用的方法,想要詳細了解可參考 Loguru 官方文檔 或關注 Loguru GitHub 。

3. 監控一個持續刷新的日誌文件/var/log/messages,命令是什麼/var/log/messages

Zabbix Advance - linux log monitor 日誌監控(/var/log/messages,/var/log/secure,其它程序日誌皆可) 原創
2020-09-11 10:43:40
2點贊

Fei-Huang

碼齡12年

關注
文章目錄
日誌監控原理
本文檔示例版本與官方使用文檔
配置過程
一,被監控的主機上配置zabbix_agentd.conf
二,修改日誌文件的許可權
修改前日誌文件的許可權:
修改日誌文件的許可權
查看修改後的文件許可權
三,配置zabbix web item頁面(監控root用戶登陸)
root用戶登陸測試慶凳皮
配置告警(trigger)
最終配置
再次測試root登陸
日誌監控原理
zabbix 監控日誌,主要是用於監控日誌中的關鍵字,遇到關鍵字後,zabbix agent 將日誌發送給server。日誌監控必需是agent active的監控項目

本文檔示例版本與官方使用文檔
官方文檔鏈接

配置過程
一,被監控的主機上配置zabbix_agentd.conf
[root@GuangGu_Zabbix_proxy ~]# egrep -v "#|^$" /etc/zabbix/zabbix_agent2.conf
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=X.X.X.X
ServerActive=X.X.X.X
Hostname=Zabbix_lOG
Include=/etc/zabbix/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
ServerActive=X.X.X.X
Hostname=Zabbix_lOG
以上兩個參數配置對日誌很重要,agent active 在發送數據給server端時,會將配置文件中的hostname的值做為一個值攜帶給服務端,zabbix_server收到發送過來的數據後會主動匹配這個值,是否與自己配置的主機的粗賀hostname一致,一致即接收數據,放置在資料庫中。

二,修改日誌文件的許可權
通常情況下,/var/log/目錄下的系統日誌文件只有root用戶有相應的讀寫許可權,而zabbix對這些文件需要有讀取的譽差許可權,否則無法監控,所以在不更改屬主屬組的情況下,使用==「facl」== 添加文件許可權比較合適,以下為示例:

修改前日誌文件的許可權:
[hostname]# ls -l /var/log/messages
-rw------- 1 root root 138063 Sep 11 08:10 /var/log/messages
1
2
1
2
只有root用戶有讀寫許可權,其它的用戶均沒有許可權

修改日誌文件的許可權
setfacl -m u:zabbix:r-- /var/log/messages
1
1
查看修改後的文件許可權
[root@GuangGu_Zabbix_proxy ~]# ls -l /var/log/messages
-rw-r-----+ 1 root root 193670 Sep 11 09:10 /var/log/messages
1
2
1
2
[root@GuangGu_Zabbix_proxy ~]# getfacl /var/log/messages
getfacl: Removing leading '/' from absolute path names
# file: var/log/messages
# owner: root
# group: root
user::rw-
user:zabbix:r--
group::---
mask::r--
other::---

1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
user:zabbix:r-- 可以看到zabbix用戶有r的許可權了
但是這條命令只設置了當前的/var/log/messages的文件的許可權,這個日誌文件是會隨日期滾動的所以還需要設置一下日誌滾動後的zabbix用戶的許可權,此時還需要修改另外一個文件的內容:

[root@hostname~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/setfacl -m u:zabbix:r-- /var/log/messages
endscript
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
logrotate 不是守護進程的服務,所以不需要重啟

三,配置zabbix web item頁面(監控root用戶登陸)
key : log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>]
/var/log/messages 中 root 用戶登陸的日誌記錄如下:

Sep 11 09:30:01 LOGMONITOR systemd: Started Session 6787 of user root.
1
1

幾個注意點:

類型必需是「zabbix agent active」的
信息類型必需是「日誌」型的
log[/var/log/messages, Started Session .* of user root.$,skip,]

root用戶登陸測試
Sep 11 09:44:47 LOGMONITOR systemd-logind: New session 6789 of user root.
Sep 11 09:44:47 LOGMONITOR systemd: Started Session 6789 of user root.
Sep 11 09:44:47 LOGMONITOR systemd: Starting Session 6789 of user root.
1
2
3
1
2
3
以上三條是登陸產生的日誌
查看zabbix監控的消息記錄

點擊「歷史記錄查看」

zabbix已經收到相關日誌

配置告警(trigger)
配置告警思路:

只要zabbix收到相應條目的日誌一次,就觸發一次告警
收到告警後,如果60s內沒有再次觸發告警就消失
最終配置

再次測試root登陸

此告警60S後消失

文章知識點與官方知識檔案匹配
CS入門技能樹Linux入門初識Linux
24650 人正在系統學習中
打開CSDN APP,看更多技術內容

zabbix監控Linux進程方法_lihuaichen的博客
利用zabbixproc.num方法監控Linux服務進程 proc.num[<name>,<user>,<state>,<cmdline>] 監控用戶某些狀態的進程的數量 name- 進程名稱 (默認「all processes」)user- 用戶名 (默認 「all users」)state- 可用值:all(默認),run,sl...
繼續訪問
zabbix監控遠程linux伺服器基礎操作_今天摘太陽的博客_linu...
查看添加的監控主機的最新數據是否監控到數據。4. 通過web頁面配置linux監控,添加監控主機及套用模板設置。 zabbix監控Linux流程 m0_52091913的博客 312 zabbix監控Linux流程,郵件警告 遠程監控 linux伺服器軟體,如何從Web瀏覽器遠程監控...
繼續訪問
log_monitor日誌監控
對qps以及介面的平均耗時進行統計 特點 (1)輕量: 共219KB(代碼量約300行), 無需安裝,解壓即可使用 (2)低侵入: 基於日誌文件進行統計,無需修改原程序 使用說明 (1) 二進制包:下載工具包 log_monitor.tar.gz,並解壓 (2) 源碼編譯:make 之後進行參數配置,可以拷貝現有的,各個參數說明如下: log_file=/data/nginx_logs/access.log log_reg=
(.∗)\+0800
(.∗)\+0800
time_format=%d/%b/%Y:%H:%M:%S retain_seconds=3600 http_port=3344 log_level=INFO log_file: 需要監控的日誌的路徑 log_reg: 需要匹配的日期以及耗時信息的正則表達式(需要加括弧) time_format: 日誌中日期的格式 retain_seconds: 統計數據保留時間 http_port: 用來通過頁面展示統計數據的埠 log_level: log monitor的日誌級別 啟動 ./bin/log_monitor [conf_file_path] 查看 (1) 在控制台就可以看到系統實時的qps以及每一秒中介面的平均耗時情況 (2) 通過瀏覽器訪問 http://${ip}:{http_port}/show.html
Zabbix監控之Linux命令行/Shell腳本解析json
本文主要寫了在Linux下如何用Shell腳本解析json數據,以便於在Zabbix中添加適合於業務應用的監控項。為什麼要使用json?json作為一種文本化的數據格式(文本化協議),符合UNIX編程的哲學,既符合透明性(透明性:設計可見,便於審查和調試)又符合文本性(文本性:數據應該保存為文本文件)。關鍵在於json對Web程序或者java程序非常友好,對於開發人員來說,他們也喜歡使用json數...
繼續訪問
linux啟動zabbix服務,zabbix監控Linux系統服務_鄧琨騰的博客
Zabbix自動發現規則監控Linux系統的service units 項目要求:通過systemctl命令查看Linux系統的service units; 監控前提:zabbix環境已搭建好; 監控原理:通過shell腳本把systemctl命令返回的結果以json格式發送到zabbix; ...
繼續訪問
zabbix自動監控linux進程,zabbix遠程命令-監控進程停掉後自動重啟應用...
6.在驗證遠程命令的可用性之後,在zabbix前端頁面添加監控項,設置觸發器,並添加執行遠程命令的動作。 7.添加監控項: 自定義名稱,類型為zabbix客戶端,鍵值為proc.num[,,,httpd],其他自定義,點擊添加。
繼續訪問
zabbix監控日誌
zabbix監控日誌
繼續訪問

linux的數據清洗視頻,Zabbix監控歷史數據清理
Zabbix監控運行一段時間以後,會留下大量的歷史監控數據,Zabbix資料庫一直在增大;可能會造成系統性能下降,查看歷史數據室查詢速度緩慢。Zabbix裡面最大的表就是history和history_uint兩個表,而且zabbix裡面的時間是使用的時間戳方式記錄,所以可以根據時間戳來刪除歷史數據一、關閉zabbix、http服務pkill -9 zabbixservice httpd stop...
繼續訪問
zabbix3.4監控linux磁碟使用率_一文看懂Linux全能型監控命令--dstat...
在linux上有top、free、iostat、vmstat、netstat等諸多監控系統各項性能的工具,如top,可以實時監控到系統負載、內存等使用情況,iostat能監控系統I/O情況,而vmstat可以得到關於進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。不過今天主...
繼續訪問
Zabbix監控Linux進程方法
利用zabbix proc.num方法監控Linux服務進程 proc.num[<name>,<user>,<state>,<cmdline>] 監控用戶某些狀態的進程的數量 name - 進程名稱 (默認「all processes」) user - 用戶名 (默認 「all users」) state - 可用值: all (默認), run,sleep, zomb cmdline - 命令行過濾(正則表達時) 一、首先新建一個模板,在監控項條目中新
繼續訪問

關於/var/log/messages文件
/var 包括系統運行時要改變的數據。其中包括每個系統是特定的,即不能夠與其他計算機共享的目錄,如/var/log,/var/lock,/var/run。有些目錄還是可以與其他系統共享,如/var/mail, /var/cache/man, /var/cache/fonts,/var/spool/news。var目錄存在的目的是把usr目錄在運行過程中需要更改的文件或者臨時生成的文件及目錄提取出來
繼續訪問
@Zabbix常用的監控命令及監控分析
文章目錄一、面試技巧1.面試常問二、單機監控命令1.CPU 監控命令2.內存監控命令3.磁碟監控命令4.網路監控命令5.TCP11種狀態監控命令6.生產場景需求7.系統的oom(out of memory)8.使用腳本監控nginx三、zabbix資料庫拆分1.環境准備2.導出原MySQL中的zabbix數據3.准備新的資料庫環境4.關閉原來的資料庫測試5.修改連接資料庫代碼 一、面試技巧 1.面試常問 #1.面試官:你們公司監控是如何做的? 你:用zabbix 面試官:.... #2.面試技
繼續訪問
最新發布 zabbix日誌監控:操作系統、業務系統、文件大小、多行日誌
(一)監控操作系統日誌 (二)監控業務系統日誌 (三)監控日誌文件大小 (四)多行日誌監控- Python腳本優化
繼續訪問

zabbix 時間錯誤_使用Zabbix來監控系統日誌
在Linux系統上,日誌文件通常可以分為四類:System Logs(系統日誌)Event Logs(事件日誌)Application Logs(應用程序日誌)Service Logs(服務日誌)一、為什麼要監控日誌?Linux為了跟蹤和監視系統(內核)各個組件及應用程序運行狀態而將產生的相關事件存儲到日誌文件中,當系統或者應用程序出現問題時,系統管理員能根據日誌定位到問題。而通過監控Linux的...
繼續訪問
【Docker學習】13、使用 Docker/Docker-Compose 部署 Prometheus 監控組件
文章目錄1、Prometheus 監控組件(1)Prometheus 監控 Linux(2)Prometheus 監控 Docker(3)Prometheus 監控 MySQL 1、Prometheus 監控組件 從上面的構建可以發現,現在已經可以監控當前Linux主機了,實際上能監控的內容很多,可以在官網查看,監控內容或社區查找 搭建各種組件的監控,首先需要找到提供數據的數據源,當然,Prometheus已經給我們寫好了配置,我們只需要在找到對應的配置進行安裝即可,Prometheus GitHub,例如
繼續訪問

Linux從入門到放棄 zabbix常見的linux監控命令
cpu top htop uptime vmstat 內存 free 磁碟 df iotop 網卡 iftop nethogs 系統進程 ps pstree
繼續訪問
zabix監控linux進程名稱,zabbix監控Linux進程方法
利用zabbixproc.num方法監控Linux服務進程proc.num[,,,]監控用戶某些狀態的進程的數量name- 進程名稱 (默認「all processes」)user- 用戶名 (默認 「all users」)state- 可用值:all(默認),run,sleep,zombcmdline-命令行過濾(正則表達時)具體監控某一服務進程的方法一、首先新建一個模板,在監控項條目中新建一...
繼續訪問

zabbix監控Linux流程
zabbix監控Linux流程,郵件警告
繼續訪問

zabbix監控linux文件目錄,zabbix之日誌文件監控
一、日誌item介紹下面介紹zabbix另一個「重量級」的功能——日誌文件監控,它最主要的是監控日誌文件中有沒有某個字元串的表達式,對應日誌輪轉與否,zabbix都支持。在配置Item的時候,Type選擇Zabbix agent (active),這里主要需要配置的是Key。下面是監控日誌的兩種key——log和logtr。log[/path/to/some/file,,,,,]logtr[/pa...
繼續訪問

監控linux日誌,Zabbix日誌監控:Linux異常登錄告警
本文利用zabbix的日誌監控功能監控Linux的secure日誌,當有用戶登錄失敗或者用戶在非常規時間登錄成功時發出告警。這里我們使用zabbix提供的'log[file,,,,,]'來監控Linux的/var/log/secure文件。先介紹下這個log監控項:1)監控項類型是Zabbix agent (active),返回數據類型是Log。2)Zabbix agent要對監控的日誌文件有可讀...
繼續訪問

Zabbix監控日誌
創建監控項 創建觸發器 驗證 問題定位 創建監控項 注意要選擇客戶端主動式,使用主動式的時候無法使用zabbix-get工具調試 鍵值示例:log[/home/moa/log/smapd/smapd.log,」info」,,,skip,,] 說明:1、/home/moa/log/smapd/smapd.log表示日誌路徑 2、」info」表示匹配的關鍵字...
繼續訪問
zabbix監控日誌關鍵字(ERROR)
前言:對我我這種剛入職場不久的小運維來說其實這個對我來說真的挺難得,研究了好久也在朋友的幫助下終於成功了,在此多謝我的朋友(倪偉)。 公司沒有zabbix監控,領導讓搭建一套zabbix然後讓監控錯誤日誌(關鍵字error),其實據說牛掰的大神可以監控到具體報錯信息是什麼,如有大神能編寫出來歡迎指教。 因為就是想讓他提醒一次就不在提醒了,所以腳本我寫了半天(不擅長啊) 我zabbix搭建的過...
繼續訪問
熱門推薦 Linux實時查看文件/var/log/messages以及這個文件的問題
耐心看完說不定有你遇到的問題 1./var/log/messages 首先說一下這個文件的存在,在Ubuntu系統中,這個文件你訪問可能提示找不到這個文件 //使用tail命令訪問 name@name:~$ sudo tail /var/log/messages tail:無法打開'/var/log/messages' 讀取數據: 沒有那個文件或目錄 tail:沒有剩餘文件 可能會出現...
繼續訪問
Zabbix使用總結
1. CentOS 7上啟動zabbix-server失敗,/var/log/messages中的報錯信息如下: Feb 22 12:56:43 mysql-server1 systemd: Starting Zabbix Server with MySQL DB... Feb 22 12:56:43 mysql-server1 kernel: zabbix_server[1599]: s
繼續訪問
zabbix監控linux歷史命令
zabbix
寫評論

評論

3

4. 如何用python寫監控日誌函數

defwrite_log(username,operation):
'''
寫日誌函數
:paramusername:用戶名
:paramoperation:用戶的操作信息
:return:
'''
w_time=time.strftime('%Y-%m-%d%H%M%S')
withopen('log.txt','a+')asfw:
log_content='%s%s%s '%(w_time,username,operation)
fw.write(log_content)

希望對你有幫助!

5. 在 python 項目中如何記錄日誌

寫本文的目的是我在寫 python 項目的時候需要記錄日誌,我忘記怎麼處理了,每次碼逗豎都需要去網上查一遍, 好記性不如爛筆頭 , 這里把查閱的內容記錄下來,方便以後查找。

python 項目中記錄日誌,可以使用 logging 模塊,logging 模塊定義的函數和類為應用程序和指歲庫的開發實現了一個靈活的事件日誌系統。logging 模塊是Python的一個標准庫模塊,由標准庫模塊提供日誌記錄API的關鍵好處是所有Python模塊都可以使用這個日誌記錄功能。所以,你的應用日誌可以將你自己的日誌信息與來自第三方模塊遲大的信息整合起來。

在 __init__.py 文件中做如下配置:

控制台輸出日誌如下:

參考文檔
https://www.cnblogs.com/yyds/p/6901864.html

6. zabbix日誌監控告警怎麼消失

使用shell或者python腳本對系統日誌進行過濾出錯誤日誌,重定盯鍵向到指定文件。然後在zabbix定義模板對該腳本進行監控。並指定觸發橘則高事件,當系統出現錯誤日誌時,圓尺觸發警告。

7. Python日誌—Python日誌模塊logging介紹

從事與軟體相關工作的人,應該都聽過「日誌」一詞。

日誌就是跟蹤軟體運行時事件的方法,為了能夠在程序運行過程中記錄錯誤。

通過日誌記錄程序的運行,方便我們查詢信息,以便追蹤問題、進行維護和調試、還是數據分析。

並且各編程語言都形成了各自的日誌體系和相應的框架。

日誌的作用總結:

首先我們要樹立一個觀點,那就是「不是為了記錄日誌而記錄日誌,日誌也不是隨意記的」。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程每個過程到底執行結果的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節。

在項目中,日誌這個功能非常重要,我們要重視起來。

在Python中,使用logging模塊來進行日誌的處理。

logging是Python的內置模塊,主要用於將日誌信息進行格式化內容輸出,可將格式化內容輸出到文件,也可輸出到屏幕。

我們在開發過程中,常用print()函數來進行調試,但是在實際應用的部署時,我們要將日誌信息輸出到文件中,方便後續查找以及備份。

在我們使用日誌管理時,我們也可以將日誌格式化成Json對象轉存到ELK中方便圖形化查看及管理。

logging模塊將日誌系統從高向低依次定義了四個類,分別是logger(日誌器)、handler(處理器)、filter(過濾器)和formatter(格式器)。其中由日誌器生成的實例將接管原本日誌記錄函數logging.log的功能。

說明:

我們先來思考下下面的兩個問題:

在軟體開發階段或部署開發環境時,為了盡可能詳細的查看應用程序的運行狀態來保證上線後的穩定性,我們可能需要把該應用程序所有的運行日誌全部記錄下來進行分析,這是非常耗費機器性能的。

當應用程序正式發布或在生產環境部署應用程序時,我們通常只需要記錄應用程序的異常信息、錯誤信息等,這樣既可以減小伺服器的I/O壓力,也可以避免我們在排查故障時被淹沒在日誌的海洋里。

那麼怎樣才能在不改動應用程序代碼的情況下,根據事件的重要性或者稱之為等級,實現在不同的環境中,記錄不同詳細程度的日誌呢?

這就是日誌等級的作用了,我們通過配置文件指定我們需要的日誌等級就可以了。

說明:

總結:

開發應用程序時或部署開發環境時,可以使用DEBUG或INFO級別的日誌獲取盡可能詳細的日誌信息,可以方便進行開發或部署調試。 應用上線或部署生產環境時,應用使用WARNING或ERROR或CRITICAL級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌信息的效率。 日誌級別的指定通常都是在應用程序的配置文件中進行指定的。 不同的應用程序所定義的日誌等級會有所差別,根據實際需求來決定。

8. python 運維常用腳本

Python 批量遍歷目錄文件,並修改訪問時間

import os

path = "D:/UASM64/include/"
dirs = os.listdir(path)
temp=[];

for file in dirs:
temp.append(os.path.join(path, file))
for x in temp:
os.utime(x, (1577808000, 1577808000))
Python 實現的自動化伺服器管理

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def ssh_cmd(user,passwd,port,userfile,cmd):

def ssh_put(user,passwd,source,target):

while True:
try:
shell=str(input("[Shell] # "))
if (shell == ""):
continue
elif (shell == "exit"):
exit()
elif (shell == "put"):
ssh_put("root","123123","./a.py","/root/a.py")
elif (shell =="cron"):
temp=input("輸入一個計劃任務: ")
temp1="(crontab -l; echo "+ temp + ") |crontab"
ssh_cmd("root","123123","22","./user_ip.conf",temp1)
elif (shell == "uncron"):
temp=input("輸入要刪除的計劃任務: ")
temp1="crontab -l | grep -v " "+ temp + "|crontab"
ssh_cmd("root","123123","22","./user_ip.conf",temp1)
else:
ssh_cmd("lyshark","123123","22","./user_ip.conf",shell)

遍歷目錄和文件

import os

def list_all_files(rootdir):
import os
_files = []
list = os.listdir(rootdir) #列出文件夾下所有的目錄與文件
for i in range(0,len(list)):
path = os.path.join(rootdir,list[i])
if os.path.isdir(path):
_files.extend(list_all_files(path))
if os.path.isfile(path):
_files.append(path)
return _files

a=list_all_files("C:/Users/LyShark/Desktop/a")
print(a)
python檢測指定埠狀態

import socket

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.settimeout(1)

for ip in range(0,254):
try:
sk.connect(("192.168.1."+str(ip),443))
print("192.168.1.%d server open "%ip)
except Exception:
print("192.168.1.%d server not open"%ip)

sk.close()

python實現批量執行CMD命令

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print("------------------------------> ")
print("使用說明,在當前目錄創建ip.txt寫入ip地址")
print("------------------------------> ")

user=input("輸入用戶名:")
passwd=input("輸入密碼:")
port=input("輸入埠:")
cmd=input("輸入執行的命令:")

file = open("./ip.txt", "r")
line = file.readlines()

for i in range(len(line)):
print("對IP: %s 執行"%line[i].strip(' '))

python3-實現釘釘報警

import requests
import sys
import json

dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='

data = {"msgtype": "markdown","markdown": {"title": "監控","text": "apche異常"}}

headers = {'Content-Type':'application/json;charset=UTF-8'}

send_data = json.mps(data).encode('utf-8')
requests.post(url=dingding_url,data=send_data,headers=headers)

import psutil
import requests
import time
import os
import json

monitor_name = set(['httpd','cobblerd']) # 用戶指定監控的服務進程名稱

proc_dict = {}
proc_name = set() # 系統檢測的進程名稱
monitor_map = {
'httpd': 'systemctl restart httpd',
'cobblerd': 'systemctl restart cobblerd' # 系統在進程down掉後,自動重啟
}

dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='

while True:
for proc in psutil.process_iter(attrs=['pid','name']):
proc_dict[proc.info['pid']] = proc.info['name']
proc_name.add(proc.info['name'])

判斷指定埠是否開放

import socket

port_number = [135,443,80]

for index in port_number:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((飗.0.0.1', index))
if result == 0:
print("Port %d is open" % index)
else:
print("Port %d is not open" % index)
sock.close()

判斷指定埠並且實現釘釘輪詢報警

import requests
import sys
import json
import socket
import time

def dingding(title,text):
dingding_url = ' https://oapi.dingtalk.com/robot/send?access_token='
data = {"msgtype": "markdown","markdown": {"title": title,"text": text}}
headers = {'Content-Type':'application/json;charset=UTF-8'}
send_data = json.mps(data).encode('utf-8')
requests.post(url=dingding_url,data=send_data,headers=headers)

def net_scan():
port_number = [80,135,443]
for index in port_number:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((飗.0.0.1', index))
if result == 0:
print("Port %d is open" % index)
else:
return index
sock.close()

while True:
dingding("Warning",net_scan())
time.sleep(60)

python-實現SSH批量CMD執行命令

import sys
import os
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def ssh_cmd(user,passwd,port,userfile,cmd):
file = open(userfile, "r")
line = file.readlines()
for i in range(len(line)):
print("對IP: %s 執行"%line[i].strip(' '))
ssh.connect(hostname=line[i].strip(' '),port=port,username=user,password=passwd)
cmd=cmd
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()

ssh_cmd("lyshark","123","22","./ip.txt","free -h |grep 'Mem:' |awk '{print $3}'")

用python寫一個列舉當前目錄以及所有子目錄下的文件,並列印出絕對路徑

import sys
import os

for root,dirs,files in os.walk("C://"):
for name in files:
print(os.path.join(root,name))
os.walk()

按照這樣的日期格式(xxxx-xx-xx)每日生成一個文件,例如今天生成的文件為2013-09-23.log, 並且把磁碟的使用情況寫到到這個文件中。

import os
import sys
import time

new_time = time.strftime("%Y-%m-%d")
disk_status = os.popen("df -h").readlines()

str1 = ''.join(disk_status)
f = open(new_time+'.log','w')
f.write("%s"%str1)

f.flush()
f.close()

統計出每個IP的訪問量有多少?(從日誌文件中查找)

import sys

list = []

f = open("/var/log/httpd/access_log","r")
str1 = f.readlines()
f.close()

for i in str1:
ip=i.split()[0]
list.append(ip)

list_num=set(list)

for j in list_num:
num=list.count(j)
print("%s -----> %s" %(num,j))

寫個程序,接受用戶輸入數字,並進行校驗,非數字給出錯誤提示,然後重新等待用戶輸入。

import tab
import sys

while True:
try:
num=int(input("輸入數字:").strip())
for x in range(2,num+1):
for y in range(2,x):
if x % y == 0:
break
else:
print(x)
except ValueError:
print("您輸入的不是數字")
except KeyboardInterrupt:
sys.exit(" ")

ps 可以查看進程的內存佔用大小,寫一個腳本計算一下所有進程所佔用內存大小的和。

import sys
import os

list=[]
sum=0

str1=os.popen("ps aux","r").readlines()

for i in str1:
str2=i.split()
new_rss=str2[5]
list.append(new_rss)
for i in list[1:-1]:
num=int(i)
sum=sum+num

print("%s ---> %s"%(list[0],sum))

關於Python 命令行參數argv

import sys

if len(sys.argv) < 2:
print ("沒有輸入任何參數")
sys.exit()

if sys.argv[1].startswith("-"):
option = sys.argv[1][1:]

利用random生成6位數字加字母隨機驗證碼

import sys
import random

rand=[]

for x in range(6):
y=random.randrange(0,5)
if y == 2 or y == 4:
num=random.randrange(0,9)
rand.append(str(num))
else:
temp=random.randrange(65,91)
c=chr(temp)
rand.append(c)
result="".join(rand)
print(result)

自動化-使用pexpect非交互登陸系統

import pexpect
import sys

ssh = pexpect.spawn('ssh [email protected]')
fout = file('sshlog.txt', 'w')
ssh.logfile = fout

ssh.expect("[email protected]'s password:")

ssh.sendline("密碼")
ssh.expect('#')

ssh.sendline('ls /home')
ssh.expect('#')

Python-取系統時間

import sys
import time

time_str = time.strftime("日期:%Y-%m-%d",time.localtime())
print(time_str)

time_str= time.strftime("時間:%H:%M",time.localtime())
print(time_str)

psutil-獲取內存使用情況

import sys
import os
import psutil

memory_convent = 1024 * 1024
mem =psutil.virtual_memory()

print("內存容量為:"+str(mem.total/(memory_convent))+"MB ")
print("已使用內存:"+str(mem.used/(memory_convent))+"MB ")
print("可用內存:"+str(mem.total/(memory_convent)-mem.used/(1024*1024))+"MB ")
print("buffer容量:"+str(mem.buffers/( memory_convent ))+"MB ")
print("cache容量:"+str(mem.cached/(memory_convent))+"MB ")

Python-通過SNMP協議監控CPU
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os

def getAllitems(host, oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid + '|grep Raw|grep Cpu|grep -v Kernel').read().split(' ')[:-1]
return sn1

def getDate(host):
items = getAllitems(host, '.1.3.6.1.4.1.2021.11')

if name == ' main ':

Python-通過SNMP協議監控系統負載
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os
import sys

def getAllitems(host, oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split(' ')
return sn1

def getload(host,loid):
load_oids = Ƈ.3.6.1.4.1.2021.10.1.3.' + str(loid)
return getAllitems(host,load_oids)[0].split(':')[3]

if name == ' main ':

Python-通過SNMP協議監控內存
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import os

def getAllitems(host, oid):

def getSwapTotal(host):

def getSwapUsed(host):

def getMemTotal(host):

def getMemUsed(host):

if name == ' main ':

Python-通過SNMP協議監控磁碟
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import re
import os

def getAllitems(host,oid):

def getDate(source,newitem):

def getRealDate(item1,item2,listname):

def caculateDiskUsedRate(host):

if name == ' main ':

Python-通過SNMP協議監控網卡流量
注意:被監控的機器上需要支持snmp協議 yum install -y net-snmp*

import re
import os

def getAllitems(host,oid):
sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split(' ')[:-1]
return sn1

def getDevices(host):
device_mib = getAllitems(host,'RFC1213-MIB::ifDescr')
device_list = []

def getDate(host,oid):
date_mib = getAllitems(host,oid)[1:]
date = []

if name == ' main ':

Python-實現多級菜單

import os
import sys

ps="[None]->"
ip=["192.168.1.1","192.168.1.2","192.168.1.3"]
flage=1

while True:
ps="[None]->"
temp=input(ps)
if (temp=="test"):
print("test page !!!!")
elif(temp=="user"):
while (flage == 1):
ps="[User]->"
temp1=input(ps)
if(temp1 =="exit"):
flage=0
break
elif(temp1=="show"):
for i in range(len(ip)):
print(i)

Python實現一個沒用的東西

import sys

ps="[root@localhost]# "
ip=["192.168.1.1","192.168.1.2","192.168.1.3"]

while True:
temp=input(ps)
temp1=temp.split()

檢查各個進程讀寫的磁碟IO

import sys
import os
import time
import signal
import re

class DiskIO:
def init (self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0

def main():
argc = len(sys.argv)
if argc != 1:
print ("usage: please run this script like [./lyshark.py]")
sys.exit(0)
if os.getuid() != 0:
print ("Error: This script must be run as root")
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_mp')
print ("TASK PID READ WRITE")
while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(
'^(S+)(d+)(d+): (READ|WRITE) block (d+) on (S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print ("%-10s %10s %10d %10d" %
(item.pname, item.pid, item.reads, item.writes))
def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_mp')
sys.exit(0)

if name ==" main ":
main()

利用Pexpect實現自動非交互登陸linux

import pexpect
import sys

ssh = pexpect.spawn('ssh [email protected]')
fout = file('sshlog.log', 'w')
ssh.logfile = fout

ssh.expect("[email protected]'s password:")

ssh.sendline("密碼")

ssh.expect('#')
ssh.sendline('ls /home')
ssh.expect('#')

利用psutil模塊獲取系統的各種統計信息

import sys
import psutil
import time
import os

time_str = time.strftime( "%Y-%m-%d", time.localtime( ) )
file_name = "./" + time_str + ".log"

if os.path.exists ( file_name ) == False :
os.mknod( file_name )
handle = open ( file_name , "w" )
else :
handle = open ( file_name , "a" )

if len( sys.argv ) == 1 :
print_type = 1
else :
print_type = 2

def isset ( list_arr , name ) :
if name in list_arr :
return True
else :
return False

print_str = "";

if ( print_type == 1 ) or isset( sys.argv,"mem" ) :
memory_convent = 1024 * 1024
mem = psutil.virtual_memory()
print_str += " 內存狀態如下: "
print_str = print_str + " 系統的內存容量為: "+str( mem.total/( memory_convent ) ) + " MB "
print_str = print_str + " 系統的內存以使用容量為: "+str( mem.used/( memory_convent ) ) + " MB "
print_str = print_str + " 系統可用的內存容量為: "+str( mem.total/( memory_convent ) - mem.used/( 1024*1024 )) + "MB "
print_str = print_str + " 內存的buffer容量為: "+str( mem.buffers/( memory_convent ) ) + " MB "
print_str = print_str + " 內存的cache容量為:" +str( mem.cached/( memory_convent ) ) + " MB "

if ( print_type == 1 ) or isset( sys.argv,"cpu" ) :
print_str += " CPU狀態如下: "
cpu_status = psutil.cpu_times()
print_str = print_str + " user = " + str( cpu_status.user ) + " "
print_str = print_str + " nice = " + str( cpu_status.nice ) + " "
print_str = print_str + " system = " + str( cpu_status.system ) + " "
print_str = print_str + " idle = " + str ( cpu_status.idle ) + " "
print_str = print_str + " iowait = " + str ( cpu_status.iowait ) + " "
print_str = print_str + " irq = " + str( cpu_status.irq ) + " "
print_str = print_str + " softirq = " + str ( cpu_status.softirq ) + " "
print_str = print_str + " steal = " + str ( cpu_status.steal ) + " "
print_str = print_str + " guest = " + str ( cpu_status.guest ) + " "

if ( print_type == 1 ) or isset ( sys.argv,"disk" ) :
print_str += " 硬碟信息如下: "
disk_status = psutil.disk_partitions()
for item in disk_status :
print_str = print_str + " "+ str( item ) + " "

if ( print_type == 1 ) or isset ( sys.argv,"user" ) :
print_str += " 登錄用戶信息如下: "
user_status = psutil.users()
for item in user_status :
print_str = print_str + " "+ str( item ) + " "

print_str += "--------------------------------------------------------------- "
print ( print_str )
handle.write( print_str )
handle.close()

import psutil

mem = psutil.virtual_memory()
print mem.total,mem.used,mem
print psutil.swap_memory() # 輸出獲取SWAP分區信息

cpu = psutil.cpu_stats()
printcpu.interrupts,cpu.ctx_switches

psutil.cpu_times(percpu=True) # 輸出每個核心的詳細CPU信息
psutil.cpu_times().user # 獲取CPU的單項數據 [用戶態CPU的數據]
psutil.cpu_count() # 獲取CPU邏輯核心數,默認logical=True
psutil.cpu_count(logical=False) # 獲取CPU物理核心數

psutil.disk_partitions() # 列出全部的分區信息
psutil.disk_usage('/') # 顯示出指定的掛載點情況【位元組為單位】
psutil.disk_io_counters() # 磁碟總的IO個數
psutil.disk_io_counters(perdisk=True) # 獲取單個分區IO個數

psutil.net_io_counter() 獲取網路總的IO,默認參數pernic=False
psutil.net_io_counter(pernic=Ture)獲取網路各個網卡的IO

psutil.pids() # 列出所有進程的pid號
p = psutil.Process(2047)
p.name() 列出進程名稱
p.exe() 列出進程bin路徑
p.cwd() 列出進程工作目錄的絕對路徑
p.status()進程當前狀態[sleep等狀態]
p.create_time() 進程創建的時間 [時間戳格式]
p.uids()
p.gids()
p.cputimes() 【進程的CPU時間,包括用戶態、內核態】
p.cpu_affinity() # 顯示CPU親緣關系
p.memory_percent() 進程內存利用率
p.meminfo() 進程的RSS、VMS信息
p.io_counters() 進程IO信息,包括讀寫IO數及位元組數
p.connections() 返回打開進程socket的nametples列表
p.num_threads() 進程打開的線程數

import psutil
from subprocess import PIPE
p =psutil.Popen(["/usr/bin/python" ,"-c","print 'helloworld'"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()

psutil.users() # 顯示當前登錄的用戶,和Linux的who命令差不多

psutil.boot_time() 結果是個UNIX時間戳,下面我們來轉換它為標准時間格式,如下:
datetime.datetime.fromtimestamp(psutil.boot_time()) # 得出的結果不是str格式,繼續進行轉換 datetime.datetime.fromtimestamp(psutil.boot_time()).strftime('%Y-%m-%d%H:%M:%S')

Python生成一個隨機密碼

import random, string
def GenPassword(length):

if name == ' main ':
print (GenPassword(6))

9. python 執行函數長時間不打日誌,檢測是否還在運行

pyhon的一個函數在執行I/衫困O參缺派數比如文件讀寫,socket正在等待數據時是不能幹其他事情的,包括打日誌。如果想讓一個文件准備好讀寫了或者一個socket有數據可以直接接收時讓操作系統通知程序的話,可伏塌賀以試試select庫

10. 我的的python語言腳本監控的伺服器日誌,日誌出現錯誤的時候根據錯誤關鍵字進行語音告警。可是最近出現

應該是split後生成的列表的原始超過2個了。看下面的簡單的例子就知道了。
其實應或飢該看一下生成後的長度,做個保護,否則像你這種賦值,只要列表長差並度不為2,都會異常。

>>> x=[1,2,3]
>>>虛團跡 a,b=x
Traceback (most recent call last):
File "<interactive input>", line 1, in <mole>
ValueError: too many values to unpack

閱讀全文

與python監控日誌並報警相關的資料

熱點內容
php論壇實訓報告 瀏覽:401
java日期字元串轉換成日期 瀏覽:129
linuxsftp連接 瀏覽:934
光伏日發電量演算法 瀏覽:125
小肚皮app怎麼才有vip 瀏覽:616
php全形轉換半形 瀏覽:927
java字元序列 瀏覽:539
杭州編譯分布式存儲區塊鏈 瀏覽:575
材料壓縮曲線 瀏覽:247
linux命令排序 瀏覽:151
手機熱點加密為啥連接不上電腦 瀏覽:979
編譯器合並計算 瀏覽:959
android音頻曲線 瀏覽:343
linuxftp自動登錄 瀏覽:802
運行編譯後網頁 瀏覽:70
閱讀app怎麼使用 瀏覽:319
centos防火牆命令 瀏覽:432
命令行變更 瀏覽:332
linux設備和驅動 瀏覽:207
加密貨幣騙局破案 瀏覽:345