Pat*_*rns 3 python logging multithreading
例如,我有这些文件与我想要使用的类(只有示例,可能不工作)
# helper_one.py
import logging
logger = logging.getLogger('HelperOne')
class HelperOne:
def __init__(self, data):
self.data = data
def run(self):
logger.debug('HelperOne::Run function with data: ' + self.data)
return True
Run Code Online (Sandbox Code Playgroud)
.
# controller_one.py
import logging
from helper_one import HelperOne
logger = logging.getLogger('ControllerOne')
class ControllerOne:
def __init__(self, data):
self.data = data
def run(self):
logger.debug('ControllerOne::Run function with data: ' + self.data)
ho = HelperOne(self.data + '_data')
return ho.run()
Run Code Online (Sandbox Code Playgroud)
我有一个创建线程的文件
import logging
from controller_one import ControllerOne
# this function creates threads (its just an example)
def run_task(task_id, data):
logging.basicConfig(
filename=os.path.join('logs', str(task_id) + '.log'),
level=logging.DEBUG,
format='%(asctime)s\t%(name)s\t%(levelname)s\t%(message)s'
)
result = ControllerOne(data)
logging.debug('run_task: ' + result)
Run Code Online (Sandbox Code Playgroud)
如果我在我的示例中创建日志记录实例,则所有日志都写在一个文件中.对于每个线程,如何通过记录到自己的文件来创建自己的日志记录实例?
问候,亚历克斯.
记录器名称(传递给getLogger函数的字符串)可以是您想要的任何名称.正如文档解释:
这
name可能是一个以句点分隔的层次值,例如foo.bar.baz(尽管它也可能只是简单的foo).在分层列表中较低的记录器是列表中较高的记录器的子项.例如,给定一个记录器使用的名称foo,记录仪用的名字foo.bar,foo.bar.baz以及foo.bam是所有后代foo.记录器名称层次结构类似于Python包层次结构,如果使用建议的构造在每个模块的基础上组织记录器,则与其相同logging.getLogger(__name__).那是因为在模块中,__name__是Python包名称空间中的模块名称.
因此,建议使用__name__名称,但不是必需的.事实上,你已经明确地违反了它:
logger = logging.getLogger('ControllerOne')
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过将线程ID或名称放入记录器名称,为每个线程使用单独的名称.例如:
logger = logging.getLogger('ControllerOne.{}'.format(threading.get_ident())
Run Code Online (Sandbox Code Playgroud)
或者,在您的情况下,由于您似乎task_id每个线程都有一个唯一的,您可以使用它而不是线程ID.
当然这意味着你必须实际使用记录器; 你不能只是打电话logging.debug.你不能依赖basicConfig; 您将需要在每个线程中显式配置记录器.由于每个线程都创建了自己的独立ControllerOne实例,因此显而易见的是ControllerOne.__init__:在该函数中,您可以getLogger使用包含线程或任务ID的记录器名称进行调用,创建并设置一个FileHandler也包含名称中的线程或任务ID,并将其存储为self.logger.然后,只要你需要记录某些东西,你就可以了self.logger.debug(…).
如果所有听起来像官样文章来你,因为你不知道什么FileHandler是,你可能需要至少阅读基础教程中的HOWTO文档,但高级教程和食谱也是非常有用的.