㈠ linux 下python 腳本編寫的"奇技淫巧"
「 生命完美的答案,無非走過沒有遺憾 ---《天藍》」
「如何能夠解析腳本運行命令行選項(位於 sys.argv 中)」
argparse 模塊可被用來解析命令行選項
常用來定義一個腳本的說明文檔,一般我們寫python腳本會通過 if..else 的方式來提供一個腳本說明文檔,python不支持switch。所以很麻煩,其實,我們可以通過 argparse 來編寫說明文檔。
我們來看看怎麼執行一個python腳本
對於熟悉Linux的小夥伴下面的文檔在熟悉不過了,這個一個標准Linxu軟體包的說明文檔,文檔中定義是軟體包的說明
來看看這個腳本是如何編寫的
為了解析命令行選項, 首先要創建一個 ArgumentParser 實例, 使用 add_argument() 方法聲明你想要支持的選項。在每個 add-argument() 調用中:
dest 參數指定解析結果被指派給屬性的名字。 metavar 參數被用來生成幫助信息。
action 參數 指定跟屬性對應的處理邏輯,通常的 值為 store , 被用來存儲 某個值 或將 多個參數值收集到一個列表中 。
nargs 參數收集 所有剩餘的命令行參數到一個列表中。在本例中它被用來構造一個文件名列表
action='store_true' 根據參數是否存在來設置一個位置 Boolean 標志:
action='store' 參數接受一個單獨值並將其存儲為一個字元串
如果一個都沒有,會提示缺少參數 -p/--pat
choices={'slow', 'fast'}, 參數說明接受一個值,但是會將其和可能的選擇值做比較,以檢測其合法性:
一旦參數選項被指定,你就可以執行 parser.parse() 方法了。它會處理 sys.argv 的值並返回一個結果實例。每個參數值會被設置成該實例中 add_argument() 方法的 dest 參數指定的屬性值。
還很多種其他方法解析命令行選項。可以會手動地處理 sys.argv 或者使用 getopt 模塊 。但是,如果你採用本節的方式,將會減少很多冗餘代碼,底層細節 argparse 模塊 已經幫你處理好了。你可能還會碰到使用 optparse 庫解析選項的代碼。盡管 optparse 和 argparse 很像 ,但是後者更先進,因此在新的程序中你應該使用它。
「你寫了個腳本,運行時需要一個密碼。此腳本是互動式的,因此不能將密碼在腳本中硬編碼,而是需要彈出一個密碼輸入提示,讓用戶自己輸入。」
Python 的 getpass 模塊 正是你所需要的。你可以讓你很輕松地彈出密碼輸入提示,並且不會在用戶終端顯示密碼。
代碼中 getpass.getuser() 不會彈出用戶名的輸入提示。它會根據該 用戶的 shell 環境 或者會依據 本地系統的密碼庫 (支持 pwd 模塊的平台)來使用 當前用戶的登錄名
在bash中編寫pytohn腳本接收外部數據的方式,一般情況下,對於一般變數,我們用命令行變數的方式比較多(手動的處理 sys.argv ),對於 文件內容或者bash命令輸出 直接通過腳本內部獲取需要的數據。
其實python 腳本也可以用其他方式來接收 傳遞給他的 文件數據或者bash命令輸出 ,包括將 命令行的輸出 通過 管道傳遞 給該腳本、 重定向文件到該腳本 ,或在 命令行中傳遞一個文件名 或 文件名列表 給該腳本。
這里通過 Python 內置的 fileinput 模塊 ,可以實現重 定向,管道,以文佳輸出 的方式傳遞數據到腳本內部
使用 fileinput.input() 方法可以獲取當前輸入腳本的數據,腳本裡面用一個 FileInput 迭代器接收
文件直接接收
重定向接收
管道方式接收
fileinput.input() 創建並返回一個 FileInput 類的實例,該實例可以被當做一個 上下文管理器 使用。因此,整合起來,如果我們要寫一個列印多個文件輸出的腳本,那麼我們需要在輸出中包含文件名和行號
「你想執行一個外部命令並以 Python 字元串的形式獲取執行結果。」
使用 subprocess.check_output() 函數。
執行下試試
如果被執行的命令以非零碼返回,就會拋出異常。下面的例子捕獲到錯誤並獲取返回碼:
默認情況下, check_output() 僅僅返回輸入到標准輸出的值。如果你需要 同時收集標准輸出和錯誤輸出 ,使用 stderr 參數:
如果你需要用一個超時機制來執行命令,使用 timeout 參數:
通常來講,命令的執行 不需要 使用到 底層 shell 環境(比如 sh、bash) 。一個字元串列表會被傳遞給一個 低級系統命令 ,比如 os.execve() 。
如果你想讓 命令被一個shell 執行 ,傳遞一個字元串參數,並設置參數 shell=True . 有時候你想要 Python 去執行一個復雜的 shell 命令 的時候這個就很有用了,比如管道流、I/O 重定向和其他特性。例如:
是在 shell 中執行命令會存在一定的安全風險,特別是當參數來自於用戶輸入時。這時候可以使用 shlex.quote() 函數 來將參數正確的用雙引用引起來。
使用 check_output() 函數 是執行 外部命令 並獲取其 返回值 的最簡單方式。但是,如果你需要對 子進程做更復雜的交互 ,比如給它發送輸入,你得採用另外一種方法。這時候可直接使用 subprocess.Popen 類。
關於子進程,簡單來看下
也可以進程列表同協程結合的方式。你既可以在子shell中 進行繁重的處理工作,同時也不會讓子shell的I/O受制於終端。
如果直接丟到後台會自動在終端輸出IO
subprocess 模塊對於依賴 TTY 的外部命令不合適用 。例如,你不能使用它來自動化一個用戶輸入密碼的任務(比如一個 ssh 會話)。這時候,你需要使用到第三方模塊了,比如基於著名的 expect 家族的工具(pexpect 或類似的)(pexpect可以理解為Linux下的expect的Python封裝、通過pexpect可以實現對ssh、ftp、passwd、telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。比如我們可以模擬一個FTP登錄時所有交互,包括輸入主機地址、用戶名、密碼、上傳文件等,待出現異常還可以進行嘗試自動處理。)
「你想向標准錯誤列印一條消息並返回某個非零狀態碼來終止程序運行」
通過 python 的 raise SystemExit(3) 命令可以主動拋出一個錯誤,通過 sys.stderr.write 將命令寫到標準的輸出端
直接將消息作為參數傳給 SystemExit() ,那麼你可以省略其他步驟
拋出一個 SystemExit 異常,使用錯誤消息作為參數,它會將消息在 sys.stderr 中列印,然後程序以狀態碼 1 退出
「你需要知道當前終端的大小以便正確的格式化輸出。」
使用 os.get terminal size() 函數 來做到這一點。
「復制或移動文件和目錄,但是又不想調用 shell 命令。」
shutil 模塊 有很多便捷的函數可以復制文件和目錄。使用起來非常簡單
這里不多講,熟悉Linux的小夥伴應該不陌生。
默認情況下,對於 符號鏈接 這些命令處理的是它指向的東西文件。例如,如果 源文件 是一個 符號鏈接 ,那麼目標文件將會是 符號鏈接 指向的文件。如果你只想 復制符號鏈接本身 ,那麼需要指定 關鍵字 參數 follow_symlinks
tree() 可以讓你在復制過程中選擇性的忽略某些文件或目錄。你可以提供一個忽略函數,接受一個目錄名和文件名列表作為輸入,返回一個忽略的名稱列表。例如:
對於文件元數據信息, 2() 這樣的函數只能盡自己最大能力來保留它。 訪問時間、創建時間和許可權 這些基本信息會被保留,但是 對於所有者、ACLs、資源 fork 和其他更深層次的文件元信息就說不準了
通常不會去使用 shutil.tree() 函數 來執行 系統備份 。當處理文件名的時候,最好使用 os.path 中的函數來確保最大的可移植性
使用 tree() 復制文件夾的一個棘手的問題是對於錯誤的處理,可以使用異常塊處理,或者通過 參數 ignore dangling symlinks=True 忽略掉無效符號鏈接。
「創建或解壓常見格式的歸檔文件(比如.tar, .tgz 或.zip)」
shutil 模塊擁有兩個函數—— make archive() 和 unpack archive() 可派上用場,
make archive() 的第二個參數是期望的輸出格式。可以使用 get archive formats() 獲取所有支持的歸檔格式列表。
「你需要寫一個涉及到文件查找操作的腳本,比如對日誌歸檔文件的重命名工具,你不想在 Python 腳本中調用 shell,或者你要實現一些 shell 不能做的功能。」
查找文件,可使用 os.walk() 函數 ,傳一個頂級目錄名給它
os.walk() 方法 為我們 遍歷目錄樹 ,每次進入一個目錄,它會返回一個 三元組 ,包含 相對於查找目錄的相對路徑,一個該目錄下的目錄名列表,以及那個目錄下面的文件名列表。
對於每個元組,只需檢測一下目標文件名是否在文件列表中。如果是就使用 os.path.join() 合並路徑。為了避免奇怪的路徑名比如 ././foo//bar ,使用了另外兩個函數來修正結果
os.walk(start) 還有跨平台的優勢。並且,還能很輕松的加入其他的功能。我們再演示一個例子,下面的函數列印所有最近被修改過的文件:
列印10分鍾之前被修改的數據
「怎樣讀取普通.ini 格式的配置文件?」
configparser 模塊 能被用來讀取配置文件
編寫配置文件
如果有需要,你還能修改配置並使用 cfg.write() 方法將其寫回到文件中
「你希望在腳本和程序中將診斷信息寫入日誌文件。」
python 腳本列印日誌最簡單方式是使用 logging 模塊
五個日誌調用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的嚴重級別。 basicConfig() 的 level 參數是一個 過濾器 。所有級別低於此級別的日誌消息都會被忽略掉。每個 logging 操作的參數是一個消息字元串,後面再跟一個或多個參數。構造最終的日誌消息的時候我們使用了 % 操作符來格式化消息字元串。
如果你想使用配置文件,可以像下面這樣修改 basicConfig() 調用:
logconfig.ini
在調用日誌操作前先執行下 basicConfig() 函數方法 ,可以找標准輸出或者文件中輸出
basicConfig() 在程序中只能被執行一次。如果你稍後想改變日誌配置,就需要先獲取 root logger ,然後直接修改它。
更多見日誌模塊文檔https://docs.python.org/3/howto/logging-cookbook.html
「你想給某個函數庫增加日誌功能,但是又不能影響到那些不使用日誌功能的程序。」
對於想要執行日誌操作的函數庫,你應該創建一個專屬的 logger 對象,並且像下面這樣初始化配置:
使用這個配置,默認情況下不會列印日誌,只有配置過日誌系統,那麼日誌消息列印就開始生效
通常來講,不應該在函數庫代碼中 自己配置日誌系統 ,或者是已經有個已經存在的日誌配置了。調用 getLogger( name ) 創建一個和調用模塊同名的 logger 模塊 。由於 模塊 都是唯一的,因此創建的 logger 也將是唯一 的。所以當前進程中只有一個logging會生效。
log.addHandler(logging.NullHandler()) 操作將一個 空處理器 綁定到剛剛已經創建好的 logger 對象 上。一個空處理器默認會忽略調用所有的日誌消息。因此,如果使用該函數庫的時候還沒有配置日誌,那麼將不會有消息或警告出現。
在這里,根日誌被配置成僅僅 輸出 ERROR 或更高級別的消息 。不過, somelib 的日誌級別被單獨配置成可以輸出 debug 級別的消息, 它的優先順序比全局配置高。像這樣更改單獨模塊的日誌配置對於調試來講是很方便的,因為你無需去更改任何的全局日誌配置——只需要修改你想要更多輸出的模塊的日誌等級。(這個還有待研究)
「你想記錄程序執行多個任務所花費的時間」
time 模塊 包含很多函數來執行跟時間有關的函數。盡管如此,通常我們會在此基礎之上構造一個更高級的介面來模擬一個計時器。
這個類定義了一個可以被用戶根據需要啟動、停止和重置的計時器。它會在elapsed 屬性中記錄整個消耗時間。下面是一個例子來演示怎樣使用它:
這里通過 __enter__,__exit__ ,使用 with 語句 以及上下文管理器協議可以省略計時器打開和關閉操作。(關於上下文管理協議,即with語句,為了讓一個對象兼容with語句,必須在這個對象的類中聲明 __enter__和__exit__方法, , __enter__ 在出現with語句被調用, __exit__ 在代碼執行完畢被調用,可以參考open()方法)
在計時中要考慮一個 底層的時間函數問題 。 一般來說, 使用 time.time() 或 time.clock() 計算的時間精度因操作系統的不同會有所不同。而使用 time.perf_counter() 函數可以確保使用系統上面 最精確的計時器 。
「你想對在 Unix 系統上面運行的程序設置內存或 CPU 的使用限制。」
resource 模塊 能同時執行這兩個任務。例如,要限制 CPU 時間,下面的代碼在windows平台執行不了,但是Linux是可以的。
程序運行時, SIGXCPU 信號 在時間過期時被生成,然後執行清理並退出。
這暫時沒有好的Demo...
程序運行到沒有多餘內存時會拋出 MemoryError 異常。
setrlimit() 函數 被用來設置特定資源上面的 軟限制和硬限制 。
setrlimit() 函數 還能被用來設置 子進程數量、打開文件數以及類似系統資源的限制(cgroup) 。
「通過腳本啟動瀏覽器並打開指定的 URL 網頁」
webbrowser 模塊 能被用來啟動一個瀏覽器,並且與平台無關
新窗口打卡網站
當前窗口打開一個tab頁
指定瀏覽器類型,可以使用 webbrowser.get() 函數
㈡ Linux用戶命令記錄
很多情況下我們需要記錄用戶執行過的命令,不管是root還是其他普通用戶,我們可以通過以下方式來記錄。
PROMPT_COMMAND會在命令執行前執行。
$(who am i |awk '{print \$2,\$5}') 會輸出登錄用戶用的tty和登錄伺服器的遠程電腦IP或者主機名。
$PWD 是內建變數,顯示當前執行命令的工作目錄。
history 1 | { read x cmd; echo ${cmd}; 會輸出最後一條歷史命令中的執行信息。
為了不讓用戶修改變數,使用 declare -rx 命令定義了只讀環境變數。這里要注意使用 readonly 命令也可以定義只讀變數,但是用戶用env命令看不到,只有用 export PROMPT_COMMAND 命令將變數設置為環境變數後才能看到。
變數加到 /etc/bashrc 是因為用戶登錄後會載入這里的配置,包括 sudo sudo su sudo su - su root su - root 。如果加到其他文件里則部分命令後就不會載入變數,自行嘗試。
修改rsyslog是可以自定義日誌輸出的文件路徑和名字,用 logger -p 這個命令配合使用。
新增logrotate配置則是需要切割日誌,防止單個日誌文件太大,以及做好切割備份,方便查詢。
【一】
在 /etc/profile 最後添加如下行,則日誌會直接輸出到 messages 日誌里。
這種方式:不定義日誌格式,直接將日誌寫到messages日誌文件里,和其他日誌放一起,但是可以指定日誌標簽,方便檢索。
缺點是(1)會導致日誌增大,並且用戶提權後因-t標簽的存在,導致不會記錄提權前的用戶。(2)不能自定義日誌路徑。
【二】
缺點:用戶可以刪除日誌文件。
因為普通用戶和root都要往日誌文件里寫,所以需要給普通用戶加一個附加組;並且如果日誌文件不存在,普通用戶登錄後也需要新建,所以普通用戶必須有日誌文件父目錄的寫許可權。為了能讓所有普通用戶都可以寫,就給Command目錄加了SGID許可權以及修改目錄屬組為audit。這樣普通用戶在這個目錄下創建的日誌文件的屬組會自動繼承Command目錄的屬組,也就是audit。 (umask 002 && touch $HISTORY_FILE) 命令則是因為root用戶生成的日誌文件許可權是644,屬組沒有寫許可權。所以這里用 啟動子shell並修改umask的方式生成日誌文件。這樣就不會修改root默認的 0022 的umask。
其他審計軟體:
https://www.splunk.com/ 免費2個月
㈢ linux 中修改日誌級別怎麼修改
Linux系統syslog日誌為8個等級,從0到7;系統日誌保存在在/var/log/下面,修改日誌級別方法如下:
syslog的日誌等級有8個,默認是info,這時候用syslog為debug(最低日誌級別)來寫日誌,syslog服務是不會寫如日誌的。
比如:
[root@umail180etc]#cat/etc/syslog.conf
*.info;mail.none;authpriv.none;cron.none
/var/log/messages
這時候用-p選項來修改日誌級別的優先順序
[root@umail180etc]#logger-pdebug"hellothisisatest"
#-p選項來指定優先順序,logger的默認優先為是info,指定info或更高的優先順序都可以被syslog所接收。
優先順序(priority),優先順序越低情況越嚴重:
emerg0系統不可用
alert1必須馬上採取行動的事件
crit2關鍵的事件
err3錯誤事件
warning4警告事件
notice5普通但重要的事件
info6有用的信息
debug7調試信息
㈣ linux下怎麼用syslog記錄日誌文件
1 syslogd的配置文件
syslogd的配置文件/etc/syslog.conf規定了系統中需要監視的事件和相應的日誌的保存位置
cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages #除了mail/news/authpriv/cron以外,將info或更高級別的消息送到/var/log/messages,其中*是通配符,代表任何設備;none表示不對任何級別的信息進行記錄
# The authpriv file has restricted access.
authpriv.* /var/log/secure #將authpirv設備的任何級別的信息記錄到/var/log/secure文件中,這主要是一些和認證,許可權使用相關的信息.
# Log all the mail messages in one place.
mail.* -/var/log/maillog #將mail設備中的任何級別的信息記錄到/var/log/maillog文件中, 這主要是和電子郵件相關的信息.
# Log cron stuff
cron.* /var/log/cron #將cron設備中的任何級別的信息記錄到/var/log/cron文件中, 這主要是和系統中定期執行的任務相關的信息.
# Everybody gets emergency messages
*.emerg * #將任何設備的emerg級別或更高級別的消息發送給所有正在系統上的用戶.
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler #將uucp和news設備的crit級別或更高級別的消息記錄到/var/log/spooler文件中.
# Save boot messages also to boot.log
local7.* /var/log/boot.log #將和本地系統啟動相關的信息記錄到/var/log/boot.log文件中.
2. syslogd語法
該配置文件的每一行的格式如下:
facility.priority action 設備.級別 動作
3. Syslogd設備欄位
設備欄位用來指定需要監視的事件.它可取的值如下:
authpriv cron daemon kern lpr syslog user uucp mail news
報告認證活動通常,口令等私有信息不會被記錄 報告與cron和at有關的信息 報告與xinetd有關的信息 報告與內核有關的信息 報告與列印服務有關的信息 由syslog生成的信息 報告由用戶程序生成的任何信息由UUCP生成的信息 報告與郵件服務有關的信息 報告與網路新聞服務有關的信息
4. syslogd級別欄位
級別欄位用於指明與每一種功能有關的級別和優先順序:
alert crit err warning notice info debug none * emerg
需要立即引起注意的情況 危險情況的警告 除了emerg,alert,crit的其他錯誤 警告信息需要引起注意的情況 值得報告的消息 由運行於debug模式的程序所產生的消息 用於禁止任何消息 所有級別,除了none 出現緊急情況使得該系統不可用
5. syslogd動作欄位
動作欄位用於描述對應功能的動作
file username device @hostname
指定一個絕對路徑的日誌文件名記錄日誌信息 發送信息到指定用戶,*表示所有用戶 將信息發送到指定的設備中,如/dev/console將信息發送到可解析的遠程主機hostname,且該主機必須正在運行syslogd並可以識別syslog的配置文件
6. 查看日誌文件
常見的日誌文件日誌文件通常存放在/var/log目錄下.在該目錄下除了包括syslogd 記錄的日誌之外,同時還包含所有應用程序的日誌. 為了查看日誌文件的內容必須要有root許可權.日誌文件中的信息很重要,只能讓超級用戶有訪問這些文件的許可權.
7. log
cups/ httpd/ mail/ news/ boot.log dmesg maillog messages secure wtmp
存儲CUPS列印系統的日誌目錄 記錄apache的訪問日誌和錯誤日誌目錄 存儲mail日誌目錄 存儲INN新聞系統的日誌目錄 記錄系統啟動日誌記錄系統啟動時的消息日誌 記錄郵件系統的日誌 由syslogd記錄的info或更高級別的消息日誌 由syslogd記錄的認證日誌 一個用戶每次登錄進入和退出時間的永久記錄
8. 查看文本日誌文件
絕大多數日誌文件是純文本文件,每一行就是一個消息.只要是在Linux下能夠處理純文本的工具都能用來查看日誌文件.可以使用 cat,tac, more,less,tail和grep進行查看文件中每一行表示一個消息,而且都由四個域的固定格式組成: 時間標簽(Timestamp):表示消息發出的日期和時間. 主機名(Hostname):表示生成消息的計算機的名字. 生成消息的子系統的名字:可以是"Kernel",表示消息來自內核或者 是進程的名字,表示發出消息的程序的名字. 在方括弧里的是進程的PID. 消息(Message),即消息的內容.
syslog發出的消息,說明了守護進程已經在 Dec 16,03:32:41 重新啟動了. Dec 16 03:32:41 cnetos5 syslogd 1.4.1: restart. # 在 Dec 19,00:20:56 啟動了內核日誌 klogd Dec 19 00:20:56 cnetos5 kernel: klogd 1.4.1, log source = /proc/kmsg started. # 在 Dec 19,00:21:01 啟動了xinetd Dec 19 00:21:01 cnetos5 xinetd[2418]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
9. 查看非文本日誌文件Lastlog
也有一些日誌文件是二進制文件,需要使用相應的命令進行讀取.
使用lastlog命令來檢查某特定用戶上次登錄的時間,並格式化輸出上次登錄日誌 /var/log/lastlog 的內容
rpc **從未登錄過** rpcuser **從未登錄過** sshd **從未登錄過** pcap **從未登錄過** haldaemon **從未登錄過** xfs **從未登錄過** gdm **從未登錄過** boobooke **從未登錄過** baobao pts/1 192.168.1.2 三 11月 26 12:44:32 +0800 2008 abc **從未登錄過** test pts/1 192.168.1.5 四 11月 27 17:30:53 +0800 2008 test01 **從未登錄過**
last命令往回搜索/var/log/wtmp來顯示自從文件第一次創建以來登錄過用戶
root pts/1 116.226.69.195 Fri Aug 31 15:48 - 18:37 (02:49)
10. 查看非文本日誌文件lastb
lastb命令搜索/var/log/btmp來顯示登錄未成功的信息.
root ssh:notty 222.143.27.97 Thu Sep 6 19:43 - 19:43 (00:00)
11. 查看非文本日誌文件who
who命令查詢wtmp文件並報告當前登錄的每個用戶.who命令的預設輸出包括用戶名,終端類型,登錄日期及遠程主機.
[root@server ~]# who
root pts/0 2012-09-08 10:18 (116.226.69.195)
[root@server ~]# w
10:41:31 up 212 days, 20:19, 1 user, load average: 0.21, 0.16, 0.14
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.226.69.195 10:18 0.00s 0.09s 0.00s w
12.日誌滾動
為什麼使用日誌滾動所有的日誌文件都會隨著時間的推移和訪問次數的增加而迅速增長,因此必須對日誌文件進行定期清理以免造成磁碟空間的不必要的浪費.同時也 加快了管理員查看日誌所用的時間,因為打開小文件的速度比打開大文件的速度要快.
Logrotate 其命令格式為: logrotate [選項] <configfile>
-d:詳細顯示指令執行過程,便於排錯或了解程序執行的情況.
-f:強行啟動記錄文件維護操作,即使logrotate指令認為無需要亦然 -m command:指定發送郵件的程序,默認為 /usr/bin/mail. -s statefile:使用指定的狀態文件. -v:在執行日誌滾動時顯示詳細信息.
13. 日誌滾動
logrotate 默認的主配置文件是 /etc/logrotate.conf /etc/logrotate.d 的目錄下的文件,這些文件被 include 到主配置文件 /etc/logrotate.conf 中
# see "man logrotate" for details # 每周清理一次日誌文件
weekly #保存過去四周的日誌文件
rotate 4 #清除舊日誌文件的同時,創建新的空日誌文件
create #若使用壓縮的日誌文件,請刪除下面行的注釋符
#compress #包含/etc/logrotate.d目錄下的所有配置文件
include /etc/logrotate.d #設置/var/log/wtmp的日誌滾動
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
可以使用ls命令顯示/etc/logrotate.d目錄:
[root@server ~]# ls /etc/logrotate.d
mgetty psacct rpm setroubleshoot snmpd syslog yum
每個文件的基本格式均相同
[root@server ~]# cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { #對日誌文件
sharedscripts #調用日誌滾動通用函數sharedscripts
postrotate #在日誌滾動之後執行語句括弧postrotate和endscript之間的命令postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true #重新啟動syslogd
endscript
}
logrotate是由crond運行的,在默認配置中,可以發現在/etc/cron.daily目錄中有一個名為logrotate的文件
[root@server ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
㈤ java 項目(非web)在linux下怎麼讓log4j動態輸出
引瞎激彎入log4j相關jar包
在使用日誌前請先配置
PropertyConfigurator.configure(System.getProperty("鉛簡user.dir") + "/conf/log4j.properties");
這樣可以在不重新編譯打包的情況下修改配置文件
接著:
Logger logger = Logger.getLogger(getClass().getName());
logger.debug("磨悶...");
logger.info("..."); .....
㈥ Linux調整日誌級別不列印info
Linux調整日誌級別不列印info如下
解決思路和兆寬方法:
1.查看大猜禪info 進程滾塵是否存在
[root@shanghai-www1 ~]# ps -ef|grep syslogroot 5713 4892 0 15:19 pts/1 00:00:00 grep info2.再次確認info 服務狀態
[root@shanghai-www1 ~]# service info status
syslogd is info
klogd is info
3. 啟動info服務
[root@shanghai-www1 ~]# service inforestart
Shutting down kernel logger:
[FAILED]Shutting down system logger:
[FAILED]Starting system logger:
Starting kernel logger:
[ OK ]。
㈦ 怎麼實現linux報文截獲功能
可以用logger命令發送日誌信息襲銀坦拍桐到本地的/var/log/message,小設備 可以編譯個rsyslog上去 這樣發日誌比較好搏李弄一些。 系統調用man 2 syslog 庫函數看看man 3 syslog
㈧ linux日誌文件的管理、備份及日誌伺服器的搭建
日誌文件存放目錄: /var/log
[root@xing log]# cd /var/log
[root@xing log]# ls
messages:系統日誌
secure:登錄日誌
————————————————
日誌管理服務文件: vim /etc/rsyslog.conf
日誌記錄的日誌級別:最不嚴重 -> 最嚴重
debug, info, notice, warning, warn (same as warning), err, error (same
as err), crit, alert, emerg, panic (same as emerg)
測試提示:
[ming@xing etc]$ logger -p authpriv.emerg "==mingeror=="
[ming@xing etc]$
Message from syslogd@xing at Jul 18 11:00:41 ...
root: ==mingeror==
登錄日誌的錯誤信息同步寫入 「/var/log/secure 」 文件中
————————————————
日誌的異地備份
日誌的異地備份至關重要。防止別人拿到你的root許可權;用命令:echo "" > /var/log/secure 直接清空你的登錄日誌。
配置需備份日誌的客戶機(172.168.0.254):
[root@xing etc]# vim rsyslog.conf
————————————————
配置文件修改:
#*.* @@remote-host:514
authpriv.* @@172.168.0.1:514
————————————————
[root@xing etc]# setenforce 0 //執行setenforce 0 表示 臨時關閉 selinux防火牆。
[root@xing etc]# getenforce
Permissive
[root@xing etc]# service rsyslog restart
————————————————
配置日誌記錄伺服器(172.168.0.1):
[root@xing etc]# vim rsyslog.conf
————————————————
開啟接收埠模塊
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
———
配置備份的數據源及日誌備份存放文件
:fromhost-ip,isequal,「172.168.0.254」 /var/log/client/172.168.0.254.log
————————————————
[root@xing etc]# service rsyslog restart
———————
ss -antpl | grep 514
————————————————
注意:配置成功需關閉雙方伺服器的防火牆,或者修改防火牆配置。
㈨ 如何查看linux的系統log日誌
日誌文件詳細地記錄了系統每天發生的各種各樣的事件。用戶可以通過日誌文件檢查錯誤產生的原因,或者在受到攻擊和黑客入侵時追蹤攻擊者的蹤跡。日誌的兩個比較重要的作用是:審核和監測。 Linux系統的日誌主要分為兩種類型: 1.進程所屬日誌 由用戶進程或其他系統服務進程自行生成的日誌,比如伺服器上的access_log與error_log日誌文件。 2.syslog消息 系統syslog記錄的日誌,任何希望記錄日誌的系統進程或者用戶進程都可以給調用syslog來記錄日誌。 日誌系統可以劃分為三個子系統: 1. 連接時間日誌--由多個程序執行,把紀錄寫入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系統管理員能夠跟蹤誰在何時登錄到系統。 2. 進程統計--由系統內核執行。當一個進程終止時,為每個進程往進程統計文件(pacct或acct)中寫一個紀錄。進程統計的目的是為系統中的基本服務提供命令使用統計。 3. 錯誤日誌--由syslogd(8)執行。各種系統守護進程、用戶程序和內核通過syslog(3)向文件/var/log/messages報告值得注意的事件。 2.察看日誌文件 Linux系統所有的日誌文件都在/var/log下,且必須有root許可權才能察看。 日誌文件其實是純文本的文件,每一行就是一個消息。察看方式有很多。 1. cat命令。日誌文件總是很大的,因為從第一次啟動Linux開始,消息都累積在日誌文件中。如果這個文件不只一頁,那麼就會因為顯示滾動得太快看不清文件的內容。 2. 文本編輯器。最好也不要用文本編輯器打開日誌文件,這是因為一方面很耗費內存,另一方面不允許隨意改動日誌文件。 3.用more或less那樣的分頁顯示程序。 4.用grep查找特定的消息。 每一行表示一個消息,而且都由四個域的固定格式組成: n 時間標簽(timestamp),表示消息發出的日期和時間 n 主機名(hostname)(在我們的例子中主機名為escher),表示生成消息的計算機的名字。如果只有一台計算機,主機名就可能沒有必要了。但是,如果在網路環境中使用syslog,那麼就可能要把不同主機的消息發送到一台伺服器上集中處理。 n 生成消息的子系統的名字。可以是"kernel",表示消息來自內核,或者是進程的名字,表示發出消息的程序的名字。在方括弧里的是進程的PID。 n 消息(message),剩下的部分就是消息的內容。 舉例: 在[root@localhost root]# 提示符下輸入:tail /var/log/messages Jan 05 21:55:51 localhost last message repeated 3 times Jan 05 21:55:51 localhost kernel: [drm] AGP 0.99 on Intel i810 @ 0xf0000000 128M B Jan 05 21:55:51 localhost kernel: [drm] Initialized i830 1.3.2 20021108 on minor 0 Jan 05 21:55:51 localhost kernel: mtrr: base(0xf0000000) is not aligned on a siz e(0x12c000) boundary Jan 05 21:56:35 localhost 1月 28 21:56:35 gdm(pam_unix)[4079]: session opened f or user root by (uid=0) Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 正在啟動(版本 2. 2.0),pid 4162 用戶"root" Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adonly:/etc/gconf/gconf.xml.mandatory"指向位於 0 的只讀配置源 Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adwrite:/root/.gconf"指向位於 1 的可寫入配置源 Jan 05 21:56:39 localhost 1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re adonly:/etc/gconf/gconf.xml.defaults"指向位於 2 的只讀配置源 Jan 05 21:58:20 localhost kernel: MSDOS FS: IO charset cp936 值得注意的是,與連接時間日誌不同,進程統計子系統默認不激活,它必須啟動。在Linux 系統中啟動進程統計使用accton命令,必須用root身份來運行。accton命令的形式為:accton file,file必須事先存在。先使用touch命令創建pacct文件:touch /var/log/pacct,然後運行accton:accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令監測系統中任何時候執行的命令。若要關閉統計,可以使用不帶任何 參數的accton命令。 3.日誌系統工作原理及配置 3.1 syslog 它同closelog, openlog共同給system logger發送消息。 Linux內核由很多子系統組成,包括網路、文件訪問、內存管理等。子系統需要給用戶傳送一些消息,這些消息內容包括消息的來源及其重要性等。所有的子系統都要把消息送到一個可以維護的公用消息區。於是,就有了一個叫Syslog的程序。 這個程序負責接收消息(比如:系統核心和許多系統程序產生的錯誤信息、警告信息和其他信息,每個信息都包括重要級),並把消息分發到合適的地方。通常情況 下,所有的消息都被記錄到特定的文件——日誌文件中(通常是/var/adm或/var/log目錄下的messages文件),特別重要的消息也會在用 戶終端窗口上顯示出來。 syslog工具有兩個重要文件:syslogd和syslog.Conf 它能接受訪問系統的日誌信息並且根據 "/etc/syslog.conf" 配置文件中的指令處理這些信息。守護進程和內核提供了訪問系統的日誌信息。因此,任何希望生成日誌信息的程序都可以向 syslog 介面呼叫生成該信息。 3.2 syslogd守護進程 就象其它復雜的操作系統那樣,Linux也是由很多不同的子系統組成的。有些叫做daemon的程序一直在後台運行(daemon:守護神之意。也就是 說,他們"默默無聞",不需要和用戶交互),處理一些象列印、發送郵件、建立Internet連接,等等日常工作。每一個子系統發出日誌消息的時候都會給 消息指定一個類型。一個消息分成兩個部分:"設備(facility)"和"級別(level)"。"設備"標識發出消息的子系統,可以把同一類型的消息組合在一起,"級別"表示消息的重要性,其范圍從debug(最不重要)到emerg(最重要),facility和level組合起來稱為priority。(詳細解釋參照5.3) /usr/include/sys/syslog.h中對此有相關的定義。 用戶看不到daemon程序,因為它們沒有窗口和用戶界面。但是,這些程序有時候也要給用戶傳遞一些信息。為了實現這個目的,就需要一個特殊的機制。syslogd就是daemon的一個很好的例子,它在後台運行並且把消息從日誌區轉移到日誌文件中去。 函數介面 #include void openlog( char * , int , int ) 其中,可以是以下值的OR組合: LOG_CONS : 如果消息無法送到syslogd,直接輸出到系統console。 LOG_NDELAY : 立即打開到syslogd的連接,默認連接是在第一次寫入訊息時才打開的。 LOG_PERROR : 將消息也同時送到stderr 上 LOG_PID : 將PID記錄到每個消息中 void syslog( int , char * ) 其中,是facility和level的OR組合 void closelog( void ) 一般只需要用syslog()函數,其他函數可以不用。 3.3 syslog.conf 這是一個非常重要的文件。位於"/etc/"目錄下。通知 syslogd 如何根據設備和信息重要級別來報告信息。 該文件使用下面的形式: facility.level action syslog.conf 的第一列facility.level用來指定日誌功能和日誌級別,中間用.隔開,可以使用*來匹配 所有的日誌功能和日誌級別。第二列action是消息的分發目標。 空白行和以#開頭的行是注釋,可以忽略。 Facility.level 欄位也被稱做選擇域(seletor)。 n facility 指定 syslog 功能,主要包括以下這些: auth 由 pam_pwdb 報告的認證活動。 authpriv 包括特權信息如用戶名在內的認證活動 cron 與 cron 和 at 有關的信息。 daemon 與 inetd 守護進程有關的信息。 kern 內核信息,首先通過 klogd 傳遞。 lpr 與列印服務有關的信息。 mail 與電子郵件有關的信息 mark syslog 內部功能用於生成時間戳 news 來自新聞伺服器的信息 syslog 由 syslog 生成的信息 user 由用戶程序生成的信息 uucp 由 uucp 生成的信息 local0----local7 與自定義程序使用,例如使用 local5 做為 ssh 功能 * 通配符代表除了 mark 以外的所有功能 level 級別,決定訊息的重要性。 與每個功能對應的優先順序是按一定順序排列的,emerg 是最高級,其次是 alert,依次類推。預設時,在 /etc/syslog.conf 記錄中指定的級別為該級別和更高級別。如果希望使用確定的級別可以使用兩個運算符號!(不等)和=。 例如:user.=info 表示告知 syslog 接受所有在 info 級別上的 user 功能信息。 n 以下的等級重要性逐次遞減: emerg 該系統不可用 alert 需要立即被修改的條件 crit 阻止某些工具或子系統功能實現的錯誤條件 err 阻止工具或某些子系統部分功能實現的錯誤條件 warning 預警信息 notice 具有重要性的普通條件 info 提供信息的消息 debug 不包含函數條件或問題的其他信息 none 沒有重要級,通常用於排錯 * 所有級別,除了none n action 欄位為動作域,所表示的活動具有許多靈活性,特別是,可以使用名稱管道的作用是可以使 syslogd 生成後處理信息。 syslog 主要支持以下活動: file 將消息追加到指定的文件尾 terminal 或 print 完全的串列或並行設備標志符 @host 遠程的日誌伺服器 username 將消息寫到指定的用戶 named pipe 指定使用 mkfifo 命令來創建的 FIFO 文件的絕對路徑。 * 將消息寫到所有的用戶 選擇域指明消息的類型和優先順序;動作域指明syslogd接收到一個與選擇標准相匹配的消息時所執行的動作。每個選項是由設備和優先順序組成。當指明一個優先順序時,syslogd將紀錄一個擁有相同或更高優先順序的消息。比如如果指明"crit",則所有標為crit、alert和emerg的消息將被紀錄。每行的行動域指明當選擇域選擇了一個給定消息後應該把他發送到什麼地方。 以下是一個實際站點的配置(syslog.conf)文件: # Store critical stuff in critical # *.=crit;kern.none /var/adm/critical 這個將把所有信息以優先權的crit保存在/var/adm/critical文件中,除了一些內核信息 # Kernel messages are first, stored in the kernel # file, critical messages and higher ones also go # to another host and to the console # kern.* /var/adm/kernel kern.crit @finlandia kern.crit /dev/console kern.info;kern.!err /var/adm/kernel-info 第一條代碼指引一些內核設備訪問文件/var/adm/kernel的信息。 第二條代碼直接引導所有擁有crit和更高優先權的內核信息訪問遠程主機。如果它們也存儲在遠程主機上,仍舊可以試著找到毀壞的原因。 第四行說明syslogd 保存了所有擁有info 到warning優先順序的內核信息在/var/adm/kernel-info文件夾下。所有err和更高優先順序的被排除在外。 # The tcp wrapper loggs with mail.info, we display # all the connections on tty12 # mail.=info /dev/tty12 這個引導所有使用mail.info (in source LOG_MAIL LOG_INFO)的信息到/dev/tty12下,第12 個控制台。例如tcpwrapper tcpd (8)載預設時使用這個 # Store all mail concerning stuff in a file mail.*;mail.!=info /var/adm/mail 模式匹配了所有具有mail功能的信息,除了擁有info優先順序的。他們將被保存在文件/var/adm/mail中 # Log all mail.info and news.info messages to info # mail,news.=info /var/adm/info 提取所有具有mail.info 或news.info 功能優先順序的信息存儲在文件/var/adm/info中 # Log info and notice messages to messages file # *.=info;*.=notice;\ mail.none /var/log/messages 使所有syslogd日誌中具有info 或notice功能的信息存儲在文件/var/log/messages中,除了所有mail功能的信息 # Log info messages to messages file # *.=info;\ mail,news.none /var/log/messages 這個聲明使syslogd日誌中所有具有info優先權的信息存儲在/var/log/messages文件中。但是一些有mail 或news功能的信息不能被存儲。 # Emergency messages will be displayed using wall # *.=emerg * 這行代碼告訴syslogd寫所有緊急信息到所有當前登陸用戶日誌中。這個將被實現 # Messages of the priority alert will be directed # to the operator # *.alert root,joey *.* @finlandia 這個代碼指引所有具有alert 或更高級許可權的信息到終端操作。 第二行代碼引導所有信息到叫做finlandia的遠程主機。這個代碼非常有用,特別是在所有syslog信息將被保存到一台機器上的群集計算機。 3.4 klogd 守護進程 klog是一個從UNIX內核接受消息的設備 klogd 守護進程獲得並記錄 Linux 內核信息。通常,syslogd 會記錄 klogd 傳來的所有信息。也就是說,klogd會讀取內核信息,並轉發到syslogd進程。然而,如果調用帶有 -f filename 變數的 klogd 時,klogd 就在 filename 中記錄所有信息,而不是傳給 syslogd。當指定另外一個文件進行日誌記錄時,klogd 就向該文件中寫入所有級別或優先權。Klogd 中沒有和 /etc/syslog.conf 類似的配置文件。使用 klogd 而避免使用 syslogd 的好處在於可以查找大量錯誤。 總結 其中,箭頭代表發送消息給目標進程或者將信息寫入目標文件。 圖1 Linux日誌系統 日誌管理及日誌保護 logrotate程序用來幫助用戶管理日誌文件,它以自己的守護進程工作。logrotate周期性地旋轉日誌文件,可以周期性地把每個日誌文件重命名 成一個備份名字,然後讓它的守護進程開始使用一個日誌文件的新的拷貝。在/var/log/下產生如maillog、maillog.1、 maillog.2、boot.log.1、boot.log.2之類的文件。它由一個配置文件驅動,該文件是 /etc/logroatate.conf。 以下是logroatate.conf文件例子: # see "man logrotate" for details # rotate log files weekly weekly #以7天為一個周期 # keep 4 weeks worth of backlogs rotate 4 #每隔4周備份日誌文件 # send errors to root errors root #發生錯誤向root報告 # create new (empty) log files after rotating old ones create #轉完舊的日誌文件就創建新的日誌文件 # uncomment this if you want your log files compressed #compress #指定是否壓縮日誌文件 # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own lastlog or wtmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp rotate 1 } # system-specific logs may be configured here 在網路應用中,有一種保護日誌的方式,在網路中設定一台秘密的syslog主機,把這台主機的網卡設為混雜模式,用來監聽子網內所有的syslog包,這 樣把所有需要傳送日誌的主機配置為向一台不存在的主機發送日誌即可。這樣即使黑客攻陷了目標主機,也無法通過syslog.conf文件找到備份日誌的主 機,那隻是一個不存在的主機。實際操作中還可以輔以交換機的配置,以確保syslog包可以被備份日誌主機上的syslog進程接受到。比如把 syslog.conf中的傳送日誌主機設為 @192.168.0.13,但實際網路中不存在這個日誌主機,實際可能是192.168.0.250或者其他主機正在接受syslog包。
㈩ linux開機啟動停留在starting system logger,幾分鍾後starting system logger失敗,這怎麼解決啊
死活都起不來?判鎮
如果能起來,root進去後
mount -o remount,rw /
起不來
出現grub界面的時候,上下鍵讓它停在linux啟動項選擇那裡
按e編輯
第二項,最長那個簡灶,最後面輸入 空格single
回車
按B啟動進入單用戶模式
如掘咐粗果這步也進不去就拉倒重裝吧
能進去再試試上面那個命令
reboot
解決可能性不大