python中替代logging的日志系统。

不过比之前的logging难理解。

先上打印到屏幕上的代码和存到日志文件中的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from logbook import Logger, StreamHandler, TimedRotatingFileHandler
import sys
import os
StreamHandler(sys.stdout).push_application()
log = Logger('Logbook')
log.info('Hello, World!')

LOG_DIR = os.path.join('log')
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)
TimedRotatingFileHandler(os.path.join(LOG_DIR, '%s.log' % 'user_log'), date_format='%Y%m%d', bubble=True).push_application()
user_log = Logger('user_log')
user_log.info('user_log mytest....')

然后看rqalpha代码,发现实际上写主要有两种类型,一种为打印到屏幕,一种为打印到文件。

在初始化时,需要先利生成Logger实例:

user_log = Logger("user_log")

需要打印到屏幕,则生成打印到屏幕的句柄:

user_std_handler = user_std_handler = ColorizedStderrHandler(bubble=True)

然后对此句柄设置日志格式:

user_std_handler.formatter = user_handler_log_formatter

若想使此设置生效,

只需申明user_log的句柄:

user_log.handlers = []

然后将之加入即可

user_log.handlers.append(user_std_handler)

同理,如果希望日志同时支持打印到文件,只需按照上述步骤再来一次即可。
user_file_handler = TimedRotatingFileHandler(
    os.path.join(os.path.join('log') , '%s.log' % 'test_log'), date_format='%Y%m%d', bubble=True)
user_file_handler.formatter = user_handler_log_formatter

user_log.handlers.append(user_file_handler)

user_handler_log_formatter是一个日志格式函数,返回打印的日志以什么方式呈现。

整体代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# filename:logger.py
import os
import logbook
from logbook import Logger, TimedRotatingFileHandler
from logbook.more import ColorizedStderrHandler

DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S.00"

def user_handler_log_formatter(record, handler):
    log = "[{dt}][{level}][{filename}][{func_name}][{lineno}] {msg}".format(
        dt=record.time,
        level=record.level_name,                       # 日志等级
        filename = os.path.split(record.filename)[-1], # 文件名
        func_name = record.func_name,                  # 函数名
        lineno = record.lineno,                        # 行号
        msg=record.message,                            # 日志内容
    )
    return log

# 打印到屏幕句柄
user_std_handler = ColorizedStderrHandler(bubble=True)
user_std_handler.formatter = user_handler_log_formatter

# 日志路径,在主工程下生成log目录
LOG_DIR = os.path.join('log')
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

# 打印到文件句柄
user_file_handler = TimedRotatingFileHandler(
    os.path.join(LOG_DIR , '%s.log' % 'test_log'), date_format='%Y%m%d', bubble=True)
user_file_handler.formatter = user_handler_log_formatter

# 用户代码logger日志
user_log = Logger("user_log")

def init_logger():
    logbook.set_datetime_format("local")
    user_log.handlers = []
    user_log.handlers.append(user_std_handler)
    user_log.handlers.append(user_file_handler)

# 初始化日志系统(被默认调用)
init_logger()

测试代码如下:

#!/usr/bin/evn python3
# -*- coding: utf-8 -*-
# filename: test_looger.py
import os
from logger import user_log as logger

if __name__ == "__main__":
    logger.info("my test.")

打印日志如下:

[2017-08-26 19:10:10.226902][INFO][test_logger.py][<module>][8] my test.

最新文章

  1. MySQL 锁问题
  2. 面试题目——《CC150》递归与动态规划
  3. JS获取Url中传入的参数
  4. PHP Switch case 条件并用实例
  5. Angularjs学习笔记(一)
  6. iOS 里面 NSTimer 防止 循环引用
  7. 浅谈JavaScript中的变量、参数、作用域和作用域链
  8. 【iOS】The differences between Class Extension and Header File 类扩展与头文件的区别
  9. shell编程基础(4)case 与 function
  10. ThinkPHP学习手记——环境搭建
  11. for-in用法
  12. Android 动画animation 深入分析
  13. geoserver集成以及部署arcgis server瓦片数据
  14. 美团Java团队分享:如何实践支付通道自动化管理
  15. XP实验报告
  16. linux下查找堆栈信息例子
  17. 什么是RESTful API?
  18. CRM 2013 批量更新two options的缺省值
  19. 51nod 1463 找朋友(线段树+离线处理)
  20. [Selenium With C#基础教程] Lesson-02 Web元素定位

热门文章

  1. 每日英语:The Most Destructive, Unpredictable Force in Tech
  2. SVN如何切换账号
  3. 在PL/SQL中调用存储过程--oracle
  4. Python3玩转单链表——逆转单向链表pythonic版
  5. C#学习笔记(9)——委托(窗体传值)
  6. 命令行todo神器taskwarrior使用简介
  7. 【WPF/C#】图层筛选/拾取——Color Picker
  8. mysql中递归树状结构&lt;转&gt;
  9. Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
  10. Java编程的逻辑 (49) - 剖析LinkedHashMap