python logging - Serbipunk/notes GitHub Wiki
0b4f6b62.png
SKU__662285580299__0__4__0.9344.png
Traceback (most recent call last):
File "main.py", line 601, in <module>
File "main.py", line 492, in process_sort_and_refined
File "/home/tengbq/anaconda3/envs/py36/lib/python3.6/site-packages/eshop_im_pipeline/task_functions/ColorTools/ClothColorAnalyzer.py", line 26, in __init__
File "/home/tengbq/anaconda3/envs/py36/lib/python3.6/site-packages/eshop_im_pipeline/TaskBaseClass.py", line 32, in get_new_task_logger
File "/home/tengbq/anaconda3/envs/py36/lib/python3.6/logging/__init__.py", line 1032, in __init__
File "/home/tengbq/anaconda3/envs/py36/lib/python3.6/logging/__init__.py", line 1061, in _open
OSError: [Errno 24] Too many open files: '/data2/dataset/ss_eshop_im_dataset/aichuanda_dataflow/220425_taobao_ims_pipeline/demo/Eshop_Ims_Process_v1/task_log/im_color_analyzer/2022-05-11-16/7107.log'
https://docs.python.org/zh-cn/3/library/logging.html#logger-objects
记录器对象
记录器有以下的属性和方法。注意 永远 不要直接实例化记录器,应当通过模块级别的函数 logging.getLogger(name) 。多次使用相同的名字调用 getLogger() 会一直返回相同的 Logger 对象的引用。
name 一般是句点分割的层级值, 像foo.bar.baz
(尽管也可以只是普通的 foo)。层次结构列表中位于下方的记录器是列表中较高位置的记录器的子级。例如,有个名叫 foo 的记录器,而名字是 foo.bar,foo.bar.baz,和 foo.bam 的记录器都是 foo 的子级。记录器的名字分级类似 Python 包的层级,如果您使用建议的结构 logging.getLogger(name) 在每个模块的基础上组织记录器,则与之完全相同。这是因为在模块里,name 是该模块在 Python 包命名空间中的名字。
https://stackoverflow.com/a/63338866
import sys
import logging
import colorlog
logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
sh = logging.StreamHandler(sys.stdout)
sh.setFormatter(colorlog.ColoredFormatter('%(log_color)s [%(asctime)s] %(levelname)s [%(filename)s.%(funcName)s:%(lineno)d] %(message)s', datefmt='%a, %d %b %Y %H:%M:%S'))
logger.addHandler(sh)
# fh = logging.FileHandler('my_log_info.log')
# fh.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)s [%(filename)s.%(funcName)s:%(lineno)d] %(message)s', datefmt='%a, %d %b %Y %H:%M:%S'))
# logger.addHandler(fh)
问题:会出2行log。。。
stdout setting
https://stackoverflow.com/a/14058475
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
basic usage:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
In [4]: print(logging.getLogger.__doc__)
Return a logger with the specified name, creating it if necessary.
If no name is specified, return the root logger.
invoker.py
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('okra_slave')
logger.setLevel(level = logging.DEBUG)
# define a RotatingFileHandler to hold $backupCount amount of logging files, whose size is $maxBytes
rHandler = RotatingFileHandler("log-2.txt", maxBytes = 10*1024*1024, backupCount = 10)
rHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
console.setFormatter(formatter)
logger.addHandler(rHandler)
logger.addHandler(console)
from sub_module import make_some_noise
make_some_noise()
sub_module.py
import logging
logger = logging.getLogger("okra_slave")
def make_some_noise():
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")