import logging

"""
Explanation: Logging 模块

data, object type
print to terminal
write to log.txt
different level?
End of explanation
"""


#!/usr/local/bin/python
# -*- coding:utf-8 -*-
import logging
logging.warning('Watch out!')  # print message to console
logging.info('I told you so')  # will not print anything

"""
Explanation: Quick Start
导入模块后直接logging.waring()，logging.error()简单粗暴地调用即可。默认的level是DEBUG，所以warning会打印出信息，info级别更低，不会输出信息。如果你不知道level等参数的意义请后面解释，淡定，继续往下看。  
如果不特别配置，logging模块将日志打印到屏幕上(stdout)。
End of explanation
"""


import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG,filemode='w')
# filemode = 'w' 每次运行，重写log
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

cat example.log

"""
Explanation: Log写入文件
更常见的情形是把信息记录在log文件里。需要用logging.basicConfig()设置文件名以及level等参数，常见的level见下表。  
|Level|Value|Usage|
|--|--|--|
|CRITICAL|50|严重错误，表明程序已不能继续运行了。|
|ERROR|40|严重的问题，程序已不能执行一些功能了|
|WARNING|30|有意外，将来可能发生问题（如‘磁盘满了’），但依然可用|
|INFO|20|证明事情按预期工作。|
|DEBUG|10|详细信息，调试问题时会感兴趣。|  
如果设置level为INFO，那么DEBUG级别的信息就不会输出。常见的函数接口有debug(), info(), warning(), error() and critical()，分别对应log不同严重级别的信息。  
注意把下面代码写入脚本（直接在terminal里不会生成文件），比如test_log.py。
End of explanation
"""


import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

"""
Explanation: 改变Log输出格式
通过format参数，可以定制写入log文件的格式。
End of explanation
"""


import logging
logging.basicConfig(format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

"""
Explanation: DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too  
记录时间
通过datafmt参数，可以格式化输出log的时间。
End of explanation
"""


import logging
# create logger with name
# if not specified, it will be root
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# create a handler, write to log.txt
# logging.FileHandler(self, filename, mode='a', encoding=None, delay=0)
# A handler class which writes formatted logging records to disk files.
fh = logging.FileHandler('log.txt')
fh.setLevel(logging.DEBUG)

# create another handler, for stdout in terminal
# A handler class which writes logging records to a stream
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)

# set formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)

# add handler to logger
logger.addHandler(fh)
logger.addHandler(sh)

# log it
logger.debug('Debug')
logger.info('Info')

"""
Explanation: 07/16/2016 12:10:35 AM is when this event was logged.
更丰富的Log控制
上面的代码大部分是利用默认配置，其实我们自定义更多。比如把输出到terminal和log.txt文件里。  
首先理解几个概念是有用的。
- Logger 记录器，暴露了应用程序代码能直接使用的接口。
- Handler 处理器，将（记录器产生的）日志记录发送至合适的目的地。
- Filter 过滤器，提供了更好的粒度控制，它可以决定输出哪些日志记录。
- Formatter 格式化器，指明了最终输出中日志记录的布局。
首先，创建一个logger，记录器，然后给其添加不同的handler，输出到不同的渠道。
End of explanation
"""


