Порт регистрации Python 514 папка / гггг / мм / дд - PullRequest
0 голосов
/ 03 ноября 2019

Привет, я хочу войти в порт 514 UDP со скриптом Python. Адрес журнала не изменяется при изменении даты. Я хочу сохранить весь журнал. Я хочу записывать журнал с одним и тем же именем в разные папки каждый день.

#!/usr/bin/env python
import os, stat
import datetime
import logging
import SocketServer

HOST, PORT = "0.0.0.0", 514
class SyslogUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = bytes.decode(self.request[0].strip())
        socket = self.request[1]
        today = datetime.datetime.now()
        year = today.strftime("%Y")
        month=today.strftime("%m")
        day=today.strftime("%d")
        file_path = "/listen/"  + year +"/" + month + "/" + day 
        file= file_path + "/test.log"       
        if(not os.path.exists(file_path)):
            os.makedirs(file_path)
        logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=file, filemode='a')
        logging.info(str(data))

if __name__ == "__main__":
    try:
        server = SocketServer.UDPServer((HOST,PORT), SyslogUDPHandler)
        server.serve_forever(poll_interval=0.5)
    except (IOError, SystemExit):
        raise
    except KeyboardInterrupt:
        print ("Crtl+C Pressed. Shutting down.")

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

изменить строку

logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=file, filemode=('a' if os.path.exists(file_path) else 'w'))

на

logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=file, filemode=('a' if os.path.exists(file_path) else 'w'))

Конечный код

#!/usr/bin/env python
import os, stat
import datetime
import logging
import SocketServer

HOST, PORT = "0.0.0.0", 514
class SyslogUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = bytes.decode(self.request[0].strip())
        socket = self.request[1]
        today = datetime.datetime.now()
        year = today.strftime("%Y")
        month=today.strftime("%m")
        day=today.strftime("%d")
        file_path = "/listen/"  + year +"/" + month + "/" + day 
        file= file_path + "/test.log"       
        if(not os.path.exists(file_path)):
            os.makedirs(file_path)
        logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=file, filemode=('a' if os.path.exists(file_path) else 'w'))
        logging.info(str(data))

if __name__ == "__main__":
    try:
        server = SocketServer.UDPServer((HOST,PORT), SyslogUDPHandler)
        server.serve_forever(poll_interval=0.5)
    except (IOError, SystemExit):
        raise
    except KeyboardInterrupt:
        print ("Crtl+C Pressed. Shutting down.")
0 голосов
/ 03 ноября 2019

Я не могу проверить это, но думаю, что проблема может быть в том, что ваш код всегда добавляет данные в файл журнала. Поэтому попробуйте сделать это вместо:

class SyslogUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = bytes.decode(self.request[0].strip())
        socket = self.request[1]

        today = datetime.datetime.now()
        year = today.strftime("%Y")
        month = today.strftime("%m")
        day = today.strftime("%d")
        file_path = "/listen/" + year + "/" + month + "/" + day
        file = file_path + "/test.log"
        if os.path.exists(file_path):
            filemode = 'a'  # Append to existing file.
        else:
            os.makedirs(file_path)
            filemode = 'w'  # Write to new file.

        logging.basicConfig(level=logging.INFO, format='%(message)s',
                            datefmt='', filename=file, filemode=filemode)
        logging.info(str(data))
...