flexget.utils.log
Covered: 54 lines
Missed: 2 lines
Skipped 21 lines
Percent: 96 %
 1
"""Logging utilities"""
 3
import logging
 4
import hashlib
 5
from datetime import datetime, timedelta
 6
from sqlalchemy import Column, Integer, String, DateTime, Index
 7
from flexget import schema
 8
from flexget.utils.sqlalchemy_utils import table_schema
 9
from flexget.manager import Session
10
from flexget.event import event
12
log = logging.getLogger('util.log')
13
Base = schema.versioned_base('log_once', 0)
16
@schema.upgrade('log_once')
17
def upgrade(ver, session):
18
    if ver is None:
19
        log.info('Adding index to md5sum column of log_once table.')
20
        table = table_schema('log_once', session)
21
        Index('log_once_md5sum', table.c.md5sum, unique=True).create()
22
        ver = 0
23
    return ver
26
class LogMessage(Base):
27
    """Declarative"""
29
    __tablename__ = 'log_once'
31
    id = Column(Integer, primary_key=True)
32
    md5sum = Column(String, unique=True)
33
    added = Column(DateTime, default=datetime.now())
35
    def __init__(self, md5sum):
36
        self.md5sum = md5sum
38
    def __repr__(self):
39
        return "<LogMessage('%s')>" % self.md5sum
42
@event('manager.db_cleanup')
43
def purge(session):
44
    """Purge old messages from database"""
45
    old = datetime.now() - timedelta(days=365)
47
    result = session.query(LogMessage).filter(LogMessage.added < old).delete()
48
    if result:
49
        log.verbose('Purged %s entries from log_once table.' % result)
52
def log_once(message, logger=logging.getLogger('log_once')):
53
    """
54
    Log message only once using given logger. Returns False if suppressed logging.
55
    When suppressed verbose level is still logged.
56
    """
58
    digest = hashlib.md5()
59
    digest.update(message.encode('latin1', 'replace')) # ticket:250
60
    md5sum = digest.hexdigest()
62
    session = Session()
63
    try:
65
        if session.query(LogMessage).filter_by(md5sum=md5sum).first():
66
            logger.verbose(message)
67
            return False
69
        row = LogMessage(md5sum)
70
        session.add(row)
71
        session.commit()
72
    finally:
73
        session.close()
75
    logger.info(message)
76
    return True