python logging - Serbipunk/notes GitHub Wiki

problem

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'

logger

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 包命名空间中的名字。

color setting

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。。。

reference

cnblogs chs tutorial

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")

logging.getLogger

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.

在调用层定义一个具有特定命名的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")
⚠️ **GitHub.com Fallback** ⚠️