1. 程式人生 > >Python基於logger模組的日誌輸出系統

Python基於logger模組的日誌輸出系統

在我們日常的程式開發過程中免不了除錯,輸出除錯日誌到控制檯或者輸出到檔案。
Python的logging模組提供了通用的日誌系統,熟練使用logging模組可以方便開發者開發第三方模組或者是自己的Python應用。同樣這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如檔案,HTTP、GET/POST,SMTP,Socket等,甚至可以自己實現具體的日誌記錄方式。
Python中的logging模組與Java/Android中的log4j的機制是一樣的,只是具體的實現細節不同。logging模組提供logger,handler,filter,formatter。與log4j類似,logger,handler和日誌訊息的呼叫可以有具體的日誌級別(Level),只有在日誌訊息的級別大於logger和handler的級別。

logger:提供日誌介面,供應用程式碼使用。logger最長用的操作有兩類:配置和傳送日誌訊息。可以通過logging.getLogger(name)獲取logger物件,如果不指定name則返回root物件,多次使用相同的name呼叫getLogger方法返回同一個logger物件。
handler:將日誌記錄(log record)傳送到合適的目的地(destination),比如檔案,socket等。一個logger物件可以通過addHandler方法新增0到多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。
filter:提供一種優雅的方式決定一個日誌記錄是否傳送到handler。

formatter:指定日誌記錄輸出的具體格式。formatter的構造方法需要兩個引數:訊息的格式字串和日期字串,這兩個引數都是可選的。

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

import logging
import logging.handlers
   
class Logger():
    def __init__(self, tag="", filename="python.log", loglevel=1, toConsole=True, toFile=True):
        '''
           既要把日誌輸出到控制檯, 還要寫入日誌檔案
        '''
        # 建立一個logger
        # 返回一個logger例項,如果沒有指定name,返回root logger。
        # 只要name相同,返回的logger例項都是同一個而且只有一個,即name和logger例項是一一對應的。
        # 這意味著,無需把logger例項在各個模組中傳遞。只要知道name,就能得到同一個logger例項。
        # tag就是Logger的名字,相當於Android中的TAG
        self.logger = logging.getLogger(tag)
        
        # 防止重複記錄日誌的問題
        if not self.logger.handlers:
            
            # 定義handler的輸出格式:
            #   [時間][程式碼檔名,函式名:行號][logger名(相當於Android中的TAG)]: 輸出日誌資訊
            format_dict = {
               1 : logging.Formatter('[%(asctime)s][%(filename)s,%(funcName)s:%(lineno)s][%(name)s]: %(message)s'),
               2 : logging.Formatter('[%(asctime)s][%(filename)s,%(funcName)s:%(lineno)s][%(name)s]: %(message)s'),
               3 : logging.Formatter('[%(asctime)s][%(filename)s,%(funcName)s:%(lineno)s][%(name)s]: %(message)s'),
               4 : logging.Formatter('[%(asctime)s][%(filename)s,%(funcName)s:%(lineno)s][%(name)s]: %(message)s'),
               5 : logging.Formatter('[%(asctime)s][%(filename)s,%(funcName)s:%(lineno)s][%(name)s]: %(message)s')
            }
            formatter = format_dict[int(loglevel)]
            
            # 指定最低的日誌級別,低於指定級別的將被忽略。
            # 級別高低順序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
            # 如果把looger的級別設定為INFO, 那麼小於INFO級別的日誌都不輸出, 大於等於INFO級別的日誌都輸出 
            self.logger.setLevel(logging.DEBUG)

            # 建立一個handler,用於寫入日誌檔案
            # 需要建立/寫檔案的許可權
            try:
                if toFile:
                    fh = logging.FileHandler(filename)
                    fh.setLevel(logging.DEBUG)
                    fh.setFormatter(formatter)
                    self.logger.addHandler(fh)
            except Exception as e:
                print e
            
            # 再建立一個handler,用於輸出到控制檯
            if toConsole:
                ch = logging.StreamHandler()
                ch.setLevel(logging.DEBUG)
                ch.setFormatter(formatter)
                self.logger.addHandler(ch)
   
    def getlogger(self):
        return self.logger

        
def func():
    Logger(tag="test").getlogger().debug("HHHHHHHHHHHHHHHHHHHHHHHHHHH")

    
if __name__ == "__main__":        
    Logger(tag="test").getlogger().debug("YYYYYYYYYYYYYYYYYYYYYYY")
    func()
    
    

輸出到控制檯:
[email protected]:~/share/test$ sudo python logger.py 
[2017-05-15 10:06:15,533][logger.py,<module>:65][test]: YYYYYYYYYYYYYYYYYYYYYYY
[2017-05-15 10:06:15,534][logger.py,func:61][test]: HHHHHHHHHHHHHHHHHHHHHHHHHHH

輸出到檔案:
[2017-05-15 10:06:15,533][logger.py,<module>:65][test]: YYYYYYYYYYYYYYYYYYYYYYY
[2017-05-15 10:06:15,534][logger.py,func:61][test]: HHHHHHHHHHHHHHHHHHHHHHHHHHH
參考文章:

當然,也可以不用loggin也同樣能編寫日誌輸出系統:

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

import sys
import time
 
def logOut(msg, tag="", filename="python.log", toConsole=True, toFile=True):
    str_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) # 獲得當前時間
    fname = sys._getframe().f_back.f_code.co_filename                          # 呼叫者檔名
    funcname = sys._getframe().f_back.f_code.co_name                           # 呼叫者函式名
    lineno   = sys._getframe().f_back.f_lineno                                 # 呼叫者所在行號
    info = str.format("[%s][%s,%s:%d][%s] %s" % (str_time, fname, funcname, lineno, tag, msg))

    if toConsole:
        print info
        
    if toFile:
        try:
            with open(filename, "a") as f:        
                f.write(info); 
                f.write("\n"); 
        except Exception as e:
            print e


def func():
    logOut("HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", tag="test")
    
if __name__ == "__main__":
    logOut("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY", tag="test")
    func()

輸出效果是一樣的。

相關推薦

Python基於logger模組日誌輸出系統

在我們日常的程式開發過程中免不了除錯,輸出除錯日誌到控制檯或者輸出到檔案。Python的logging模組提供了通用的日誌系統,熟練使用logging模組可以方便開發者開發第三方模組或者是自己的Python應用。同樣這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,

python利用psutil模組獲取計算機系統資源並以json格式輸出

python3.6,windows下測試 一: 需要安裝psutil模組     easy_install.exe psutil 或者用下載psutil安裝包用pip install psutil命令安裝     psutil模組的資訊可參考: &nb

python 解決logging模組重複輸出日誌

場景:多個py檔案呼叫Logging,從主檔案匯入另外的py檔案時日誌會反覆輸出幾條原因參考:https://blog.csdn.net/huilan_same/article/details/51858817解決:將logger例項放到單獨的py檔案,其他檔案都import

python基於flask模組

樹形結構 ./ ├── app │   ├── config.py │   ├── __init__.py │   ├── modus │   

Python--day29--logging模組(日誌模組)

重要程度六顆星,比如一個小視窗的廣告如果因為你沒有日誌的問題導致點選量沒有記錄下來,幾十分鐘那就會損失幾十萬了,這責任誰負得起。 希望離開一個公司是因為有了更好的去處而不是因為各種各樣的原因被開掉,那樣整個日子的心情就不好了 logging的作用: logging的五個級別: basiconf

pythonlogger模組

本節內容 日誌相關概念 logging模組簡介 使用logging提供的模組級別的函式記錄日誌 logging模組日誌流處理流程 使用logging四大元件記錄日誌 配置logging的幾種方式 向日志輸出中新增上下文資訊 參考文件 一、日誌相關概念 日誌是一

基於flume的日誌收集系統配置

大資料系統中通常需要採集的日誌有: 系統訪問日誌 使用者點選日誌 其他業務日誌(比如推薦系統的點選日誌) 在收集日誌的時候,一般分為三層結構:採集層、彙總層和儲存層,而不是直接從採集端將資料傳送到儲存端,這樣的好處有: 如果儲存端如Hadoop叢集、Kafka等需要停

基於struts2的日誌管理系統

    既然是基於struts2框架做的,就必須瞭解struts框架。struts詳解:http://baike.baidu.com/link?url=thjh0ktwQ5cQhzKnUVmSdIqXicPUX_fhAnDTkYcuaPk-hqTAZVuDyMBuVGro

基於ELK的日誌收集系統的心得

elasticsearch+logstash+kinana搭建的日誌收集系統 elasticsearch是基於倒排序查詢的查詢引擎,什麼叫倒排序?比如mysql建立的索引是正排序,對於規範化資料(比如表格,元資料)而言基本使用正排序索引,倒排序一般用於文字之類的查詢,典型

Python日誌輸出——logging模組

1. logging介紹 Python的logging模組提供了通用的日誌系統,可以方便第三方模組或者是應用使用。這個模組提供不同的日誌級別,並可以採用不同的方式記錄日誌,比如檔案,HTTP GET/POST,SMTP,Socket等,甚至可以自己實現具體的日誌

RDIFramework.NET — 基於.NET的快速資訊化系統開發框架- 5.4平臺日誌、異常管理、生成自動升級配置檔案模組

RDIFramework.NET — 基於.NET的快速資訊化系統開發框架 5.4 平臺日誌、異常管理、生成自動升級配置檔案模組 5.4 框架日誌管理   框架日誌管理對於框架的安全審查有著重要的地位,使用者的登入登出情況,模組的訪問情況,服務呼叫情況,功能操作情況等都應該記錄下來,也方便管理人員查

python logging模組程式碼示例:實現日誌輸出到控制檯, 並且寫入日誌檔案中

import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name):

Python 基於KNN算法的手寫識別系統

res eight mon -s 利用 filename setsize http 需要 本文主要利用k-近鄰分類器實現手寫識別系統,訓練數據集大約2000個樣本,每個數字大約有200個樣本,每個樣本保存在一個txt文件中,手寫體圖像本身是32X32的二值圖像,如下圖所示:

樹莓派(Debian)系統開啟iptables的raw表實現日誌輸出

ges sysctl -i trac blank 無法 bsp 查看 squeeze 說明:可能Debian默認不開啟iptables的raw表,所以無法通過其實現日誌跟蹤。 日誌跟蹤:http://www.cnblogs.com/EasonJim/p/8413563.h

python 日誌輸出模塊--兩種方法

bug nco format file dha fig bytes 兩種 lena 第一種方法:(推薦) import logging.handlers LOG_FILE = r‘tst.log‘ handler = logging.handlers.

.NET基於Eleasticsearch搭建日誌系統實戰演練(公開版)

問題: 動手 控制 arch 推送 平臺 記錄 插件 解決 一、需求背景介紹 1.1、需求描述 大家都知道C/S架構模式的客戶端應用程序(比如:WinForm桌面應用、WPF、移動App應用程序、控制臺應用程序、Windows服務等等)的日誌記錄都存儲在本地客戶端中

基於WebGIS的Web服務器日誌管理系統設計與實現_愛學術——免費下載

富客戶端 平臺 .com 服務器日誌 操作 shu 實現 c51 bsp 【摘要】WebGIS優勢是通過互聯網對地理空間數據進行發布和應用,以實現空間數據的共享和相互操作。將WebGIS和富客戶端技術引入Web服務器日誌管理領域,從總體設計、數據庫設計、實現框架等幾個方面設

基於Python Tornado的在線問答系統

file www script install eat src body linu uil 概述 本項目使用最新的Tornado開發。實現了在線提問,回答,評論等功能。使用到Tornado的generator,長輪詢等等技術, 支持MySQL的異步連接。 詳細

Django 中使用 logging 配置 logger 自定義日誌輸出

講解 handler ati dmi ase set file 過程 require 在使用 django 開發過程中,默認的日誌輸出是不能滿足我們去排查問題的,往往需要自定義的日誌輸出,幫助我們去排查程序BUG,定位問題原因。 在使用 django 的開發過程中,我使用的

基於Kafka和ElasticSearch,LinkedIn如何構建實時日誌分析系統

今天,和跟大家分享我們在用ElasticSearch和Kafka做日誌分析的時候遇到的問題,系統怎麼樣一步一步演變成現在這個版本。你如果想拿ElasticSearch和Kafka來做日誌分析的話,會有一些啟發。全文主要包括以下幾個Topic:   日誌分析系統的基本需求; Li