Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2015 22:35:52

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Обработка исключений.

ну даже не знаю…
попробуйте так, что оно скажет

import os, glob, zipfile, fileinput, shutil, time, logging, re, datetime, socket
import dateutil.relativedelta
from logging import handlers
from lxml import etree
LOG_FILENAME = 'G:\log_in.txt'
FROM = '~@~.ru'
TO = '~@~.ru'
SUBJECT = 'INFO - Ins'
try:
    logger = logging.getLogger('Logging')
    logger.setLevel(logging.DEBUG)
    logrotate = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=9000, backupCount=2) 
    logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
    handler = handlers.SMTPHandler(('192.168.1.5', 25), FROM, TO, SUBJECT)
    email_logger = logging.getLogger('~@~.ru')
    email_logger.addHandler(handler)
    email_logger.setLevel = logging.info
    dir_ins = "G:\\INS\\"
    os.chdir("G:/F/D")
    for file in glob.glob("*.zip"):
            if os.path.splitext(file)[0] == '630': 
                if not os.path.exists(dir_ins): os.makedirs(dir_ins)     
                email_logger.info("INS " + time.strftime("%d-%m-%Y",time.localtime(os.path.getmtime(file))))
                logging.debug("INSURED " + time.strftime("%d-%m-%Y",time.localtime(os.path.getmtime(file))) + " - " + str(os.path.getsize(file)))
                shutil.move(os.path.abspath(file), dir_ins)
except socket.timeout:
    logging.warning("Warning! SMTP server - TimeOut!")



————————————————
-*- Simple is better than complex -*-

Офлайн

#2 Апрель 13, 2015 01:19:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Обработка исключений.

from logging import handlers
 
class A:
  filename = 'file'
  lineno = 1
 
handler = handlers.SMTPHandler(('localhost', 25), 'x@x', 'y@y', 'subj')
handler.emit(A())

Вот такой попробуй со своим адресом.

Вообще, это проблема logging. Парень, который его реализовывает, хорошо пишет документацию, но хреново пишет код. Там много всяких неконсистентных моментов. Задумка хорошая, а реализация так себе.

В частности здесь timeout упрятан как служебный атрибут и выставлен в магическое число, хотя должен передаваться в качестве параметра.

/usr/lib/python2.7/logging/handlers.py
class SMTPHandler(logging.Handler):
    """
    A handler class which sends an SMTP email for each logging event.
    """
    def __init__(self, mailhost, fromaddr, toaddrs, subject,
                 credentials=None, secure=None):
        """
        Initialize the handler.
 
        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        """
        logging.Handler.__init__(self)
        if isinstance(mailhost, tuple):
            self.mailhost, self.mailport = mailhost
        else:
            self.mailhost, self.mailport = mailhost, None
        if isinstance(credentials, tuple):
            self.username, self.password = credentials
        else:
            self.username = None
        self.fromaddr = fromaddr
        if isinstance(toaddrs, basestring):
            toaddrs = [toaddrs]
        self.toaddrs = toaddrs
        self.subject = subject
        self.secure = secure
        self._timeout = 5.0
...

Это же просто писец какой-то. Если сервер находится дальше пяти секунд, то логгером нельзя пользоваться. В документации о служебном атрибуте нет ни слова, следовательно таймаут нельзя менять. (Его использование - это хак, а хаки легко слетают при выходе новых версий ПО.)

Вот на этом можешь проверить подключение к своему серверу:
from logging import handlers
 
class S(handlers.SMTPHandler):
    def __init__(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)
        self._timeout = 10.0
 
class A:
    filename = 'file'
    lineno = 1
 
SMTP = handlers.SMTPHandler
SMTP = S
 
handler = SMTP(('localhost', 25), 'x@x', 'y@y', 'subj')
handler.emit(A())

А, ну вот:
Таймаут был зашит
https://docs.python.org/2/library/logging.handlers.html#smtphandler
Кто-то напоролся и таймаут появился
https://docs.python.org/3/library/logging.handlers.html#smtphandler

Даже вон кто
http://bugs.python.org/issue14314
David Murray - один из разработчиков.



Отредактировано py.user.next (Апрель 13, 2015 01:36:33)

Офлайн

#3 Апрель 13, 2015 06:24:47

Gam
Зарегистрирован: 2015-04-12
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка исключений.

terabayt, py.user.next
Благодарю.
Буду искать обходные пути.
Главное, что я понял где сидит основная проблема.

Отредактировано Gam (Апрель 13, 2015 06:26:54)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version