ros创建日志文件会检测三个环境变量,ROS_LOG_DIR,ROS_HOME,HOME,看一下源码:
......
if (get_environment_variable(ros_log_env, "ROS_LOG_DIR")) //首先检查ROS_LOG_DIR环境变量,默认为空
{
log_file_name = ros_log_env + std::string("/"); //若存在则将日志目录指定为$ROS_LOG_DIR
}
else //若不存在ROS_LOG_DIR
{
if (get_environment_variable(ros_log_env, "ROS_HOME")) //检查ROS_HOME环境变量,默认为空
{
log_file_name = ros_log_env + std::string("/log/"); //若存在则将日志目录指定为$ROS_HOME/log
}
else // ROS_HOME不存在
{
// Not cross-platform?
if (get_environment_variable(ros_log_env, "HOME")) //使用$HOME,一般为/home/${user}
{
std::string dotros = ros_log_env + std::string("/.ros/"); //在$HOME目录下创建.ros
fs::create_directory(dotros);
log_file_name = dotros + "log/"; // 最终的日志目录为$HOME/.ros/log
fs::create_directory(log_file_name);
}
}
}
......
通过配置ROS_LOG_DIR环境变量可以修改rosout.log的保存路径;修改后会在$ROS_LOG_DIR路径下生成一个一长串数字的目录,类似于“a7ecc84a-cd84-11eb-8580-0f0cffefeffd”,这个数字是根据本机mac地址、运行时间等信息生成的唯一UUID,可以通过rosparam get /run_id查看。
指定此环境变量可以修改roslaunch启动的日志,会自动创建$ROS_HOME/log目录,所以$ROS_HOME中不需要包含log的子目录。可以通过roslaunch-logs查看当前的日志目录设置。
指定日志输出到终端的显示格式,选项有:
severity - 日志等级
time - 时间
thread - 线程信息
node - 节点名
file - 文件名
line - 行号
function - 函数名
message - 具体的消息
例:export ROSCONSOLE_FORMAT=’[${severity}][${node}] [${function}] line:${line} ${message}’
ROSCONSOLE_CONFIG_FILE 指定log4cxx的配置文件路径,节点启动时会检查此环境变量,若不为空会去加载$ROSCONSOLE_CONFIG_FILE中的配置文件,若为空会加载$ROS_ROOT/config/rosconsole.config文件作为log4cxx的配置文件
这个文件实际上用于ros中log4cxx的配置选项,若ROSCONSOLE_CONFIG_FILE环境变量没有设置会加载|$ROS_ROOT/config/rosconsole.config作为配置文件,否则会以$ROSCONSOLE_CONFIG_FILE作为配置文件。配置文件中的部分选项如下:
log4j.logger.ros.pkg=INFO,stdout,pkg_pro
# pkg是ros中的package名;stdout指的是标准输出;pkg_pro是别名,后面的配置可以使用此名称来定义他的属性,此行代码代表将ros中pkg的包的日志输出到stdout和pkg_pro两个地方,等级为INFO;具体见下文
log4j.appender.pkg_pro=org.apache.log4j.FileAppender
# 输出到文件,未指定其他属性
log4j.appender.pkg_pro=org.apache.log4j.RollingFileAppender
# 输出到文件,属性:超过大小后自动创建下一个
log4j.appender.pkg_pro.MaxFileSize=100KB
# 指定每个日志的最大大小(RollingFileAppender的属性)
log4j.appender.pkg_pro.MaxBackupIndex=14
# 最多产生多少日志文档,默认2个(RollingFileAppender的属性)
log4j.appender.pkg_pro=org.apache.log4j.DailyRollingFileAppender
# 输出到文件,属性每天创建一个文件
log4j.appender.pkg_pro.DatePattern=’.'yyyy-MM-dd
# 每天输出一个文件(DailyRollingFileAppender的属性,若指定了DailyRollingFileAppender属性而不配置会报解析失败),其他DatePattern属性还包括:
yyyy-MM 每月,yyyy-ww 每周,yyyy-MM-dd 每天,yyyy-MM-dd-a 每天两次,yyyy-MM-dd-HH 每小时,yyyy-MM-dd-HH-mm 每分钟
log4j.appender.pkg_pro.Threshold=INFO
# 指定最低输出的日志等级 INFO及以上等级的日志将被输出
log4j.appender.pkg_pro.Append=true
# 打开追加模式
log4j.appender.pkg_pro.File=log_dir/log.log
# 指定的日志路径,若不是绝对路径会存放到$HOME/log_dir/log.log,可根据需要自己更改,也可结合环境变量${ROSOUT_LOG_PATH}
log4j.appender.pkg_pro.layout=org.apache.log4j.PatternLayout
# 指定layout类型为PatternLayout,其他的一些类型:
org.apache.log4j.HTMLLayout - HTML类型的布局,
org.apache.log4j.PatternLayout - 灵活布局模,可以通过layout.ConversionPattern修改,具体见ConversionPattern的说明
org.apache.log4j.SimpleLayout - 日志级别及详细信息的布局,
org.apache.log4j.TTCCLayout - 日志时间、线程、类别信息的布局
log4j.appender.pkg_pro.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [$p] %m%n
# 指定输出格式
%d{yyyy MM dd HH:mm:ss SSS} - 时间格式,yyyy-四位年份,MM-两位月份,dd-两位日期,HH-两位小时,mm-两位分钟,ss-两份秒数,SSS-三位毫秒,可以自己根据需要修改,
%p 优先级
%r 子程序启动到输出此条信息经历的毫秒数
%c 输出所属的类目,通常就是所在类的全名,
%t 输出产生该日志事件的线程名,
%m 输出代码中指定的消息,
%L 输出日志的行数
%M 函数名
%F 文件名
%l 相当于%c%M(%F.%L)
%n 换行符\n(若为windows 则输出\r\n)