Fabric을 통해 작업 수행 전후에 작업 내용 알림

10188 단어 Pythonfabric
Fabric을 사용하면 자신의 용도에 많은 임무량이 있기 때문에 임무 수행 전과 완료 시 어떤 임무, 무엇을 진행했는지 출력해달라고 요청해 Custom Task 클래스를 만들었다.
report.py
# -*- coding: utf-8 -*-

import logging
import time

from fabric.tasks import Task
from fabric.operations import *
from fabric.colors import *

class ReportStatus(Task):
    """
    タスク実行前後にそのタスクをこれから実行する旨と実行終えた旨を伝える CustomTask クラス

    @task(task_class=ReportStatus, task_name="実行前後表示テスト")
    def something_task():
        print green("タスク実行")
    """
    def __init__(self, func, task_name, *args, **kwargs):
        super(ReportStatus, self).__init__(*args, **kwargs)
        self.func = func
        self.task_name = task_name

        if hasattr(func, '__doc__') and func.__doc__:
            self.__doc__ = func.__doc__
        else:
            self.__doc__ = task_name

        if hasattr(callable, '__module__'):
            self.__module__ = callable.__module__

    def run(self, *args, **kwargs):
        print cyan("[%s] [%s] を実行します" % (self.task_name, self.func.__name__))
        logging.info("[%s][%s] executing" % (self.func.__name__, self.task_name))

        result = self.func(*args, **kwargs)

        print green("[%s] [%s] を完了しました" % (self.task_name, self.func.__name__), bold=True)
        logging.info("[%s][%s] done" % (self.func.__name__, self.task_name))
        print "\n"

        return result

    def __call__(self, *args, **kwargs):
        return self.run(*args, **kwargs)

    def __getattr__(self, k):
        return getattr(self.func, k)

    def __details__(self):
        return get_task_details(self.func)

logging을 사용하면 로그를 토로할 수 있기 때문에 적당히 설정하면 로그를 출력할 수 있습니다
fabfile.py
# -*- coding: utf-8 -*-

import datetime
import logging
from fabric.colors import *
from fabric.api import *

from report import ReportStatus

log_file_name = "%s.log" % (datetime.datetime.today().strftime("%Y%m%d"))
logging.basicConfig(
    format='[%(asctime)s][%(levelname)s] %(message)s',
    filename=log_file_name, datefmt='%Y/%m/%d %I:%M:%S',
    level=logging.INFO
)

@task(task_class=ReportStatus, task_name="実行前後表示テスト")
def something_task():
    print green("タスク実行")
실행하면 이런 느낌이야.

log 지정된 형식으로 내보내기
[2017/01/19 01:20:18][INFO] [something_task][実行前後表示テスト] executing
[2017/01/19 01:20:18][INFO] [something_task][実行前後表示テスト] done

좋은 웹페이지 즐겨찾기