1
0
Fork 0

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:
david 2003-02-01 17:59:52 +00:00
parent 603834ccf1
commit 8506e731a2
3 changed files with 65 additions and 20 deletions

View file

@ -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

View file

@ -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 ()
{

View file

@ -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);