iploggerapp.py
132 lines
| 4.2 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3604 | #!/usr/bin/env python | ||
# encoding: utf-8 | ||||
""" | ||||
A simple IPython logger application | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2011 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
import sys | ||||
import zmq | ||||
from IPython.zmq.parallel.clusterdir import ( | ||||
ApplicationWithClusterDir, | ||||
ClusterDirConfigLoader | ||||
) | ||||
MinRK
|
r3642 | from .logwatcher import LogWatcher | ||
MinRK
|
r3604 | |||
#----------------------------------------------------------------------------- | ||||
# Module level variables | ||||
#----------------------------------------------------------------------------- | ||||
#: The default config file name for this application | ||||
default_config_file_name = u'iplogger_config.py' | ||||
_description = """Start an IPython logger for parallel computing.\n\n | ||||
IPython controllers and engines (and your own processes) can broadcast log messages | ||||
by registering a `zmq.log.handlers.PUBHandler` with the `logging` module. The | ||||
logger can be configured using command line options or using a cluster | ||||
directory. Cluster directories contain config, log and security files and are | ||||
MinRK
|
r3645 | usually located in your ipython directory and named as "clusterz_<profile>". | ||
MinRK
|
r3604 | See the --profile and --cluster-dir options for details. | ||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Command line options | ||||
#----------------------------------------------------------------------------- | ||||
class IPLoggerAppConfigLoader(ClusterDirConfigLoader): | ||||
def _add_arguments(self): | ||||
super(IPLoggerAppConfigLoader, self)._add_arguments() | ||||
paa = self.parser.add_argument | ||||
# Controller config | ||||
paa('--url', | ||||
type=str, dest='LogWatcher.url', | ||||
help='The url the LogWatcher will listen on', | ||||
) | ||||
# MPI | ||||
paa('--topics', | ||||
type=str, dest='LogWatcher.topics', nargs='+', | ||||
help='What topics to subscribe to', | ||||
metavar='topics') | ||||
# Global config | ||||
paa('--log-to-file', | ||||
action='store_true', dest='Global.log_to_file', | ||||
help='Log to a file in the log directory (default is stdout)') | ||||
#----------------------------------------------------------------------------- | ||||
# Main application | ||||
#----------------------------------------------------------------------------- | ||||
class IPLoggerApp(ApplicationWithClusterDir): | ||||
name = u'iploggerz' | ||||
description = _description | ||||
command_line_loader = IPLoggerAppConfigLoader | ||||
default_config_file_name = default_config_file_name | ||||
auto_create_cluster_dir = True | ||||
def create_default_config(self): | ||||
super(IPLoggerApp, self).create_default_config() | ||||
# The engine should not clean logs as we don't want to remove the | ||||
# active log files of other running engines. | ||||
self.default_config.Global.clean_logs = False | ||||
# If given, this is the actual location of the logger's URL file. | ||||
# If not, this is computed using the profile, app_dir and furl_file_name | ||||
self.default_config.Global.url_file_name = u'iplogger.url' | ||||
self.default_config.Global.url_file = u'' | ||||
def post_load_command_line_config(self): | ||||
pass | ||||
def pre_construct(self): | ||||
super(IPLoggerApp, self).pre_construct() | ||||
def construct(self): | ||||
# This is the working dir by now. | ||||
sys.path.insert(0, '') | ||||
self.start_logging() | ||||
try: | ||||
MinRK
|
r3610 | self.watcher = LogWatcher(config=self.master_config, logname=self.log.name) | ||
MinRK
|
r3604 | except: | ||
self.log.error("Couldn't start the LogWatcher", exc_info=True) | ||||
self.exit(1) | ||||
def start_app(self): | ||||
try: | ||||
MinRK
|
r3610 | self.watcher.start() | ||
MinRK
|
r3604 | self.watcher.loop.start() | ||
except KeyboardInterrupt: | ||||
self.log.critical("Logging Interrupted, shutting down...\n") | ||||
def launch_new_instance(): | ||||
"""Create and run the IPython LogWatcher""" | ||||
app = IPLoggerApp() | ||||
app.start() | ||||
if __name__ == '__main__': | ||||
launch_new_instance() | ||||