Пример #1
0
def configure_logging(logname, level=logging.INFO, filename=None, env=None):
    """
    Configure Python logging package to send log files to ROS-specific log directory
    :param logname str: name of logger, ``str``
    :param filename: filename to log to. If not set, a log filename
        will be generated using logname, ``str``
    :param env: override os.environ dictionary, ``dict``
    :returns: log file name, ``str``
    :raises: :exc:`LoggingException` If logging cannot be configured as specified
    """
    if env is None:
        env = os.environ

    logname = logname or 'unknown'
    log_dir = rospkg.get_log_dir(env=env)
    
    # if filename is not explicitly provided, generate one using logname
    if not filename:
        log_filename = os.path.join(log_dir, '%s-%s.log'%(logname, os.getpid()))
    else:
        log_filename = os.path.join(log_dir, filename)

    logfile_dir = os.path.dirname(log_filename)
    if not os.path.exists(logfile_dir):
        try:
            makedirs_with_parent_perms(logfile_dir)
        except OSError:
            # cannot print to screen because command-line tools with output use this
            sys.stderr.write("WARNING: cannot create log directory [%s]. Please set %s to a writable location.\n"%(logfile_dir, ROS_LOG_DIR))
            return None
    elif os.path.isfile(logfile_dir):
        raise LoggingException("Cannot save log files: file [%s] is in the way"%logfile_dir)

    if 'ROS_PYTHON_LOG_CONFIG_FILE' in os.environ:
        config_file = os.environ['ROS_PYTHON_LOG_CONFIG_FILE']
    else:
        # search for logging config file in /etc/.  If it's not there,
        # look for it package-relative.
        fname = 'python_logging.conf'
        rosgraph_d = rospkg.RosPack().get_path('rosgraph')
        for f in [os.path.join(rospkg.get_ros_home(), 'config', fname),
                  '/etc/ros/%s'%(fname),
                  os.path.join(rosgraph_d, 'conf', fname)]:
            if os.path.isfile(f):
                config_file = f
                break
        else:
            config_file = None

    if config_file is None or not os.path.isfile(config_file):
        # logging is considered soft-fail
        sys.stderr.write("WARNING: cannot load logging configuration file, logging is disabled\n")
        logging.getLogger(logname).setLevel(logging.CRITICAL)
        return log_filename
    
    # pass in log_filename as argument to pylogging.conf
    os.environ['ROS_LOG_FILENAME'] = log_filename
    # #3625: disabling_existing_loggers=False
    logging.config.fileConfig(config_file, disable_existing_loggers=False)
    return log_filename
Пример #2
0
def configure_logging(logname, level=logging.INFO, filename=None, env=None):
    """
    Configure Python logging package to send log files to ROS-specific log directory
    :param logname str: name of logger, ``str``
    :param filename: filename to log to. If not set, a log filename
        will be generated using logname, ``str``
    :param env: override os.environ dictionary, ``dict``
    :returns: log file name, ``str``
    :raises: :exc:`LoggingException` If logging cannot be configured as specified
    """
    if env is None:
        env = os.environ

    logname = logname or 'unknown'
    log_dir = rospkg.get_log_dir(env=env)
    
    # if filename is not explicitly provided, generate one using logname
    if not filename:
        log_filename = os.path.join(log_dir, '%s-%s.log'%(logname, os.getpid()))
    else:
        log_filename = os.path.join(log_dir, filename)

    logfile_dir = os.path.dirname(log_filename)
    if not os.path.exists(logfile_dir):
        try:
            makedirs_with_parent_perms(logfile_dir)
        except OSError:
            # cannot print to screen because command-line tools with output use this
            sys.stderr.write("WARNING: cannot create log directory [%s]. Please set %s to a writable location.\n"%(logfile_dir, ROS_LOG_DIR))
            return None
    elif os.path.isfile(logfile_dir):
        raise LoggingException("Cannot save log files: file [%s] is in the way"%logfile_dir)

    if 'ROS_PYTHON_LOG_CONFIG_FILE' in os.environ:
        config_file = os.environ['ROS_PYTHON_LOG_CONFIG_FILE']
    else:
        # search for logging config file in /etc/.  If it's not there,
        # look for it package-relative.
        fname = 'python_logging.conf'
        rosgraph_d = rospkg.RosPack().get_path('rosgraph')
        for f in [os.path.join(rospkg.get_ros_home(), 'config', fname),
                  '/etc/ros/%s'%(fname),
                  os.path.join(rosgraph_d, 'conf', fname)]:
            if os.path.isfile(f):
                config_file = f
                break
        else:
            config_file = None

    if config_file is None or not os.path.isfile(config_file):
        # logging is considered soft-fail
        sys.stderr.write("WARNING: cannot load logging configuration file, logging is disabled\n")
        logging.getLogger(logname).setLevel(logging.CRITICAL)
        return log_filename
    
    # pass in log_filename as argument to pylogging.conf
    os.environ['ROS_LOG_FILENAME'] = log_filename
    # #3625: disabling_existing_loggers=False
    logging.config.fileConfig(config_file, disable_existing_loggers=False)
    return log_filename
Пример #3
0
def log_dir_size():
    '''
    :return: Disk usage in bytes for ROS log directory.
    :rtype: int
    '''
    d = rospkg.get_log_dir()
    disk_usage = get_disk_usage(d)
    return disk_usage
Пример #4
0
 def log_init(self, log_path):
     log_dir = rospkg.get_log_dir() + "/latest"
     log_dir = os.path.realpath(log_dir)
     log_file = log_dir + "/" + log_path
     log_handle = open(log_file, 'w')
     headers = ','.join(
         ["time", "prob_red_light", "prob_EMA_red_light", "red_light_id"])
     log_handle.write(headers + '\n')
     return log_handle
def test_get_log_dir():
    from rospkg import get_log_dir, get_ros_root
    base = tempfile.gettempdir()
    ros_log_dir = os.path.join(base, 'ros_log_dir')
    ros_home_dir = os.path.join(base, 'ros_home_dir')
    home_dir = os.path.expanduser('~')

    # ROS_LOG_DIR has precedence
    env = {'ROS_ROOT': get_ros_root(), 'ROS_LOG_DIR': ros_log_dir, 'ROS_HOME': ros_home_dir}
    assert ros_log_dir == get_log_dir(env=env)

    env = {'ROS_ROOT': get_ros_root(), 'ROS_HOME': ros_home_dir}
    assert os.path.join(ros_home_dir, 'log') == get_log_dir(env=env)

    env = {'ROS_ROOT': get_ros_root()}
    assert os.path.join(home_dir, '.ros', 'log') == get_log_dir(env=env)

    # test default assignment of env. Don't both checking return value as we would duplicate get_log_dir
    assert get_log_dir() is not None
Пример #6
0
def test_get_log_dir():
    from rospkg import get_log_dir, get_ros_root
    base = tempfile.gettempdir()
    ros_log_dir = os.path.join(base, 'ros_log_dir')
    ros_home_dir = os.path.join(base, 'ros_home_dir')
    home_dir = os.path.expanduser('~')

    # ROS_LOG_DIR has precedence
    env = {'ROS_ROOT': get_ros_root(), 'ROS_LOG_DIR': ros_log_dir, 'ROS_HOME': ros_home_dir }
    assert ros_log_dir == get_log_dir(env=env)

    env = {'ROS_ROOT': get_ros_root(), 'ROS_HOME': ros_home_dir }
    assert os.path.join(ros_home_dir, 'log') == get_log_dir(env=env)

    env = {'ROS_ROOT': get_ros_root()}
    assert os.path.join(home_dir, '.ros', 'log') == get_log_dir(env=env)

    # test default assignment of env. Don't both checking return value as we would duplicate get_log_dir
    assert get_log_dir() is not None
Пример #7
0
    def _configure_logging(self):
        """
        Configure logging of node's log file and stdout/stderr
        @return: stdout log file name, stderr log file
        name. Values are None if stdout/stderr are not logged.
        @rtype: str, str
        """
        log_dir = rospkg.get_log_dir(env=os.environ)
        if self.run_id:
            log_dir = os.path.join(log_dir, self.run_id)
        if not os.path.exists(log_dir):
            try:
                os.makedirs(log_dir)
            except OSError as e:
                if e.errno == 13:
                    raise RLException(
                        "unable to create directory for log file [%s].\nPlease check permissions."
                        % log_dir)
                else:
                    raise RLException(
                        "unable to create directory for log file [%s]: %s" %
                        (log_dir, e.strerror))
        # #973: save log dir for error messages
        self.log_dir = log_dir

        # send stdout/stderr to file. in the case of respawning, we have to
        # open in append mode
        # note: logfileerr: disabling in favor of stderr appearing in the console.
        # will likely reinstate once roserr/rosout is more properly used.
        logfileout = logfileerr = None
        logfname = self._log_name()

        if self.log_output:
            outf, errf = [
                os.path.join(log_dir, '%s-%s.log' % (logfname, n))
                for n in ['stdout', 'stderr']
            ]
            if self.respawn:
                mode = 'a'
            else:
                mode = 'w'
            logfileout = open(outf, mode)
            if is_child_mode():
                logfileerr = open(errf, mode)

        # #986: pass in logfile name to node
        node_log_file = log_dir
        if self.is_node:
            # #1595: on respawn, these keep appending
            self.args = _cleanup_remappings(self.args, '__log:=')
            self.args.append("__log:=%s" %
                             os.path.join(log_dir, "%s.log" % (logfname)))

        return logfileout, logfileerr
Пример #8
0
 def log_init(self, log_path):
     log_dir = rospkg.get_log_dir() + "/latest"
     log_dir = os.path.realpath(log_dir)
     log_file = log_dir + "/" + log_path
     log_handle = open(log_file, 'w')
     headers = ','.join([
         "time", "car_x", "car_y", "closest_idx_waypoint", "waypoint_x",
         "waypoint_y"
     ])
     log_handle.write(headers + '\n')
     return log_handle
Пример #9
0
 def __init__(self, regman, param_server):
     global CHKPT_PATH
     print("ROSRescue ENABLED")
     env = os.environ
     log_dir = rospkg.get_log_dir(env=env)
     CHKPT_PATH = os.path.join(log_dir, "latest-chkpt.yaml")
     self.regman = regman
     self.param_server = param_server
     self.parameters = param_server.parameters
     self.recovering = False
     return
 def __init__(self, *args, **kwargs):
     rospy.init_node(*args, **kwargs)
     self._topics = rospy.get_param('~topics', [])
     self._topics = [
         rospy.resolve_name(topic_name) for topic_name in self._topics
     ]
     self._check_period = rospy.get_param('~check_period', 0.1)
     self._log_directory = rospy.get_param('~log_directory',
                                           rospkg.get_log_dir())
     self._lock = threading.Lock()
     self._mission_recordings = {}
Пример #11
0
def configure_logging(logname, level=logging.INFO, filename=None, env=None):
    """
    Configure Python logging package to send log files to ROS-specific log directory
    @param logname str: name of logger
    @type  logname: str
    @param filename: filename to log to. If not set, a log filename
        will be generated using logname
    @type filename: str
    @param env: override os.environ dictionary
    @type  env: dict
    @return: log file name
    @rtype: str
    @raise roslib.exceptions.ROSLibException: if logging cannot be configured as specified
    """
    if env is None:
        env = os.environ

    logname = logname or 'unknown'
    log_dir = get_log_dir(env=env)
    
    # if filename is not explicitly provided, generate one using logname
    if not filename:
        log_filename = os.path.join(log_dir, '%s-%s.log'%(logname, os.getpid()))
    else:
        log_filename = os.path.join(log_dir, filename)

    logfile_dir = os.path.dirname(log_filename)
    if not os.path.exists(logfile_dir):
        try:
            makedirs_with_parent_perms(logfile_dir)
        except OSError:
            # cannot print to screen because command-line tools with output use this
            sys.stderr.write("WARNING: cannot create log directory [%s]. Please set %s to a writable location.\n"%(logfile_dir, ROS_LOG_DIR))
            return None
    elif os.path.isfile(logfile_dir):
        raise roslib.exceptions.ROSLibException("Cannot save log files: file [%s] is in the way"%logfile_dir)

    if 'ROS_PYTHON_LOG_CONFIG_FILE' in os.environ:
        config_file = os.environ['ROS_PYTHON_LOG_CONFIG_FILE']
    else:
        config_file = os.path.join(get_ros_root(env=env), 'config', 'python_logging.conf')

    if not os.path.isfile(config_file):
        # logging is considered soft-fail
        sys.stderr.write("WARNING: cannot load logging configuration file, logging is disabled\n")
        return log_filename
    
    # pass in log_filename as argument to pylogging.conf
    os.environ['ROS_LOG_FILENAME'] = log_filename
    # #3625: disabling_existing_loggers=False
    logging.config.fileConfig(config_file, disable_existing_loggers=False)
    return log_filename
Пример #12
0
def check_log_disk_usage():
    """
    Check size of log directory. If high, print warning to user
    """
    try:
        d = rospkg.get_log_dir()
        roslaunch.core.printlog("Checking log directory for disk usage. This may take awhile.\nPress Ctrl-C to interrupt") 
        disk_usage = rosclean.get_disk_usage(d)
        # warn if over a gig
        if disk_usage > 1073741824:
            roslaunch.core.printerrlog("WARNING: disk usage in log directory [%s] is over 1GB.\nIt's recommended that you use the 'rosclean' command."%d)
        else:
            roslaunch.core.printlog("Done checking log file disk usage. Usage is <1GB.")            
    except:
        pass
Пример #13
0
def check_log_disk_usage():
    """
    Check size of log directory. If high, print warning to user
    """
    try:
        d = rospkg.get_log_dir()
        roslaunch.core.printlog("Checking log directory for disk usage. This may take awhile.\nPress Ctrl-C to interrupt") 
        disk_usage = rosclean.get_disk_usage(d)
        # warn if over a gig
        if disk_usage > 1073741824:
            roslaunch.core.printerrlog("WARNING: disk usage in log directory [%s] is over 1GB.\nIt's recommended that you use the 'rosclean' command."%d)
        else:
            roslaunch.core.printlog("Done checking log file disk usage. Usage is <1GB.")            
    except:
        pass
Пример #14
0
def rosclean():
    '''
    Removes the content of the ROS-log directory. We didn't use rosclean purge because it
    removes the log-directory. This needs restart of ROS nodes or recreate log directory
    to get log again.
    '''
    d = rospkg.get_log_dir()
    if d and d != os.path.sep:
        ps = SupervisedPopen(['rm -fr %s/*' % d],
                             stdout=subprocess.PIPE,
                             shell=True,
                             object_id='rosclean')
        output_err = ps.stderr.read()
        if output_err:
            raise Exception(output_err)
Пример #15
0
 def log_init(self, log_path):
     log_dir = rospkg.get_log_dir() + "/latest"
     log_dir = os.path.realpath(log_dir)
     log_file = log_dir + "/" + log_path
     log_handle = open(log_file, 'w')
     headers = ','.join([
         "throttle_p_effort", "throttle_i_effort", "throttle_d_effort",
         "brake_p_effort", "brake_i_effort", "brake_d_effort",
         "velocity_error", "DT", "latchBrake", "dbw_time",
         "target_linear_velocity", "target_angular_velocity",
         "current_linear_velocity", "current_angular_velocity",
         "dbw_status", "throttle", "brake", "steering"
     ])
     log_handle.write(headers + '\n')
     return log_handle
Пример #16
0
    def _configure_logging(self):
        """
        Configure logging of node's log file and stdout/stderr
        @return: stdout log file name, stderr log file
        name. Values are None if stdout/stderr are not logged.
        @rtype: str, str
        """    
        log_dir = rospkg.get_log_dir(env=os.environ)
        if self.run_id:
            log_dir = os.path.join(log_dir, self.run_id)
        if not os.path.exists(log_dir):
            try:
                os.makedirs(log_dir)
            except OSError as e:
                if e.errno == 13:
                    raise RLException("unable to create directory for log file [%s].\nPlease check permissions."%log_dir)
                else:
                    raise RLException("unable to create directory for log file [%s]: %s"%(log_dir, e.strerror))
        # #973: save log dir for error messages
        self.log_dir = log_dir

        # send stdout/stderr to file. in the case of respawning, we have to
        # open in append mode
        # note: logfileerr: disabling in favor of stderr appearing in the console.
        # will likely reinstate once roserr/rosout is more properly used.
        logfileout = logfileerr = None
        logfname = self._log_name()
        
        if self.log_output:
            outf, errf = [os.path.join(log_dir, '%s-%s.log'%(logfname, n)) for n in ['stdout', 'stderr']]
            if self.respawn:
                mode = 'a'
            else:
                mode = 'w'
            logfileout = open(outf, mode)
            if is_child_mode():
                logfileerr = open(errf, mode)

        # #986: pass in logfile name to node
        node_log_file = log_dir
        if self.is_node:
            # #1595: on respawn, these keep appending
            self.args = _cleanup_remappings(self.args, '__log:=')
            self.args.append("__log:=%s"%os.path.join(log_dir, "%s.log"%(logfname)))

        return logfileout, logfileerr
Пример #17
0
 def __init__(self, config_file="", is_master=True):
     self.noverify = False
     self.master = set()
     self.aliases = dict()
     self.subscribers = dict()
     self.publishers = dict()
     self.providers = dict()
     self.requesters = dict()
     self.methods = dict()
     self.nodes = dict()
     self.peer_publishers = dict()
     self.setters = dict()
     self.getters = dict()
     self.ip_addresses = set()
     self.logger = getLogger()
     """ Set ROS master IP address """
     if is_master:
         if os.environ.has_key("ROS_MASTER_URI"):
             self.master = set(
                 uri_to_ip_address_list(os.environ.get("ROS_MASTER_URI")))
         else:
             raise RuntimeError(
                 "ROS_MASTER_URI environment variable not set")
     self.master.update(resolve_ip_address("localhost"))
     self.logger.info("Setting master from ROS_MASTER_URI: %s" %
                      self.master)
     """ ROS authorization configuration file is stored in environment variable """
     if config_file == "":
         if os.environ.has_key("ROS_AUTH_FILE"):
             config_file = os.environ.get("ROS_AUTH_FILE")
     if config_file == "":
         self.noverify = True
         self.logger.warn(
             "Authorization configuration file not specified. Secure ROS is disabled!"
         )
     elif not os.path.exists(config_file):
         raise RuntimeError(
             "Authorization configuration file %s does not exist" %
             config_file)
     else:
         self.logger.info("Loading authorization from %s" % config_file)
         self.load(config_file)
     output_file = "%s/ros_auth_full.yaml" % rospkg.get_log_dir(
         env=os.environ)
     self.logger.info("Writing full authorization to %s" % output_file)
     self.save(output_file)
 def _configure_logging(self):
     """
     Configure logging of node's log file and stdout/stderr
     @return: stdout log file name, stderr log file
     name. Values are None if stdout/stderr are not logged.
     @rtype: str, str
     """    
     log_dir = rospkg.get_log_dir(env=os.environ)
     if self.run_id:
         log_dir = os.path.join(log_dir, self.run_id)
     if not os.path.exists(log_dir):
         try:
             os.makedirs(log_dir)
         except OSError, (errno, msg):
             if errno == 13:
                 raise RLException("unable to create directory for log file [%s].\nPlease check permissions."%log_dir)
             else:
                 raise RLException("unable to create directory for log file [%s]: %s"%(log_dir, msg))
Пример #19
0
 def _configure_logging(self):
     """
     Configure logging of node's log file and stdout/stderr
     @return: stdout log file name, stderr log file
     name. Values are None if stdout/stderr are not logged.
     @rtype: str, str
     """    
     log_dir = rospkg.get_log_dir(env=os.environ)
     if self.run_id:
         log_dir = os.path.join(log_dir, self.run_id)
     if not os.path.exists(log_dir):
         try:
             os.makedirs(log_dir)
         except OSError, (errno, msg):
             if errno == 13:
                 raise RLException("unable to create directory for log file [%s].\nPlease check permissions."%log_dir)
             else:
                 raise RLException("unable to create directory for log file [%s]: %s"%(log_dir, msg))
Пример #20
0
def logs_main():
    from optparse import OptionParser
    parser = OptionParser(usage="usage: %prog", prog=NAME)
    options, args = parser.parse_args()
    if args:
        parser.error("%s takes no arguments"%NAME)
        
    log_dir = rospkg.get_log_dir()
    if not log_dir:
        print >> sys.stderr, "Cannot determine ROS log directory"
        sys.exit(1)
        
    run_id = get_run_id()
    if not run_id:
        # go ahead and print the log directory
        print("No active roscore", file=sys.stderr)
        print(log_dir)
        sys.exit(2)

    print(os.path.join(log_dir, run_id))
Пример #21
0
def logs_main():
    from optparse import OptionParser
    parser = OptionParser(usage="usage: %prog", prog=NAME)
    options, args = parser.parse_args()
    if args:
        parser.error("%s takes no arguments" % NAME)

    log_dir = rospkg.get_log_dir()
    if not log_dir:
        print("Cannot determine ROS log directory", file=sys.stderr)
        sys.exit(1)

    run_id = get_run_id()
    if not run_id:
        # go ahead and print the log directory
        print("No active roscore", file=sys.stderr)
        print(log_dir)
        sys.exit(2)

    print(os.path.join(log_dir, run_id))
Пример #22
0
    def output_xml(self):
        """
        Simply outputs the topic and node metadata to XML. Runs atexit.
        ROSpalantir files are saved as ~/.ros/log/rospalantir-*.
        """
        #Opt-In Level:
        level = os.environ['ROS_PALANTIR']
        if level == "None":
            return
        user_name_string = os.environ['ROS_PALANTIR_USERNAME']
        password_string = os.environ['ROS_PALANTIR_PASSWORD']
        self.preprocess_xml()

        doc = Document()
        root = doc.createElement('root')
        doc.appendChild(root)

        #User Info
        user = doc.createElement('user')
        root.appendChild(user)
        #if level == "1":
        #    mac = doc.createElement('mac')
        #    mac_content = doc.createTextNode(str(get_mac()))
        #    mac.appendChild(mac_content)
        #    user.appendChild(mac)
        
        user_name = doc.createElement('user_name')
        user_name_content = doc.createTextNode(user_name_string)
        user_name.appendChild(user_name_content)
        user.appendChild(user_name)

        password = doc.createElement('password')
        password_content = doc.createTextNode(password_string)
        password.appendChild(password_content)
        user.appendChild(password)        
        
        #if level == "1" or level == "2":
            #Get IP

        #Msgs
        msgs = doc.createElement('msgs')
        root.appendChild(msgs)
        for msg in self.registeredList:
            rospy.logdebug(msg.process_name)
            indvidual_msg = doc.createElement('msg')
            name = doc.createElement('name')
            name_content = doc.createTextNode(msg.name)
            name.appendChild(name_content)
            indvidual_msg.appendChild(name)

            msg_type = doc.createElement('msg_type')
            msg_type_content = doc.createTextNode(msg.msg_type)
            msg_type.appendChild(msg_type_content)
            indvidual_msg.appendChild(msg_type)

            topic_type = doc.createElement('topic_type')
            topic_type_content = doc.createTextNode(msg.topic_type)
            topic_type.appendChild(topic_type_content)
            indvidual_msg.appendChild(topic_type)

            node_name = doc.createElement('node_name')
            node_name_content = doc.createTextNode(self.processNameToNode[msg.process_name.replace('/','',1)])
            node_name.appendChild(node_name_content)
            indvidual_msg.appendChild(node_name)

            duration = doc.createElement('duration')
            duration_content = doc.createTextNode(str(msg.duration))
            duration.appendChild(duration_content)
            indvidual_msg.appendChild(duration)

            msgs.appendChild(indvidual_msg)


        #Launches
        launches = doc.createElement('launches')
        root.appendChild(launches)

        for msg in self.launchList:
            indvidual_msg = doc.createElement('launch')
            package = doc.createElement('package')
            package_content = doc.createTextNode(msg.package)
            package.appendChild(package_content)
            indvidual_msg.appendChild(package)

            node_name = doc.createElement('node_name')
            node_name_content = doc.createTextNode(msg.node_name)
            node_name.appendChild(node_name_content)
            indvidual_msg.appendChild(node_name)

            process_name = doc.createElement('process_name')
            process_name_content = doc.createTextNode(msg.process_name)
            process_name.appendChild(process_name_content)
            indvidual_msg.appendChild(process_name)

            desktop_session = doc.createElement('desktop_session')
            desktop_session_content = doc.createTextNode(msg.desktop_session)
            desktop_session.appendChild(desktop_session_content)
            indvidual_msg.appendChild(desktop_session)
            
            master_uri = doc.createElement('master_uri')
            master_uri_content = doc.createTextNode(msg.master_uri)
            master_uri.appendChild(master_uri_content)
            indvidual_msg.appendChild(master_uri)

            ros_distro = doc.createElement('ros_distro')
            ros_distro_content = doc.createTextNode(msg.ros_distro)
            ros_distro.appendChild(ros_distro_content)
            indvidual_msg.appendChild(ros_distro)

            duration = doc.createElement('duration')
            duration_content = doc.createTextNode(str(msg.duration))
            duration.appendChild(duration_content)
            indvidual_msg.appendChild(duration)

            launches.appendChild(indvidual_msg)


        log_dir = rospkg.get_log_dir()
        date_time = time.strftime("%Y-%j-%H-%M-%S")
        file_dir = log_dir + "/rospalantir-" + date_time + ".xml"
        f = open(file_dir,'a')
        f.write(doc.toprettyxml(indent="    ", encoding="utf-8"))
        f.close()
        response = os.system('ping -c 1 google.com')
        if response == 0:
            rp = rospkg.RosPack()
            path = rp.get_path('rospalantir')
            import subprocess
            subprocess.call(["php", path + "/src/rospalantir/rospalantir_to_server.php", log_dir + "/"])
Пример #23
0
def get_logs(loglevel):
    """
    Collect the logs from the ros log files.
    If there is no roscore process running, then it displays the logs
    from the last run.
    """
    from roslaunch.roslaunch_logs import get_run_id
    import rospkg
    import glob
    import re

    logger.info('get logs: log level {}'.format(loglevel))
    log_cursors = request.form.copy()
    logger.debug('cursors: {}'.format(log_cursors))

    log_root = rospkg.get_log_dir()
    run_id = get_run_id()
    roscore_running = True
    if not run_id:
        roscore_running = False
        subdirs = [os.path.join(log_root, d) for d in os.listdir(log_root)
                    if os.path.isdir(os.path.join(log_root, d))]
        if subdirs:
            run_id = max(subdirs, key=os.path.getmtime)
        else:
            run_id = ''

    # some extra log files that not created by roslaunch
    extra_log_files = [os.path.join(log_root, name) for name in [
        'ros_motors_webui.log', 'sophia_Eva_Behavior.log', 'blender_api.log']]
    extra_log_files = [f for f in extra_log_files if os.path.isfile(f)]

    log_dir = os.path.join(log_root, run_id)
    log_files = glob.glob(os.path.join(log_dir, '*.log'))
    log_files += extra_log_files

    # ignore stdout log files
    log_files = [log_file for log_file in log_files if
        ('stdout' not in log_file) and
        (not os.path.basename(log_file).startswith('roslaunch'))]
    log_files = sorted(log_files, key=lambda f: os.path.basename(f))
    logger.debug('get log files: {}'.format('\n'.join(log_files)))
    logs = []

    # log format [%(name)s][%(levelname)s] %(asctime)s: %(message)s
    pattern = r'\[(?P<name>\S+)\]\[(?P<levelname>\S+)\] (?P<asctime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}): (?P<message>.*)'
    p = re.compile(pattern)
    loglevels = {
        'debug': 0,
        'info': 1,
        'warn': 2,
        'warning': 2,
        'error': 3,
        'fatal': 4,
    }

    def escape(s):
        if isinstance(s, list):
            return [escape(i) for i in s]
        s = s.replace("&", "&amp;") # Must be done first!
        s = s.replace("<", "&lt;")
        s = s.replace(">", "&gt;")
        s = s.replace('"', "&quot;")
        return s

    def get_log(log_file, loglevel, cursor, message_length=120):
        """parse log files from the start cursor"""
        _log = []
        loglevel = loglevels[loglevel.lower()]
        with open(log_file) as f:
            for _ in xrange(cursor):
                try:
                    next(f)
                except StopIteration:
                    pass
            logrecord = None
            consume = 0
            for line in f:
                m = p.match(line)
                if m:
                    if logrecord:
                        if loglevels[logrecord['levelname'].lower()] >= loglevel:
                            _log.append(logrecord)
                        cursor += consume
                        consume = 0
                        logrecord = None
                    name, levelname, asctime, message = map(
                        m.group, ['name', 'levelname', 'asctime', 'message'])
                    consume += 1
                    extra = []
                    if len(message) > message_length:
                        extra.append(message[message_length:])
                        message = message[:message_length]
                    logrecord = {
                        'name': name,
                        'levelname': levelname,
                        'asctime': asctime,
                        'message': escape(message),
                        'extra': escape(extra),
                    }
                # Append message that doesn't match the log format to the
                # previous matched log record
                elif logrecord:
                    consume += 1
                    logrecord['extra'].append(line)
            # Append the remaining log record
            if logrecord:
                if loglevels[logrecord['levelname'].lower()] >= loglevel:
                    _log.append(logrecord)
                cursor += consume
                consume = 0
                logrecord = None

        _log.reverse()
        return cursor, _log[:LOG_TO_SHOW]

    def isint(i):
        try:
            int(i)
        except:
            return False
        return True

    def parse_node_name(log_file):
        base = os.path.splitext(os.path.basename(log_file))[0]
        tokens = base.split('-')
        if 'roslaunch' in base:
            return base
        try:
            idx = map(isint, tokens).index(True)
            node = '/'.join(tokens[:idx])
        except:
            node = '/'.join(tokens)
        return node

    for log_file in log_files:
        node = parse_node_name(log_file)
        cursor = int(log_cursors.get(log_file, 0))
        cursor, log = get_log(log_file, loglevel, cursor)
        log_cursors[log_file] = cursor
        if log:
            logs.append({
                'node': node,
                'log': log,
                'log_file': log_file,
                'log_to_show': LOG_TO_SHOW,
                })

    result = {
        'logs': logs,
        'cursors': log_cursors
    }
    return json_encode(result)
Пример #24
0
def get_logs(loglevel):
    """
    Collect the logs from the ros log files.
    If there is no roscore process running, then it displays the logs
    from the last run.
    """
    from roslaunch.roslaunch_logs import get_run_id
    import rospkg
    import glob
    import re

    logger.debug('get logs: log level {}'.format(loglevel))
    log_cursors = request.form.copy()
    logger.debug('cursors: {}'.format(log_cursors))

    log_root = rospkg.get_log_dir()
    run_id = get_run_id()
    roscore_running = True
    if not run_id:
        roscore_running = False
        subdirs = [
            os.path.join(log_root, d) for d in os.listdir(log_root)
            if os.path.isdir(os.path.join(log_root, d))
        ]
        if subdirs:
            run_id = max(subdirs, key=os.path.getmtime)
        else:
            run_id = ''

    # some extra log files that not created by roslaunch
    extra_log_files = []

    log_dir = os.path.join(log_root, run_id)
    log_files = glob.glob(os.path.join(log_dir, '*.log'))
    log_files += extra_log_files

    # ignore stdout log files
    log_files = [
        log_file for log_file in log_files if ('stdout' not in log_file) and (
            not os.path.basename(log_file).startswith('roslaunch'))
    ]
    log_files = sorted(log_files, key=lambda f: os.path.basename(f))
    logger.debug('get log files: {}'.format('\n'.join(log_files)))
    logs = []

    # log format [%(name)s][%(levelname)s] %(asctime)s: %(message)s
    pattern = r'\[(?P<name>\S+)\]\[(?P<levelname>\S+)\] (?P<asctime>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}): (?P<message>.*)'
    p = re.compile(pattern)
    loglevels = {
        'debug': 0,
        'info': 1,
        'warn': 2,
        'warning': 2,
        'error': 3,
        'fatal': 4,
    }

    def escape(s):
        if isinstance(s, list):
            return [escape(i) for i in s]
        s = s.replace("&", "&amp;")  # Must be done first!
        s = s.replace("<", "&lt;")
        s = s.replace(">", "&gt;")
        s = s.replace('"', "&quot;")
        return s

    def get_log(log_file, loglevel, cursor, message_length=120):
        """parse log files from the start cursor"""
        _log = []
        loglevel = loglevels[loglevel.lower()]
        with open(log_file) as f:
            for _ in xrange(cursor):
                try:
                    next(f)
                except StopIteration:
                    pass
            logrecord = None
            consume = 0
            for line in f:
                m = p.match(line)
                if m:
                    if logrecord:
                        if loglevels[
                                logrecord['levelname'].lower()] >= loglevel:
                            _log.append(logrecord)
                        cursor += consume
                        consume = 0
                        logrecord = None
                    name, levelname, asctime, message = map(
                        m.group, ['name', 'levelname', 'asctime', 'message'])
                    consume += 1
                    extra = []
                    if len(message) > message_length:
                        extra.append(message[message_length:])
                        message = message[:message_length]
                    logrecord = {
                        'name': name,
                        'levelname': levelname,
                        'asctime': asctime,
                        'message': escape(message),
                        'extra': escape(extra),
                    }
                # Append message that doesn't match the log format to the
                # previous matched log record
                elif logrecord:
                    consume += 1
                    logrecord['extra'].append(line)
            # Append the remaining log record
            if logrecord:
                if loglevels[logrecord['levelname'].lower()] >= loglevel:
                    _log.append(logrecord)
                cursor += consume
                consume = 0
                logrecord = None

        _log.reverse()
        return cursor, _log[:LOG_TO_SHOW]

    def isint(i):
        try:
            int(i)
        except:
            return False
        return True

    def parse_node_name(log_file):
        base = os.path.splitext(os.path.basename(log_file))[0]
        tokens = base.split('-')
        if 'roslaunch' in base:
            return base
        try:
            idx = map(isint, tokens).index(True)
            node = '/'.join(tokens[:idx])
        except:
            node = '/'.join(tokens)
        return node

    for log_file in log_files:
        node = parse_node_name(log_file)
        cursor = int(log_cursors.get(log_file, 0))
        cursor, log = get_log(log_file, loglevel, cursor)
        log_cursors[log_file] = cursor
        if log:
            logs.append({
                'node': node,
                'log': log,
                'log_file': log_file,
                'log_to_show': LOG_TO_SHOW,
            })

    result = {'logs': logs, 'cursors': log_cursors}
    return json_encode(result)
Пример #25
0
def _get_check_dirs():
    home_dir = rospkg.get_ros_home()
    log_dir = rospkg.get_log_dir()
    dirs = [(log_dir, "ROS node logs"), (os.path.join(home_dir, "rosmake"), "rosmake logs")]
    return [x for x in dirs if os.path.isdir(x[0])]
Пример #26
0
def _get_check_dirs():
    home_dir = rospkg.get_ros_home()
    log_dir = rospkg.get_log_dir()
    dirs = [(log_dir, 'ROS node logs'),
            (os.path.join(home_dir, 'rosmake'), 'rosmake logs')]
    return [x for x in dirs if os.path.isdir(x[0])]
Пример #27
0
    def _configure_logging(self):
        """
        Configure logging of node's log file and stdout/stderr
        @return: stdout log file name, stderr log file
        name. Values are None if stdout/stderr are not logged.
        @rtype: str, str
        """
        log_dir = rospkg.get_log_dir(env=os.environ)
        static_log = os.environ.get('ROS_STATIC_LOG_FILE_NAMES', 0) == '1'
        if self.run_id and not static_log:
            log_dir = os.path.join(log_dir, self.run_id)
        if not os.path.exists(log_dir):
            try:
                os.makedirs(log_dir)
            except OSError as e:
                if e.errno == errno.EACCES:
                    raise RLException("unable to create directory for log file [%s].\nPlease check permissions."%log_dir)
                else:
                    raise RLException("unable to create directory for log file [%s]: %s"%(log_dir, e.strerror))
        # #973: save log dir for error messages
        self.log_dir = log_dir

        # send stdout/stderr to file. in the case of respawning, we have to
        # open in append mode
        # note: logfileerr: disabling in favor of stderr appearing in the console.
        # will likely reinstate once roserr/rosout is more properly used.

        # we create a logger (and we will add to it either a StreamHandler or a FileHandler
        logger = logging.getLogger(self.package+'.'+self.name)
        #if we must write on file :
        if self.log_output:
            logfname = self._log_name()
            outf, errf = [os.path.join(log_dir, '%s-%s.log'%(logfname, n)) for n in ['stdout', 'stderr']]
            if self.respawn or static_log:
                mode = 'a'
            else:
                mode = 'w'
            # we don't propagate logs into the hierarchy. If we do it, when the node will be killed, some unwanted
            # stdout will be displayed on the console...
            logger.propagate = False
            if self.max_logfile_size:
                # We create a rotating file handler if max_logfile_size was set by user in XML launch file.
                hdlr_out = logging.handlers.RotatingFileHandler(outf, mode=mode, maxBytes=self.max_logfile_size,
                                                                backupCount=self.logfile_count)
                if is_child_mode():
                    hdlr_err = logging.handlers.RotatingFileHandler(errf, mode=mode, maxBytes=self.max_logfile_size,
                                                                    backupCount=self.logfile_count)
            else:
                # We create a simple file to have the same behaviour as before if there is no maxBytes attributes :
                hdlr_out = logging.FileHandler(outf, mode=mode)
                if is_child_mode():
                    hdlr_err = logging.FileHandler(errf, mode=mode)

            hdlr_out.setLevel(logging.INFO)
            logger.addHandler(hdlr_out)
            if is_child_mode():
                hdlr_err.setLevel(logging.ERROR)
                logger.addHandler(hdlr_err)
            # #986: pass in logfile name to node
            node_log_file = log_dir
            if self.is_node:
                # #1595: on respawn, these keep appending
                self.args = _cleanup_remappings(self.args, '__log:=')
                self.args.append("__log:=%s"%os.path.join(log_dir, "%s.log"%(logfname)))

        # if We must log to screen
        if self.screen_output:
            # we create handlers for stdout and stderr, and we add them to the logger.
            hdlr_stdout = logging.StreamHandler(sys.stdout)
            hdlr_stdout.setLevel(logging.INFO)
            logger.addHandler(hdlr_stdout)
            if is_child_mode():
                hdlr_stderr = logging.StreamHandler(sys.stderr)
                hdlr_stderr.setLevel(logging.ERROR)
                logger.addHandler(hdlr_err)

        return logger
Пример #28
0
import matplotlib.pyplot as plt
import numpy as np
import rospkg
import os.path

Plot_Lateral_Control = False
Plot_Longitudinal_Control = True

#data from waypoint updater node
log_dir = rospkg.get_log_dir() + "/latest"
log_dir = os.path.realpath(log_dir)
log_file = log_dir + "/" + "waypoint_updater.csv"
wu_time, x, y, wp, cx, cy = np.loadtxt(log_file,
                                       delimiter=',',
                                       skiprows=1,
                                       unpack=True)
#data from dbw node
log_file = log_dir + "/" + "dbw_node.csv"
throttle_p_effort, throttle_i_effort, throttle_d_effort, brake_p_effort, brake_i_effort, brake_d_effort, velocity_error, DT, latchBrake, dbw_time, target_linear_velocity, target_angular_velocity, current_linear_velocity, current_angular_velocity, dbw_status, throttle, brake, steering, = np.loadtxt(
    log_file, delimiter=',', skiprows=1, unpack=True)

#time align data from different ros nodes
start_time = wu_time[0]
dbw_time = dbw_time - start_time
wu_time = wu_time - start_time
dbw_time = dbw_time * 1E-9
wu_time = wu_time * 1E-9

################ lateral controller subplot ##################
if Plot_Lateral_Control:
    f, axx = plt.subplots(2, 3)
Пример #29
0
    def output_xml(self):
        
        self.preprocess_xml()

        doc = Document()
        root = doc.createElement('root')
        doc.appendChild(root)
        msgs = doc.createElement('msgs')
        root.appendChild(msgs)

        for msg in self.registeredList:
            rospy.logdebug(msg.process_name)
            indvidual_msg = doc.createElement('msg')
            name = doc.createElement('name')
            name_content = doc.createTextNode(msg.name)
            name.appendChild(name_content)
            indvidual_msg.appendChild(name)

            msg_type = doc.createElement('msg_type')
            msg_type_content = doc.createTextNode(msg.msg_type)
            msg_type.appendChild(msg_type_content)
            indvidual_msg.appendChild(msg_type)

            topic_type = doc.createElement('topic_type')
            topic_type_content = doc.createTextNode(msg.topic_type)
            topic_type.appendChild(topic_type_content)
            indvidual_msg.appendChild(topic_type)

            node_name = doc.createElement('node_name')
            node_name_content = doc.createTextNode(self.processNameToNode[msg.process_name.replace('/','',1)])
            node_name.appendChild(node_name_content)
            indvidual_msg.appendChild(node_name)

            duration = doc.createElement('duration')
            duration_content = doc.createTextNode(str(msg.duration))
            duration.appendChild(duration_content)
            indvidual_msg.appendChild(duration)

            msgs.appendChild(indvidual_msg)


        launches = doc.createElement('launches')
        root.appendChild(launches)

        for msg in self.launchList:
            indvidual_msg = doc.createElement('launch')
            package = doc.createElement('package')
            package_content = doc.createTextNode(msg.package)
            package.appendChild(package_content)
            indvidual_msg.appendChild(package)

            node_name = doc.createElement('node_name')
            node_name_content = doc.createTextNode(msg.node_name)
            node_name.appendChild(node_name_content)
            indvidual_msg.appendChild(node_name)

            process_name = doc.createElement('process_name')
            process_name_content = doc.createTextNode(msg.process_name)
            process_name.appendChild(process_name_content)
            indvidual_msg.appendChild(process_name)

            desktop_session = doc.createElement('desktop_session')
            desktop_session_content = doc.createTextNode(msg.desktop_session)
            desktop_session.appendChild(desktop_session_content)
            indvidual_msg.appendChild(desktop_session)
            
            master_uri = doc.createElement('master_uri')
            master_uri_content = doc.createTextNode(msg.master_uri)
            master_uri.appendChild(master_uri_content)
            indvidual_msg.appendChild(master_uri)

            ros_distro = doc.createElement('ros_distro')
            ros_distro_content = doc.createTextNode(msg.ros_distro)
            ros_distro.appendChild(ros_distro_content)
            indvidual_msg.appendChild(ros_distro)

            duration = doc.createElement('duration')
            duration_content = doc.createTextNode(str(msg.duration))
            duration.appendChild(duration_content)
            indvidual_msg.appendChild(duration)

            launches.appendChild(indvidual_msg)

        log_dir = rospkg.get_log_dir()
        date_time = time.strftime("%j-%H-%S")
        file_dir = log_dir + "/roskomodo-" + date_time + ".xml"
        f = open(file_dir,'a')
        f.write(doc.toprettyxml(indent="    ", encoding="utf-8"))
Пример #30
0
def configure_logging(logname, level=logging.INFO, filename=None, env=None):
    """
    Configure Python logging package to send log files to ROS-specific log directory
    :param logname str: name of logger, ``str``
    :param filename: filename to log to. If not set, a log filename
        will be generated using logname, ``str``
    :param env: override os.environ dictionary, ``dict``
    :returns: log file name, ``str``
    :raises: :exc:`LoggingException` If logging cannot be configured as specified
    """
    if env is None:
        env = os.environ

    logname = logname or 'unknown'
    log_dir = rospkg.get_log_dir(env=env)

    # if filename is not explicitly provided, generate one using logname
    if not filename:
        log_filename = os.path.join(log_dir,
                                    '%s-%s.log' % (logname, os.getpid()))
    else:
        log_filename = os.path.join(log_dir, filename)

    logfile_dir = os.path.dirname(log_filename)
    if not os.path.exists(logfile_dir):
        try:
            makedirs_with_parent_perms(logfile_dir)
        except OSError:
            # cannot print to screen because command-line tools with output use this
            if os.path.exists(logfile_dir):
                # We successfully created the logging folder, but could not change
                # permissions of the new folder to the same as the parent folder
                sys.stderr.write(
                    "WARNING: Could not change permissions for folder [%s], make sure that the parent folder has correct permissions.\n"
                    % logfile_dir)
            else:
                # Could not create folder
                sys.stderr.write(
                    "WARNING: cannot create log directory [%s]. Please set %s to a writable location.\n"
                    % (logfile_dir, ROS_LOG_DIR))
            return None
    elif os.path.isfile(logfile_dir):
        raise LoggingException(
            "Cannot save log files: file [%s] is in the way" % logfile_dir)

    # the log dir itself should not be symlinked as latest
    if logfile_dir != log_dir:
        if sys.platform not in ['win32']:
            try:
                success = renew_latest_logdir(logfile_dir)
                if not success:
                    sys.stderr.write(
                        "INFO: cannot create a symlink to latest log directory\n"
                    )
            except OSError as e:
                sys.stderr.write(
                    "INFO: cannot create a symlink to latest log directory: %s\n"
                    % e)

    config_file = os.environ.get('ROS_PYTHON_LOG_CONFIG_FILE')
    if not config_file:
        # search for logging config file in ROS_HOME, ROS_ETC_DIR or relative
        # to the rosgraph package directory.
        rosgraph_d = rospkg.RosPack().get_path('rosgraph')
        for config_dir in [
                os.path.join(rospkg.get_ros_home(), 'config'),
                rospkg.get_etc_ros_dir(),
                os.path.join(rosgraph_d, 'conf')
        ]:
            for extension in ('conf', 'yaml'):
                f = os.path.join(
                    config_dir,
                    'python_logging{}{}'.format(os.path.extsep, extension))
                if os.path.isfile(f):
                    config_file = f
                    break
            if config_file is not None:
                break

    if config_file is None or not os.path.isfile(config_file):
        # logging is considered soft-fail
        sys.stderr.write(
            "WARNING: cannot load logging configuration file, logging is disabled\n"
        )
        logging.getLogger(logname).setLevel(logging.CRITICAL)
        return log_filename

    # pass in log_filename as argument to pylogging.conf
    os.environ['ROS_LOG_FILENAME'] = log_filename
    if config_file.endswith(('.yaml', '.yml')):
        with open(config_file) as f:
            dict_conf = yaml.load(f)
        dict_conf.setdefault('version', 1)
        logging.config.dictConfig(dict_conf)
    else:
        # #3625: disabling_existing_loggers=False
        logging.config.fileConfig(config_file, disable_existing_loggers=False)

    return log_filename