容器内 Python 脚本的健康检查
health check for Python script inside a container
我在容器中有一个 python 脚本 运行,有时它会失败。
我想知道是否可以为该脚本创建健康检查,如果失败,请删除该容器并创建一个新容器。
我建议编辑日志下载程序以确保它存在,
... # line 255 ( https://github.com/imperva/incapsula-logs-downloader/blob/master/script/LogsDownloader.py )
"""
Saves the decrypted file content to a log file in the filesystem
"""
def handle_log_decrypted_content(self, filename, decrypted_file):
decrypted_file = decrypted_file.decode('utf-8')
if self.config.SYSLOG_ENABLE == 'YES':
syslogger = logging.getLogger("syslog")
syslogger.setLevel(logging.INFO)
if self.config.SYSLOG_PROTO == 'TCP':
self.logger.info('Syslog enabled, using TCP')
syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)), socktype=socket.SOCK_STREAM)
else:
self.logger.info('Syslog enabled, using UDP')
syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)))
### Add by Maytee Sittipornchaisakul
if not self.setOutputSyslogHandler:
syslogger.addHandler(syslog)
self.setOutputSyslogHandler = True
for msg in decrypted_file.splitlines():
if msg != '':
try:
syslogger.info(msg)
except:
self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
self.running = False
sys.exit(1)
if self.config.SAVE_LOCALLY == "YES":
local_file = open(self.config.PROCESS_DIR + filename, "a+")
local_file.writelines(decrypted_file)
...
这有望在系统日志错误时导致脚本退出,然后您可以使用某种看门狗处理退出的容器,例如聊天中讨论的 --restart 选项。
我最终修改了这部分
if not self.setOutputSyslogHandler:
syslogger.addHandler(syslog)
self.setOutputSyslogHandler = True
我修改它以删除处理程序并在每次再次使用它时添加它。
syslogger.addHandler(syslog)
for msg in decrypted_file.splitlines():
if msg != '':
try:
syslogger.info(msg)
except:
self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
self.running = False
sys.exit(1)
while syslogger.hasHandlers():
syslogger.removeHandler(syslogger.handlers[0])
我在容器中有一个 python 脚本 运行,有时它会失败。 我想知道是否可以为该脚本创建健康检查,如果失败,请删除该容器并创建一个新容器。
我建议编辑日志下载程序以确保它存在,
... # line 255 ( https://github.com/imperva/incapsula-logs-downloader/blob/master/script/LogsDownloader.py )
"""
Saves the decrypted file content to a log file in the filesystem
"""
def handle_log_decrypted_content(self, filename, decrypted_file):
decrypted_file = decrypted_file.decode('utf-8')
if self.config.SYSLOG_ENABLE == 'YES':
syslogger = logging.getLogger("syslog")
syslogger.setLevel(logging.INFO)
if self.config.SYSLOG_PROTO == 'TCP':
self.logger.info('Syslog enabled, using TCP')
syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)), socktype=socket.SOCK_STREAM)
else:
self.logger.info('Syslog enabled, using UDP')
syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)))
### Add by Maytee Sittipornchaisakul
if not self.setOutputSyslogHandler:
syslogger.addHandler(syslog)
self.setOutputSyslogHandler = True
for msg in decrypted_file.splitlines():
if msg != '':
try:
syslogger.info(msg)
except:
self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
self.running = False
sys.exit(1)
if self.config.SAVE_LOCALLY == "YES":
local_file = open(self.config.PROCESS_DIR + filename, "a+")
local_file.writelines(decrypted_file)
...
这有望在系统日志错误时导致脚本退出,然后您可以使用某种看门狗处理退出的容器,例如聊天中讨论的 --restart 选项。
我最终修改了这部分
if not self.setOutputSyslogHandler:
syslogger.addHandler(syslog)
self.setOutputSyslogHandler = True
我修改它以删除处理程序并在每次再次使用它时添加它。
syslogger.addHandler(syslog)
for msg in decrypted_file.splitlines():
if msg != '':
try:
syslogger.info(msg)
except:
self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
self.running = False
sys.exit(1)
while syslogger.hasHandlers():
syslogger.removeHandler(syslogger.handlers[0])