tornado 的日志


import os
import tornado
import tornado.ioloop
import tornado.httpserver
import tornado.web
import tornado.log
import logging
from tornado.options import options, define
 
# 這里配置的是日志的路徑,配置好后控制台的相應信息就會保存到目標路徑中。
options.log_file_prefix = os.path.join(os.path.dirname(__file__), 'logs/tornado_main.log')
 
# 后台函數
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
 
class Application(tornado.web.Application):
    def __init__(self):
        handlers = [  # 路由設置
            (r"/", MainHandler),
        ]
 
        self.settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), 'templates'),  #設置模板路徑
            static_path=os.path.join(os.path.dirname(__file__), 'static'),  # 設置靜態資源引用路路徑
            # static_url_prefix='/myPath/static/', # 設置html中靜態文件的引用路徑,默認為/static/
            debug=True,
        )
        super(Application, self).__init__(handlers, **self.settings)
 
 
# 格式化日志輸出格式
# 默認是這種的:[I 160807 09:27:17 web:1971] 200 GET / (::1) 7.00ms
# 格式化成這種的:[2016-08-07 09:38:01 執行文件名:執行函數名:執行行數 日志等級] 內容消息
class LogFormatter(tornado.log.LogFormatter):
    def __init__(self):
        super(LogFormatter, self).__init__(
            fmt='%(color)s[%(asctime)s %(filename)s:%(funcName)s:%(lineno)d %(levelname)s]%(end_color)s %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
 
def main():
    tornado.options.define("port", default="8888", help="run on the port", type=int)  # 設置全局變量port
    tornado.options.parse_command_line()  # 啟動應用前面的設置項目
    [i.setFormatter(LogFormatter()) for i in logging.getLogger().handlers]
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(tornado.options.options.port)  # 在這里應用之前的全局變量port
    tornado.ioloop.IOLoop.current().start()  # 啟動監聽
 
 
if __name__ == "__main__":
    main()

項目目錄:

日志輸出樣式:

 

 

 

 


這是一個提供日志功能的模塊,它可以讓你更敏捷的為你程序提供日志功能

 

一、常用日志記錄場景及最佳解決方案:

日志記錄方式 最佳記錄日志方案

普通情況下,在控制台顯示輸出 print()
報告正常程序操作過程中發生的事件 logging.info()(或者更詳細的logging.debug())
發出有關特定事件的警告 warnings.warn()或者logging.warning()
報告錯誤 彈出異常
在不引發異常的情況下報告錯誤 logging.error(), logging.exception()或者logging.critical()

 


二、日志等級:

logging模塊定義了下表所示的日志級別,按事件嚴重程度由低到高排列(注意是全部大寫!因為它們是常量。):

級別 級別數值 使用時機
DEBUG 10 詳細信息,常用於調試。
INFO 20 程序正常運行過程中產生的一些信息。
WARNING 30 警告用戶,雖然程序還在正常工作,但有可能發生錯誤。
ERROR 40 由於更嚴重的問題,程序已不能執行一些功能了。
CRITICAL 50 嚴重錯誤,程序已不能繼續運行。

默認級別是WARNING,表示只有WARING和比WARNING更嚴重的事件才會被記錄到日志內,低級別的信息會被忽略。因此,默認情況下,DEBUG和INFO會被忽略,WARING、ERROR和CRITICAL會被記錄。

 


三、logging基本使用方法:

產生五種日志級別(WARING、ERROR和CRITICAL會直接輸出()內的提示語至屏幕):
logging.info('info')
logging.debug('debug')
logging.warning('warning')
logging.error('error')
logging.critical('critical')


日志系統配置文件(定義日志一些規則):

logging.basicConfig(filename='test.log', level=logging.INFO, filemode='a', format='%(levelname)s:%(asctime)s:%(message)s')

filename:日志要保存至哪個文件中(定義了這個后日志將不再在屏幕上打印)
level:什么級別以上的日志需要保存
filemode:有"w"、"a"兩種模式,同open一樣,"a"追加,"w"覆蓋
format:定義日志格式(后面提供日志元素表,建議通過":"將各種日志元素連接成合理的日志格式)


format定義格式時用的日志元素表:

日志元素 描述

%(asctime)s 日志產生的時間,默認格式為2003-07-08 16:49:45,896
%(created)f time.time()生成的日志創建時間戳
%(filename)s 生成日志的程序名
%(funcName)s 調用日志的函數名
%(levelname)s 日志級別 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
%(levelno)s 日志級別對應的數值
%(lineno)d 日志所針對的代碼行號(如果可用的話)
%(module)s 生成日志的模塊名
%(msecs)d 日志生成時間的毫秒部分
%(message)s 具體的日志信息
%(name)s 日志調用者
%(pathname)s 生成日志的文件的完整路徑
%(process)d 生成日志的進程ID(如果可用)
%(processName)s 進程名(如果可用)
%(thread)d 生成日志的線程ID(如果可用)
%(threadName)s 線程名(如果可用)

 

四、logging高級用法(讓日志即能寫入文件又能在屏幕打印):

包含關系(左邊包含右邊):
記錄器<——處理器<——格式化器

import logging
"""
logging模塊采用了模塊化設計,主要包含四種組件:

Loggers:記錄器,提供應用程序代碼能直接使用的接口;
Handlers:處理器,將記錄器產生的日志發送至目的地;
Filters:過濾器,提供更好的粒度控制,決定哪些日志會被輸出;
Formatters:格式化器,設置日志內容的組成結構和消息字段。

"""
# 創建一個記錄器loggers,並設置默認等級
logger = logging.getLogger('jack') # ‘jack’位置定義了日志調用者的名字
logger.setLevel(logging.INFO)

# 創建兩個處理器handlers(一個發往日志文件、一個發往屏幕),並分別設置他們的日志等級
stream = logging.StreamHandler() # 發往屏幕
stream.setLevel(logging.DEBUG) # 定義什么樣級別以上的日志發往屏幕

file = logging.FileHandler('test.log') # 發往日志文件(需指定文件名稱)
file.setLevel(logging.ERROR) # 定義什么樣級別以上的日志發往日志文件

# 分別為兩個處理器handlers創建格式化器formatters(可以讓其在屏幕和日志文件中以不同的格式輸出)
formatter_stream = logging.Formatter('%(levelname)s:%(asctime)s:%(message)s')
formatter_file = logging.Formatter('%(name)s:%(levelname)s:%(asctime)s:%(message)s')

# 為各個處理器handlers設置相應的格式化器
stream.setFormatter(formatter_stream)
file.setFormatter(formatter_file)

# 將所有的處理器handler加入自定義的記錄器logger內
logger.addHandler(stream)
logger.addHandler(file)

# 測試日志功能
logger.debug('debug')
logger.info('info')
logger.warning('warn')
logger.error('error')
logger.critical('critical')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM