Minor logging changes.
All logs and log entries are now disabled by default, unless explicitly enabled by an 'enabled' property. This works much more intuitively with the GUI dialog.
This commit is contained in:
parent
603834ccf1
commit
8506e731a2
3 changed files with 65 additions and 20 deletions
|
@ -15,36 +15,40 @@ anyway) as the field delimiter:
|
|||
|
||||
<logging>
|
||||
<log>
|
||||
<enabled>true<enabled>
|
||||
<filename>steering.csv</filename>
|
||||
<interval-ms>1000</interval-ms>
|
||||
<delimiter>,</delimiter>
|
||||
<entry>
|
||||
<enabled>true</enabled>
|
||||
<title>Rudder</title>
|
||||
<property>/controls/rudder</property>
|
||||
</entry>
|
||||
<entry>
|
||||
<enabled>true</enabled>
|
||||
<title>Ailerons</title>
|
||||
<property>/controls/aileron</property>
|
||||
</entry>
|
||||
</log>
|
||||
</logging>
|
||||
|
||||
Each 'log' subbranch contains an optional 'filename' property
|
||||
(defaults to "fg_log.csv"), an optional 'delimiter' property (defaults
|
||||
to a comma), an optional 'interval-ms' property (defaults to 0, which
|
||||
logs every frame), and a series of 'entry' subbranches. The
|
||||
'delimiter' property uses only the first character of the property
|
||||
value as the delimiter. Note that the logger does no escaping, so you
|
||||
must choose a delimiter that will not appear in the property values
|
||||
(that's not hard, since most of the values are numeric, but watch for
|
||||
commas in the titles).
|
||||
Each 'log' subbranch contains a required 'enabled' property, an
|
||||
optional 'filename' property (defaults to "fg_log.csv"), an optional
|
||||
'delimiter' property (defaults to a comma), an optional 'interval-ms'
|
||||
property (defaults to 0, which logs every frame), and a series of
|
||||
'entry' subbranches. The 'delimiter' property uses only the first
|
||||
character of the property value as the delimiter. Note that the
|
||||
logger does no escaping, so you must choose a delimiter that will not
|
||||
appear in the property values (that's not hard, since most of the
|
||||
values are numeric, but watch for commas in the titles).
|
||||
|
||||
Each 'entry' subbranch contains a 'property' property specifying the
|
||||
name of the property to be logged, and an optional 'title' property
|
||||
specifying the title to use in the CSV file (defaults to the full path
|
||||
of the property). The elapsed time in milliseconds since the start of
|
||||
the simulation is always included as the first entry with the title
|
||||
"Time", so there is no need to include it explicitly.
|
||||
Each 'entry' subbranch contains a required 'enabled' property, a
|
||||
'property' property specifying the name of the property to be logged,
|
||||
and an optional 'title' property specifying the title to use in the
|
||||
CSV file (defaults to the full path of the property). The elapsed
|
||||
time in milliseconds since the start of the simulation is always
|
||||
included as the first entry with the title "Time", so there is no need
|
||||
to include it explicitly.
|
||||
|
||||
Here's a sample of the logging output for the above log:
|
||||
|
||||
|
@ -79,4 +83,4 @@ The output log files are always relative to the current directory.
|
|||
|
||||
--
|
||||
|
||||
David Megginson, 2002-03-12
|
||||
David Megginson, last updated 2002-02-01
|
||||
|
|
|
@ -39,21 +39,54 @@ FGLogger::init ()
|
|||
|
||||
vector<SGPropertyNode_ptr> children = logging->getChildren("log");
|
||||
for (unsigned int i = 0; i < children.size(); i++) {
|
||||
|
||||
SGPropertyNode * child = children[i];
|
||||
|
||||
if (!child->getBoolValue("enabled", false))
|
||||
continue;
|
||||
|
||||
_logs.push_back(Log());
|
||||
Log &log = _logs[_logs.size()-1];
|
||||
SGPropertyNode * child = children[i];
|
||||
string filename = child->getStringValue("filename", "fg_log.csv");
|
||||
log.interval_ms = child->getLongValue("interval-ms", 0);
|
||||
log.delimiter = child->getStringValue("delimiter", ",")[0];
|
||||
|
||||
string filename = child->getStringValue("filename");
|
||||
if (filename.size() == 0) {
|
||||
filename = "fg_log.csv";
|
||||
child->setStringValue("filename", filename.c_str());
|
||||
}
|
||||
|
||||
string delimiter = child->getStringValue("delimiter");
|
||||
if (delimiter.size() == 0) {
|
||||
delimiter = ",";
|
||||
child->setStringValue("delimiter", delimiter.c_str());
|
||||
}
|
||||
|
||||
log.interval_ms = child->getLongValue("interval-ms");
|
||||
log.delimiter = delimiter.c_str()[0];
|
||||
log.output = new ofstream(filename.c_str());
|
||||
if (!log.output) {
|
||||
SG_LOG(SG_INPUT, SG_ALERT, "Cannot write log to " << filename);
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Process the individual entries (Time is automatic).
|
||||
//
|
||||
vector<SGPropertyNode_ptr> entries = child->getChildren("entry");
|
||||
(*log.output) << "Time";
|
||||
for (unsigned int j = 0; j < entries.size(); j++) {
|
||||
SGPropertyNode * entry = entries[j];
|
||||
|
||||
//
|
||||
// Set up defaults.
|
||||
//
|
||||
if (!entry->hasValue("property")) {
|
||||
entry->setBoolValue("enabled", false);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!entry->getBoolValue("enabled"))
|
||||
continue;
|
||||
|
||||
SGPropertyNode * node =
|
||||
fgGetNode(entry->getStringValue("property"), true);
|
||||
log.nodes.push_back(node);
|
||||
|
@ -64,6 +97,13 @@ FGLogger::init ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
FGLogger::reinit ()
|
||||
{
|
||||
_logs.clear();
|
||||
init();
|
||||
}
|
||||
|
||||
void
|
||||
FGLogger::bind ()
|
||||
{
|
||||
|
|
|
@ -40,6 +40,7 @@ public:
|
|||
|
||||
// Implementation of FGSubsystem
|
||||
virtual void init ();
|
||||
virtual void reinit ();
|
||||
virtual void bind ();
|
||||
virtual void unbind ();
|
||||
virtual void update (double dt);
|
||||
|
|
Loading…
Reference in a new issue