Loading src/logger_launcher.php +246 −42 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,7 @@ /*!*************************************************************************** /*!*************************************************************************** *! FILE NAME : logger_launcher.php *! FILE NAME : logger_launcher.php *! DESCRIPTION: launches the event logger (IMU/GPS/External trigger/Other sensor) a dies *! DESCRIPTION: launches the event logger (IMU/GPS/External trigger/Other sensor) a dies *! Copyright (C) 2012 Elphel, Inc *! Copyright (C) 2012-2023 Elphel, Inc *! -----------------------------------------------------------------------------** *! -----------------------------------------------------------------------------** *! *! *! This program is free software: you can redistribute it and/or modify *! This program is free software: you can redistribute it and/or modify Loading Loading @@ -37,23 +37,59 @@ *! *! *! *! */ */ define('SUFFIX_LEN', 5); // file suffix length define('LOGGER_CONF', '/etc/elphel393/imu_logger.xml'); define('BIN_NAME', 'log_imu'); define('DEFAULT_MNT', '/mnt/sda1'); define('DEFAULT_DIR', 'test00'); define('DEFAULT_FILE', 'log_file'); define('DEFAULT_FLEN', 5000000); // 5 M records, 64 bytes each (total 320MB) define('LOGGER_MNT', 'logger_mnt'); define('LOGGER_DIR', 'logger_dir'); define('LOGGER_FILE', 'logger_file'); define('LOGGER_FLEN', 'logger_flen'); include 'include/show_source_include.php'; set_include_path ( get_include_path () . PATH_SEPARATOR . '/www/pages/include' ); include 'show_source_include.php'; include "elphel_functions_include.php"; // includes curl functions //default parameters //default parameters $cmd = "start"; //$cmd = "start"; $file = "/mnt/sda1/imu_log.log"; //$file = "/mnt/sda1/imu_log.log"; $index = 1; //$index = 1; $n = 5000000; //$n = 5000000; $mount_point = "/mnt/sda1"; //$mount_point = "/mnt/sda1"; $force_dev = false; $force_dev = false; $xml = new SimpleXMLElement("<?xml version='1.0' standalone='yes'?><Document/>"); if (file_exists(LOGGER_CONF)) { $config_xml = simplexml_load_file(LOGGER_CONF); $logger_config = loggerConfigFromXML($config_xml); /* echo "<pre>"; var_dump($logger_config); echo "</pre>"; exit (0); */ } else { $xml->addChild('error', 'no config'); $xml->addChild('description', 'Configuarion file '.LOGGER_CONF.' does not exist. It is created by /usr/bin/start_ims.php'); send_response($xml); exit(1); } if (!isset($logger_config[LOGGER_MNT])) $logger_config[LOGGER_MNT] = DEFAULT_MNT; if (!isset($logger_config[LOGGER_DIR])) $logger_config[LOGGER_DIR] = DEFAULT_DIR; if (!isset($logger_config[LOGGER_FILE])) $logger_config[LOGGER_FILE] = DEFAULT_FILE; if (!isset($logger_config[LOGGER_FLEN])) $logger_config[LOGGER_FLEN] = DEFAULT_FLEN; $xml = "<Document>\n"; if (isset($_GET[LOGGER_MNT])) $logger_config[LOGGER_MNT] = $_GET[LOGGER_MNT]; if (isset($_GET[LOGGER_DIR])) $logger_config[LOGGER_DIR] = $_GET[LOGGER_DIR]; if (isset($_GET[LOGGER_FILE])) $logger_config[LOGGER_FILE] = $_GET[LOGGER_FILE]; if (isset($_GET[LOGGER_FLEN])) $logger_config[LOGGER_FLEN] = $_GET[LOGGER_FLEN]; //get parameters //get parameters if (isset($_GET['cmd'])) $cmd = $_GET['cmd']; if (isset($_GET['cmd'])) $cmd = $_GET['cmd']; /* if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['index'])) $index = $_GET['index']; if (isset($_GET['index'])) $index = $_GET['index']; if (isset($_GET['n'])) $n = $_GET['n']; if (isset($_GET['n'])) $n = $_GET['n']; Loading @@ -63,54 +99,153 @@ if (isset($_GET['dev'])) { $dev = $_GET['dev']; $dev = $_GET['dev']; $force_dev = true; $force_dev = true; } } */ if ($cmd=="start") { switch ($cmd) { case 'readconf': if (!is_dir($mount_point)) mkdir($mount_point); $xml = loggerConfigToXML($logger_config); break; //detect devices case 'writeconf': //$dev = "/dev/hda1"; $xml = loggerConfigToXML($logger_config); $conf_file = fopen ( LOGGER_CONF, "w" ); if (!$force_dev) { fwrite ( $conf_file,$xml->asXML () ); $sda1 = exec("cat /proc/diskstats | grep 'sda1'"); fclose ( $conf_file ); break; if (strlen($sda1)>0) $dev = "/dev/sda1"; case 'stop': else { $proc = getPIDByName('log_imu'); $xml .= "\t<error>CF cards not found</error>\n"; $was_running = count($proc) > 0; send_response($xml); $xml->addChild('prev_state', $was_running ? 'RUNNING' : 'STOPPED'); } if ($was_running){ } exec("killall -1 ".BIN_NAME); exec("mount $dev $mount_point"); exec("/usr/bin/log_imu $file $index $n >/dev/null 2>&1 &"); $xml .= "\t<result>ok</result>\n"; } } if ($cmd=="stop") { exec("killall -1 log_imu"); // unmount // unmount // exec("umount $mount_point"); // exec("umount $mount_point"); exec("sync"); exec("sync"); $xml .= "\t<result>ok</result>\n"; add_state_to_xml($xml); break; case 'start': $proc = getPIDByName('log_imu'); $was_running = count($proc) > 0; $xml->addChild('prev_state', $was_running ? 'RUNNING' : 'STOPPED'); if ($was_running) { $xml->addChild('error', 'was running'); add_state_to_xml($xml); send_response($xml); break; } $dir_path = $logger_config[LOGGER_MNT]; if ($logger_config[LOGGER_DIR]) { $dir_path .= '/'.$logger_config[LOGGER_DIR]; } $pref_path = $dir_path.'/'.$logger_config[LOGGER_FILE]; $xml->addChild('dir_path', $dir_path); $xml->addChild('pref_path', $pref_path); $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); if ($indx == -1){ // create directory recursive if it does not exist $xml->addChild('mkdir', $dir_path); if (! mkdir($dir_path, 0777, true)){ $xml->addChild('error', 'mkdir error'); send_response($xml); exit(0); } $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); } } if ($indx == -1) { $xml->addChild('error', 'write dir does not exist'); break; } if ($indx == -2) { $xml->addChild('error', 'write dir is not a directory'); break; } $exe = '/usr/bin/'.BIN_NAME; $flen = $logger_config[LOGGER_FLEN]; exec("$exe $pref_path $indx $flen >/dev/null 2>&1 &"); add_state_to_xml($xml); break; case 'state': add_state_to_xml($xml); break; case 'next_index': $dir_path = $logger_config[LOGGER_MNT]; if ($logger_config[LOGGER_DIR]) { $dir_path .= '/'.$logger_config[LOGGER_DIR]; } $xml->addChild('dir_path', $dir_path); $xml->addChild('pref_path',$dir_path.'/'.$logger_config[LOGGER_FILE]); $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); switch ($indx) { case -1: $xml->addChild('error', 'write dir does not exist'); break; case -2: $xml->addChild('error', 'write dir is not a directory'); break; default: $xml->addChild('next_index', $indx); } break; } send_response($xml); exit(0); $xml .= "</Document>"; function add_state_to_xml(&$xml){ $proc = getPIDByName('log_imu'); if (count($proc)) { $xml->addChild('state', 'RUNNING'); if (count($proc[0]['argv']) > 1){ $xml->addChild('outfile', $proc[0]['argv'][1]); if (count($proc[0]['argv']) > 2){ $xml->addChild('start_index', $proc[0]['argv'][2]); if (count($proc[0]['argv']) > 3){ $xml->addChild('num_records', $proc[0]['argv'][3]); if (count($proc[0]['argv']) > 4){ $xml->addChild('rewind_by', $proc[0]['argv'][4]); } } } } } else { $xml->addChild('state', 'STOPPED'); } } send_response($xml); function get_next_index($dir_path, $logger_file) { if (!file_exists($dir_path)) { return -1; } else if (!is_dir($dir_path)) { return -2; } $indx = -1; $dirlist = scandir($dir_path, SCANDIR_SORT_ASCENDING); $prefix_len = strlen($logger_file); $entry_len = $prefix_len+1+SUFFIX_LEN; foreach ($dirlist as $logfile) { if (strlen($logfile) == $entry_len) { if (strncmp($logger_file, $logfile, $prefix_len) === 0){ $i = intval(substr($logfile,-SUFFIX_LEN)); if ($i > $indx){ $indx=$i; } } } } return $indx+1; } function send_response($xml){ function send_response($xml){ $rslt=$xml->asXML(); header("Content-Type: text/xml"); header("Content-Type: text/xml"); header("Content-Length: ".strlen($xml)."\n"); header("Content-Length: ".strlen($rslt)."\n"); header("Pragma: no-cache\n"); header("Pragma: no-cache\n"); printf("%s", $xml); printf($rslt); flush(); flush(); } } function _help(){ function _help(){ echo "<pre>\n"; echo "<pre>\n"; echo "Usage example: 'http://192.168.0.9/logger_launcher.php?file=/mnt/sda1/test.log&index=1&n=1000000&dev=/dev/sda1', where\n"; echo "Usage example (OBSOLETE): 'http://192.168.0.9/logger_launcher.php?file=/mnt/sda1/test.log&index=1&n=1000000&dev=/dev/sda1', where\n"; echo "'file'- log name (includes absolute path), '/usr/html/CF/' is the 'dev's mount point\n"; echo "'file'- log name (includes absolute path), '/usr/html/CF/' is the 'dev's mount point\n"; echo "'index'- index added to the log name\n"; echo "'index'- index added to the log name\n"; echo "'n'- max number of records in a single log file\n"; echo "'n'- max number of records in a single log file\n"; Loading @@ -120,5 +255,74 @@ function _help(){ function _usage(){ function _usage(){ _help(); _help(); } } function loggerConfigFromXML($confXML) { $conf = array (); // var_dump($confXML); foreach ( $confXML as $item ) { // var_dump($item); $key = $item->getName (); switch ($key) { case 'imu_registers' : $conf [$key] = array (); foreach ( $item as $reg ) { $rname = substr ( $reg->getName (), 2 ); $conf [$key] [$rname + 0] = (( string ) $reg) + 0; } break; case 'nmea' : $conf [$key] = array (); foreach ( $item as $reg ) { $rname = substr ( $reg->getName (), 2 ); $conf [$key] [$rname + 0] = array ( ( string ) $reg->sentence, ( string ) $reg->format ); } break; case 'imu_period' : $conf [$key] = ( string ) $item; if ($conf [$key] != 'auto') $conf [$key] += 0; break; case 'message' : case 'logger_mnt' : case 'logger_dir' : case 'logger_file' : $conf [$key] = ( string ) $item; break; default : // $conf[$key]=(int) $item; $conf [$key] = (( string ) $item) + 0; } } return $conf; } function loggerConfigToXML($conf) { $logger_xml = new SimpleXMLElement ( "<?xml version='1.0' standalone='yes'?><Logger_configuration/>" ); foreach ( $conf as $key => $value ) { switch ($key) { case 'imu_registers' : $subtree = $logger_xml->addChild ( $key ); for($i = 0; $i < count ( $value ); $i ++) { $subtree->addChild ( 'R_' . sprintf ( '%02d', $i ), sprintf ( "0x%02x", $value [$i] ) ); } break; case 'nmea' : $subtree = $logger_xml->addChild ( $key ); for($i = 0; $i < count ( $value ); $i ++) { $sentence = $subtree->addChild ( 'S_' . sprintf ( '%01d', $i ) ); $sentence->addChild ( 'sentence', $value [$i] [0] ); $sentence->addChild ( 'format', $value [$i] [1] ); } break; default : $logger_xml->addChild ( $key, $value ); } } return $logger_xml; } ?> ?> No newline at end of file Loading
src/logger_launcher.php +246 −42 Original line number Original line Diff line number Diff line Loading @@ -2,7 +2,7 @@ /*!*************************************************************************** /*!*************************************************************************** *! FILE NAME : logger_launcher.php *! FILE NAME : logger_launcher.php *! DESCRIPTION: launches the event logger (IMU/GPS/External trigger/Other sensor) a dies *! DESCRIPTION: launches the event logger (IMU/GPS/External trigger/Other sensor) a dies *! Copyright (C) 2012 Elphel, Inc *! Copyright (C) 2012-2023 Elphel, Inc *! -----------------------------------------------------------------------------** *! -----------------------------------------------------------------------------** *! *! *! This program is free software: you can redistribute it and/or modify *! This program is free software: you can redistribute it and/or modify Loading Loading @@ -37,23 +37,59 @@ *! *! *! *! */ */ define('SUFFIX_LEN', 5); // file suffix length define('LOGGER_CONF', '/etc/elphel393/imu_logger.xml'); define('BIN_NAME', 'log_imu'); define('DEFAULT_MNT', '/mnt/sda1'); define('DEFAULT_DIR', 'test00'); define('DEFAULT_FILE', 'log_file'); define('DEFAULT_FLEN', 5000000); // 5 M records, 64 bytes each (total 320MB) define('LOGGER_MNT', 'logger_mnt'); define('LOGGER_DIR', 'logger_dir'); define('LOGGER_FILE', 'logger_file'); define('LOGGER_FLEN', 'logger_flen'); include 'include/show_source_include.php'; set_include_path ( get_include_path () . PATH_SEPARATOR . '/www/pages/include' ); include 'show_source_include.php'; include "elphel_functions_include.php"; // includes curl functions //default parameters //default parameters $cmd = "start"; //$cmd = "start"; $file = "/mnt/sda1/imu_log.log"; //$file = "/mnt/sda1/imu_log.log"; $index = 1; //$index = 1; $n = 5000000; //$n = 5000000; $mount_point = "/mnt/sda1"; //$mount_point = "/mnt/sda1"; $force_dev = false; $force_dev = false; $xml = new SimpleXMLElement("<?xml version='1.0' standalone='yes'?><Document/>"); if (file_exists(LOGGER_CONF)) { $config_xml = simplexml_load_file(LOGGER_CONF); $logger_config = loggerConfigFromXML($config_xml); /* echo "<pre>"; var_dump($logger_config); echo "</pre>"; exit (0); */ } else { $xml->addChild('error', 'no config'); $xml->addChild('description', 'Configuarion file '.LOGGER_CONF.' does not exist. It is created by /usr/bin/start_ims.php'); send_response($xml); exit(1); } if (!isset($logger_config[LOGGER_MNT])) $logger_config[LOGGER_MNT] = DEFAULT_MNT; if (!isset($logger_config[LOGGER_DIR])) $logger_config[LOGGER_DIR] = DEFAULT_DIR; if (!isset($logger_config[LOGGER_FILE])) $logger_config[LOGGER_FILE] = DEFAULT_FILE; if (!isset($logger_config[LOGGER_FLEN])) $logger_config[LOGGER_FLEN] = DEFAULT_FLEN; $xml = "<Document>\n"; if (isset($_GET[LOGGER_MNT])) $logger_config[LOGGER_MNT] = $_GET[LOGGER_MNT]; if (isset($_GET[LOGGER_DIR])) $logger_config[LOGGER_DIR] = $_GET[LOGGER_DIR]; if (isset($_GET[LOGGER_FILE])) $logger_config[LOGGER_FILE] = $_GET[LOGGER_FILE]; if (isset($_GET[LOGGER_FLEN])) $logger_config[LOGGER_FLEN] = $_GET[LOGGER_FLEN]; //get parameters //get parameters if (isset($_GET['cmd'])) $cmd = $_GET['cmd']; if (isset($_GET['cmd'])) $cmd = $_GET['cmd']; /* if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['file'])) $file = $_GET['file']; if (isset($_GET['index'])) $index = $_GET['index']; if (isset($_GET['index'])) $index = $_GET['index']; if (isset($_GET['n'])) $n = $_GET['n']; if (isset($_GET['n'])) $n = $_GET['n']; Loading @@ -63,54 +99,153 @@ if (isset($_GET['dev'])) { $dev = $_GET['dev']; $dev = $_GET['dev']; $force_dev = true; $force_dev = true; } } */ if ($cmd=="start") { switch ($cmd) { case 'readconf': if (!is_dir($mount_point)) mkdir($mount_point); $xml = loggerConfigToXML($logger_config); break; //detect devices case 'writeconf': //$dev = "/dev/hda1"; $xml = loggerConfigToXML($logger_config); $conf_file = fopen ( LOGGER_CONF, "w" ); if (!$force_dev) { fwrite ( $conf_file,$xml->asXML () ); $sda1 = exec("cat /proc/diskstats | grep 'sda1'"); fclose ( $conf_file ); break; if (strlen($sda1)>0) $dev = "/dev/sda1"; case 'stop': else { $proc = getPIDByName('log_imu'); $xml .= "\t<error>CF cards not found</error>\n"; $was_running = count($proc) > 0; send_response($xml); $xml->addChild('prev_state', $was_running ? 'RUNNING' : 'STOPPED'); } if ($was_running){ } exec("killall -1 ".BIN_NAME); exec("mount $dev $mount_point"); exec("/usr/bin/log_imu $file $index $n >/dev/null 2>&1 &"); $xml .= "\t<result>ok</result>\n"; } } if ($cmd=="stop") { exec("killall -1 log_imu"); // unmount // unmount // exec("umount $mount_point"); // exec("umount $mount_point"); exec("sync"); exec("sync"); $xml .= "\t<result>ok</result>\n"; add_state_to_xml($xml); break; case 'start': $proc = getPIDByName('log_imu'); $was_running = count($proc) > 0; $xml->addChild('prev_state', $was_running ? 'RUNNING' : 'STOPPED'); if ($was_running) { $xml->addChild('error', 'was running'); add_state_to_xml($xml); send_response($xml); break; } $dir_path = $logger_config[LOGGER_MNT]; if ($logger_config[LOGGER_DIR]) { $dir_path .= '/'.$logger_config[LOGGER_DIR]; } $pref_path = $dir_path.'/'.$logger_config[LOGGER_FILE]; $xml->addChild('dir_path', $dir_path); $xml->addChild('pref_path', $pref_path); $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); if ($indx == -1){ // create directory recursive if it does not exist $xml->addChild('mkdir', $dir_path); if (! mkdir($dir_path, 0777, true)){ $xml->addChild('error', 'mkdir error'); send_response($xml); exit(0); } $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); } } if ($indx == -1) { $xml->addChild('error', 'write dir does not exist'); break; } if ($indx == -2) { $xml->addChild('error', 'write dir is not a directory'); break; } $exe = '/usr/bin/'.BIN_NAME; $flen = $logger_config[LOGGER_FLEN]; exec("$exe $pref_path $indx $flen >/dev/null 2>&1 &"); add_state_to_xml($xml); break; case 'state': add_state_to_xml($xml); break; case 'next_index': $dir_path = $logger_config[LOGGER_MNT]; if ($logger_config[LOGGER_DIR]) { $dir_path .= '/'.$logger_config[LOGGER_DIR]; } $xml->addChild('dir_path', $dir_path); $xml->addChild('pref_path',$dir_path.'/'.$logger_config[LOGGER_FILE]); $indx = get_next_index($dir_path, $logger_config[LOGGER_FILE]); switch ($indx) { case -1: $xml->addChild('error', 'write dir does not exist'); break; case -2: $xml->addChild('error', 'write dir is not a directory'); break; default: $xml->addChild('next_index', $indx); } break; } send_response($xml); exit(0); $xml .= "</Document>"; function add_state_to_xml(&$xml){ $proc = getPIDByName('log_imu'); if (count($proc)) { $xml->addChild('state', 'RUNNING'); if (count($proc[0]['argv']) > 1){ $xml->addChild('outfile', $proc[0]['argv'][1]); if (count($proc[0]['argv']) > 2){ $xml->addChild('start_index', $proc[0]['argv'][2]); if (count($proc[0]['argv']) > 3){ $xml->addChild('num_records', $proc[0]['argv'][3]); if (count($proc[0]['argv']) > 4){ $xml->addChild('rewind_by', $proc[0]['argv'][4]); } } } } } else { $xml->addChild('state', 'STOPPED'); } } send_response($xml); function get_next_index($dir_path, $logger_file) { if (!file_exists($dir_path)) { return -1; } else if (!is_dir($dir_path)) { return -2; } $indx = -1; $dirlist = scandir($dir_path, SCANDIR_SORT_ASCENDING); $prefix_len = strlen($logger_file); $entry_len = $prefix_len+1+SUFFIX_LEN; foreach ($dirlist as $logfile) { if (strlen($logfile) == $entry_len) { if (strncmp($logger_file, $logfile, $prefix_len) === 0){ $i = intval(substr($logfile,-SUFFIX_LEN)); if ($i > $indx){ $indx=$i; } } } } return $indx+1; } function send_response($xml){ function send_response($xml){ $rslt=$xml->asXML(); header("Content-Type: text/xml"); header("Content-Type: text/xml"); header("Content-Length: ".strlen($xml)."\n"); header("Content-Length: ".strlen($rslt)."\n"); header("Pragma: no-cache\n"); header("Pragma: no-cache\n"); printf("%s", $xml); printf($rslt); flush(); flush(); } } function _help(){ function _help(){ echo "<pre>\n"; echo "<pre>\n"; echo "Usage example: 'http://192.168.0.9/logger_launcher.php?file=/mnt/sda1/test.log&index=1&n=1000000&dev=/dev/sda1', where\n"; echo "Usage example (OBSOLETE): 'http://192.168.0.9/logger_launcher.php?file=/mnt/sda1/test.log&index=1&n=1000000&dev=/dev/sda1', where\n"; echo "'file'- log name (includes absolute path), '/usr/html/CF/' is the 'dev's mount point\n"; echo "'file'- log name (includes absolute path), '/usr/html/CF/' is the 'dev's mount point\n"; echo "'index'- index added to the log name\n"; echo "'index'- index added to the log name\n"; echo "'n'- max number of records in a single log file\n"; echo "'n'- max number of records in a single log file\n"; Loading @@ -120,5 +255,74 @@ function _help(){ function _usage(){ function _usage(){ _help(); _help(); } } function loggerConfigFromXML($confXML) { $conf = array (); // var_dump($confXML); foreach ( $confXML as $item ) { // var_dump($item); $key = $item->getName (); switch ($key) { case 'imu_registers' : $conf [$key] = array (); foreach ( $item as $reg ) { $rname = substr ( $reg->getName (), 2 ); $conf [$key] [$rname + 0] = (( string ) $reg) + 0; } break; case 'nmea' : $conf [$key] = array (); foreach ( $item as $reg ) { $rname = substr ( $reg->getName (), 2 ); $conf [$key] [$rname + 0] = array ( ( string ) $reg->sentence, ( string ) $reg->format ); } break; case 'imu_period' : $conf [$key] = ( string ) $item; if ($conf [$key] != 'auto') $conf [$key] += 0; break; case 'message' : case 'logger_mnt' : case 'logger_dir' : case 'logger_file' : $conf [$key] = ( string ) $item; break; default : // $conf[$key]=(int) $item; $conf [$key] = (( string ) $item) + 0; } } return $conf; } function loggerConfigToXML($conf) { $logger_xml = new SimpleXMLElement ( "<?xml version='1.0' standalone='yes'?><Logger_configuration/>" ); foreach ( $conf as $key => $value ) { switch ($key) { case 'imu_registers' : $subtree = $logger_xml->addChild ( $key ); for($i = 0; $i < count ( $value ); $i ++) { $subtree->addChild ( 'R_' . sprintf ( '%02d', $i ), sprintf ( "0x%02x", $value [$i] ) ); } break; case 'nmea' : $subtree = $logger_xml->addChild ( $key ); for($i = 0; $i < count ( $value ); $i ++) { $sentence = $subtree->addChild ( 'S_' . sprintf ( '%01d', $i ) ); $sentence->addChild ( 'sentence', $value [$i] [0] ); $sentence->addChild ( 'format', $value [$i] [1] ); } break; default : $logger_xml->addChild ( $key, $value ); } } return $logger_xml; } ?> ?> No newline at end of file