1. 程式人生 > >記錄Python指令碼的執行日誌

記錄Python指令碼的執行日誌

一、logging模組

Python中有一個模組logging,可以直接記錄日誌

#   日誌級別
# CRITICAL 50
# ERROR    40
# WARNING  30
# INFO     20
# DEBUG    10

logging.basicConfig()函式中的具體引數:
filename:   指定的檔名建立FiledHandler,這樣日誌會被儲存在指定的檔案中;
filemode:   檔案開啟方式,在指定了filename時使用這個引數,預設值為“w”還可指定為“a”;
format:      指定handler使用的日誌顯示格式;
datefmt:    指定日期時間格式。,格式參考strftime時間格式化(下文)
level:        設定rootlogger的日誌級別
stream:     用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案,預設為sys.stderr。
                  若同時列出了filename和stream兩個引數,則stream引數會被忽略。

format引數中可能用到的格式化資訊:

%(name)s

Logger的名字

%(levelno)s

數字形式的日誌級別

%(levelname)s

文字形式的日誌級別

%(pathname)s

呼叫日誌輸出函式的模組的完整路徑名,可能沒有

%(filename)s

呼叫日誌輸出函式的模組的檔名

%(module)s

呼叫日誌輸出函式的模組名

%(funcName)s

呼叫日誌輸出函式的函式名

%(lineno)d

呼叫日誌輸出函式的語句所在的程式碼行

%(created)f

當前時間,用UNIX標準的表示時間的浮 點數表示

%(relativeCreated)d

輸出日誌資訊時的,自Logger建立以 來的毫秒數

%(asctime)s

字串形式的當前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒

%(thread)d

執行緒ID。可能沒有

%(threadName)s

執行緒名。可能沒有

%(process)d

程序ID。可能沒有

%(message)s

使用者輸出的訊息

二、logging模組測試

1、列印日誌到標準輸出中

import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')

輸出結果

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe D:/pyworkpeace/tupian.py 'https://www.tianyancha.com/login'
WARNING:root:warning message

Process finished with exit code 0
可以看出預設情況下Python的logging模組將日誌列印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌。預設的日誌的格式為:

日誌級別:Logger名稱:使用者輸出訊息

2、將日誌檔案輸入到檔案中

import os
logging.basicConfig(filename=os.path.join(os.getcwd(),'log.txt'),level=logging.DEBUG)
logging.debug('this is a message')

執行這三行程式碼後會在安裝Python的目錄中出現一個log.txt檔案,檔案內容

DEBUG:root:this is a message
DEBUG:root:debug message

3、自定義格式,輸出日誌檔案

# -*-coding:utf-8-*-

import logging


def console_out(logFilename):
    ''''' Output log to file and console '''
    # Define a Handler and set a format which output to file
    logging.basicConfig(
        level=logging.DEBUG,  # 定義輸出到檔案的log級別,大於此級別的都被輸出
        format='%(asctime)s  %(filename)s : %(levelname)s  %(message)s',  # 定義輸出log的格式
        datefmt='%Y-%m-%d %A %H:%M:%S',  # 時間
        filename=logFilename,  # log檔名
        filemode='w')  # 寫入模式“w”或“a”
    # Define a Handler and set a format which output to console
    console = logging.StreamHandler()  # 定義console handler
    console.setLevel(logging.INFO)  # 定義該handler級別
    formatter = logging.Formatter('%(asctime)s  %(filename)s : %(levelname)s  %(message)s')  # 定義該handler格式
    console.setFormatter(formatter)
    # Create an instance
    logging.getLogger().addHandler(console)  # 例項化新增handler

    # Print information              # 輸出日誌級別
    logging.debug('logger debug message')
    logging.info('logger info message')
    logging.warning('logger warning message')
    logging.error('logger error message')
    logging.critical('logger critical message')


if __name__ == "__main__":
    console_out('logging.log')

輸出結果:

此時也會自動生成一個日誌檔案,日誌檔案和執行檔案在同一個資料夾中,檔名logging.log

2017-10-23 Monday 11:37:59 hgghf : DEBUG logger debug message
2017-10-23 Monday 11:37:59 hgghf : INFO logger info message
2017-10-23 Monday 11:37:59 hgghf : WARNING logger warning message
2017-10-23 Monday 11:37:59 hgghf : ERROR logger error message
2017-10-23 Monday 11:37:59 hgghf : CRITICAL logger critical message

修改輸出路徑:

filename='/tmp/test1.log',  # log檔名
當將指令碼中這行程式碼換一下,那麼我們輸出日誌的路徑地址就換成了D:\tmp
下面的方式同樣可以達到上述結果

 4、自定義輸出位置

import logging  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  
                    datefmt='%a, %d %b %Y %H:%M:%S',  
                    filename='/tmp/test.log',  
                    filemode='w')  
  
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message') 

由於執行指令碼放在D:\pyworkpeace\下,輸出檔案在D盤tmp資料夾下test.log,內容如下:

Mon, 23 Oct 2017 15:00:05 tupian.py[line:11] DEBUG debug message
Mon, 23 Oct 2017 15:00:05 tupian.py[line:12] INFO info message
Mon, 23 Oct 2017 15:00:05 tupian.py[line:13] WARNING warning message
Mon, 23 Oct 2017 15:00:05 tupian.py[line:14] ERROR error message
Mon, 23 Oct 2017 15:00:05 tupian.py[line:15] CRITICAL critical message

三、Logger,Handler,Formatter,Filter的概念

相關推薦

記錄Python指令碼執行日誌

一、logging模組 Python中有一個模組logging,可以直接記錄日誌 # 日誌級別 # CRITICAL 50 # ERROR 40 # WARNING 30 # INFO 20 # DEBUG 10 logging.basicCo

生產級部署 Python 指令碼日誌收集、崩潰自啟,一鍵搞定

今天介紹一個生產級的流程管理工具 PM2,通常我們說到 PM2 的時候,都是在說如何部署 Node.js 程式,但是實際上 PM2 很強大,不僅僅可以用來管理 Node.js,它還可以用來管理 Python、PHP、Ruby、perl 等等。 這裡就以 Python 舉

利用python指令碼執行tcpdump抓包,支援傳參、併發抓取多個包、檔案迴圈覆蓋抓取

#!/usr/bin/env python # AUTH: [email protected] """ tcpdump -i any -s 0 -w /opt/log/tcpdump/2018-07-19--10-43-30.pcap tcp and

Python 指令碼執行過程

Python是指令碼語言,簡單方便,缺點是執行速度慢,不能對程式碼進行加密,跨平臺,可以在互動式環境下執行也可以在整合環境下執行。Python有兩個版本,但是兩個版本不相容指令碼執行過程1、Python的執行過程在執行Python檔案時,直譯器會先將程式碼進行解釋,解釋後的結

解決Oracle缺少動態連結庫cannot open shared object file: No such file o;解決 Linux中python指令碼執行無問題,配置crontab定時任務報錯

注:該問題的本質是:缺少動態連結庫 20181030更: 在另一臺伺服器再次遇到類似的問題,也是直接執行python指令碼無問題,在crontab中報錯: ImportError: libclntsh.so.11.1: cannot open shared ob

crontab 中 python 指令碼執行失敗的解決方法

寫伺服器程式的免不了要經常和 crontab 打交道,定時執行一些指令碼什麼的。大部分情況下都是 bash 的一些 shell 指令碼,但 shell 我不是很熟悉,於是在很多情況下都直接寫 Python 指令碼來搞定它。今天寫了一個操作 PostgreSQL 資料庫的 P

【mysql資料庫】python指令碼執行SQL語句,關於字串變數的注意事項

轉載一篇網友介紹Python 資料庫的Connection、Cursor兩大物件,寫的非常好。 https://blog.csdn.net/guofeng93/article/details/53994112 最新在使用python操作資料庫,發現使用cursor.exec

【已解決】Python指令碼執行出現語法錯誤:IndentationError: unindent does not match any outer indentation level

原創出處:http://www.crifan.com/python_syntax_error_indentationerror/comment-page-1/ 【問題】  一個python指令碼,本來都執行好好的,然後寫了幾行程式碼,而且也都確保每行都對齊了,但是執行的

python指令碼執行時報ImportError: No module named MySQLdb的處理

一.問題描述 執行py指令碼時,提示ImportError: No module named MySQLdb錯誤,如下: [[email protected] sh]# python 1.py Traceback (most recent call last):

Python指令碼執行Mysql語句遇到死鎖問題

關於執行指令碼出行死鎖問題現象展示 以下是第一次遇到這種問題,本人的分析過程。 a. 初步排查 對每個執行段落進行try....catch捕獲異常,先定位問題出現區域,接著對問題定位發現如下。

在windows下使用python指令碼執行cmd命令

1、python執行cmd命令主要有兩種方式:(1)python的OS模組。  OS模組呼叫CMD命令有兩種方式:os.popen(),os.system(). 都是用當前程序來呼叫。  os.system是無法獲取返回值的。當執行結束後接著往下面執行程式。用法如:OS.sy

Python 指令碼執行時Segmentation fault (core dumped)

問題如題描述,python 執行過程中直接導致python 直譯器崩潰(不是異常,直接崩潰),下面簡敘一下debug過程: google查詢結果顯示這種情況多數是因為Python裡的C擴充套件導致(訪問了非法記憶體區域,可能和C自身記憶體管理機制有關),而且

使用python指令碼執行地理處理工具

桌面ArcGIS包含800多種可在Python指令碼中執行的地理處理工具。 通過Python指令碼來執行地理處理工具,可以處理複雜的工作和執行批處理任務。 案例一:使用指令碼執行地理處理工具(以裁剪為例)         檢視幫助文件模仿的程式碼: 1 #

python執行程式進行日誌檔案記錄

import logging import psutil import os #設定一個日誌輸出檔案 log_filename="logging.txt" #設定日誌輸出格式 log_format=' [%(asctime)s] %(message)s' i=

Python中字串連線、刪除陣列中指定元素、記錄指令碼執行時間

1、Python中字串連線 a = "I am " b = 20 c = a + '%d'%b '%d'%b將b轉換成為字串格式,”+“對兩個字串進行拼接。 2、刪除陣列中指定元素 Python中陣列的使用:http://blog.163.com/jackylau_v/

Windows下執行python指令碼報錯“ImportError: No Module named ...”的解決方法

之前遇到一個問題,在Pycharm或IPython之類的IDE上執行指令碼正常,但是直接執行或cmd命令列執行的時候報了模組未能找到的 誤——ImportError: No Module named ...。 這是啥情況? Python在啟動直譯器(Interpreter)的時候

python實現AOP日誌記錄

前言 在Java中,AOP程式設計是一件比較通用方法,能夠少寫很多重複性的程式碼,讓程式自動幫我們完成,例如收集錯誤記錄,保證業務的事務性,無措提交,有錯回滾等。 最近寫了較多python程式碼,在python中,使用print 記錄日誌,但是每一個方法都要寫,比較麻煩,並且又不

python指令碼方式每分鐘生成日誌

vi generate.py 程式碼 #coding=UTF-8 import random import time # url url_paths = [ "class/112.html", "class/128.html", "class/145.html

python指令碼批量執行redis寫入操作

#!/usr/bin/python # -*- coding: UTF-8 -*- import os import time redisFile = open("redis.txt", "r") for cmd in redisFile.__iter__(): cmd = cmd.

jenkins執行python指令碼

最新在研究使用jenkins做升級釋出功能,大概的操作是選擇產品、模組、環境等引數後,執行一個python指令碼,指令碼獲取使用者選擇引數,然後執行釋出動作。 jenkins執行python指令碼,需要使用python plugin 具體使用方法: 1、安裝python plugin外掛