我希望在任何一个单独的 py 文件里,通过文件名,就能获取到一个 logger,然后这个 logger 就能写入到这个文件里,互不影响
我写了一个函数,但是发现每次获取到 logger,handlers 都是空的,然后每次都重新覆盖了一个文件
def getTaskLogger(task_path: str) -> logging.Logger: logger = logging.getLogger(task_path) if logger.hasHandlers(): return logger formatter = logging.Formatter("%(asctime)s | %(levelname)s | [%(filename)s:%(lineno)d] | %(message)s") f_handler = logging.FileHandler("{0}/task.log".format(task_path), mode="a") f_handler.setLevel(logging.DEBUG) f_handler.setFormatter(formatter) c_handler = logging.StreamHandler() c_handler.setLevel(logging.DEBUG) c_handler.setFormatter(formatter) logger.addHandler(f_handler) logger.addHandler(c_handler) logger.setLevel(logging.DEBUG) return logger
![]() | 1 ch2 2021-09-19 10:46:12 +08:00 单例模式了解一下 |
2 zeroxia 2021-09-19 12:16:47 +08:00 不确定 logging.getLogger 是怎么处理参数和 logger 的对应的,但是你可以自己存下来吧。 ```python def getTaskLogger(task_path: str) -> logging.Logger: if not hasattr(getTaskLogger, 'repo'): getTaskLogger.repo = {} if not task_path in getTaskLogger.repo: logger = logging.getLogger(task_path) formatter = logging.Formatter("%(asctime)s | %(levelname)s | [%(filename)s:%(lineno)d] | %(message)s") f_handler = logging.FileHandler("{0}/task.log".format(task_path), mode="a") f_handler.setLevel(logging.DEBUG) f_handler.setFormatter(formatter) c_handler = logging.StreamHandler() c_handler.setLevel(loggingDEBUG) c_handler.setFormatter(formatter) logger.addHandler(f_handler) logger.addHandler(c_handler) logger.setLevel(logging.DEBUG) return getTaskLogger.repo[task_path] ``` 这个功能也不用自己写,你可以考虑 `functools.cache`。 |
3 RBQ2012 2021-09-19 15:53:42 +08:00 ![]() 也可以考虑换 `loguru` |
![]() | 4 icylogic 2021-09-19 19:54:24 +08:00 via iPhone 你这相当于每次 get 都重新 configure 了一遍,肯定不对啊。直接做成 logger per file/module 就可以了,然后提供一个通用的 configure helper 。 参考 python logging howto A good convention to use when naming loggers is to use a module-level logger, in each module which uses logging, named as follows: logger = logging.getLogger(__name__) 如果你有更高的需求,比如按照自定义的 logger 划分模式而不是 file/module,建议使用 service locator 来获取 logger,这种适合全局到处都在用又需要不同实现的服务,是相对安全和灵活的一种 pattern |
5 xmtpw 2021-09-19 22:56:40 +08:00 via iPhone loguru |