Graphische Auswertung fuer Mosshe
From NJH-Wiki
- Autor
- Frank Prößdorf
Voraussetzungen
Diese Howto geht von folgenden Gegebenheiten aus:
- Folgende Programme sind installiert und lauffähig:
- Folgende PEAR Bibliotheken sind installiert:
- Image_Graph
- Image_Canvas
- Image_Color
- Numbers_Roman
- Numbers_Words
PHP Script
Dieses kleine PHP Script durchforstet die abgelegten Log Dateien und stellt sie je nach Benutzerwunsch auch graphisch dar. Möchte man mehr als ein paar Tage darstellen, sieht es noch recht unreif aus.
<?php
$pfad = './Logs';
function auswertung($short)
{
$auswertungsart = array(
'net_traffic' => 'Netzwerktraffic (MB)',
'shells' => 'Shells',
'memory' => 'Memory (MB)',
'load' => 'Load (%)',
'ping' => 'Ping (sec)',
'net_errors' => 'Netzwerkfehler',
'Failed SSH logins' => 'Fehlgeschlagene SSH Logins',
'Other failed logins' => 'Fehlgeschlagene andere Logins',
'zombies' => 'Zombies',
'processes' => 'Prozesse',
'/dev/hda1' => '',
'/dev/sda1' => '');
return $auswertungsart[$short];
}
// hole die Daten der Logfiles
function get_logs($pfad)
{
$Logs = array();
if ($handle = opendir($pfad)) {
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..' && strstr($file, '-')) {
$file_array = explode('.', $file);
$Logs[] = $file_array[0];
}
}
closedir($handle);
}
rsort($Logs);
return $Logs;
}
// setze das vonbis array aus den beiden Daten zusammen
function vonbis($von, $bis, $pfad) {
$von_ts = strtotime($von);
$bis_ts = strtotime($bis);
if (($von_ts < $bis_ts) && ($bis_ts != NULL)) {
for ($i = $von_ts; $i <= $bis_ts; $i += 86400) {
$datum = date('Y-m-d', $i);
$filename = $pfad.'/'.$datum.'.log';
if (file_exists($filename)) {
$vonbis[] = date('Y-m-d', $i);
}
}
} else {
$vonbis[0] = $von;
}
return $vonbis;
}
// wandle ein englisches in ein deutsches datum um
function date2datum($date)
{
$date_array = explode('-', $date);
return $date_array[2].'.'.$date_array[1].'.'.$date_array[0];
}
// setze den Rechnernamen
if (isset($_POST["rechner"])) {
$rechner_name = $_POST["rechner"];
} else {
$rechner_name = 'server01';
}
// setze die Auswertungsart
if (isset($_POST["auswertung"])) {
$auswertung = $_POST["auswertung"];
} else {
$auswertung = 'net_traffic';
}
// setze das Datumsarray
if (isset($_POST["von"])) {
$vonbis = vonbis($_POST["von"], $_POST["bis"], $pfad);
} else {
$vonbis = false;
}
// Initialisiere den Graphen
require_once 'Image/Graph.php';
$Graph =& Image_Graph::factory('graph', array(600, 300));
$fnt =& $Graph->addNew('font', 'berylium');
$fnt->setSize(10);
$Graph->setFont($fnt);
if (count($vonbis) > 1) {
$graph_title = date2datum($_POST["von"]).' - '.date2datum($_POST["bis"]);
} else {
$graph_title = date2datum($_POST["von"]);
}
$Graph->add(
Image_Graph::vertical(
Image_Graph::factory('title', array($graph_title, 12)),
Image_Graph::vertical(
$Plotarea = Image_Graph::factory('plotarea'),
$Legend = Image_Graph::factory('legend'),
85
),
7
)
);
$Legend->setPlotarea($Plotarea);
$Dataset =& Image_Graph::factory('dataset');
$Logs = get_logs($pfad);
$Server = array();
if ($vonbis) {
foreach ($vonbis as $datum) {
$file = $pfad.'/'.$datum.'.log';
$data_in_file = file($file);
foreach ($data_in_file as $line) {
$line_data = explode(';', $line);
$rechner = $line_data[2];
$zeit = strtotime($line_data[1]);
if (!in_array($rechner, $Server)) {
$Server[] = $rechner;
}
if (strstr($line_data[3], $auswertung) && $rechner == $rechner_name) {
$Dataset->addPoint($zeit, $line_data[5]);
}
}
unset($data_in_file);
}
}
sort($Server);
$Plot =& $Plotarea->addNew('Image_Graph_Plot_Smoothed_Area', $Dataset);
$Plot->setTitle($rechner_name);
$color =& Image_Graph::factory('Image_Graph_Fill_Array');
$color->addColor('gold@0.2');
$AxisX =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
$AxisX->setDataPreprocessor(Image_Graph::factory('Image_Graph_DataPreprocessor_Date', 'H'));
if (count($vonbis) > 1) {
$AxisX->setLabelInterval(array(01,02,03,04,05,06,07,08,09,10));
$AxisX->setTitle(count($vonbis).' Tage');
} else {
$AxisX->setTitle('Uhrzeit');
}
$AxisY =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$AxisY->setTitle(auswertung($auswertung));
$AxisY->setFontAngle(90);
$Plot->setFillColor($color);
$Graph->done(array('filename' => './graph.png'));
?>
<html>
<head>
<link href="./graph.css" title="graph" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Graphische Auswertung von Statistischen Daten</h1>
<div id="output">
<img src="./graph.png" alt="graph" />
</div>
<div id="input">
<form method="post">
<table>
<tr>
<td>Rechnername:</td>
<td><select name="rechner">
<?
foreach ($Server as $elem) {
if ($elem == $rechner_name) {
echo ' <option selected>'.$elem.'</option>';
} else {
echo ' <option>'.$elem.'</option>';
}
}
?>
</select></td>
</tr>
<tr>
<td>Auswertung:</td>
<td><select name="auswertung">
<option value="shells"><?=auswertung('shells')?></option>
<option value="memory"><?=auswertung('memory')?></option>
<option value="load"><?=auswertung('load')?></option>
<option value="ping"><?=auswertung('ping')?></option>
<option value="net_traffic"><?=auswertung('net_traffic')?></option>
<option value="net_errors"><?=auswertung('net_errors')?></option>
<option value="Failed SSH logins"><?=auswertung('Failed SSH logins')?></option>
<option value="Other failed logins"><?=auswertung('Other failed logins')?></option>
<option value="zombies"><?=auswertung('zombies')?></option>
<option value="processes"><?=auswertung('processes')?></option>
<!--<option value="/dev/hda1"></option>
<option value="/dev/sda1"></option>-->
</select></td>
</tr>
<tr>
<td>Von:</td>
<td><select name="von">
<?
foreach ($Logs as $elem) {
if ($elem == $_POST["von"]) {
echo ' <option value="'.$elem.'" selected>'.date2datum($elem).'</option>';
} else {
echo ' <option value="'.$elem.'">'.date2datum($elem).'</option>';
}
}
?>
</select></td>
</tr>
<tr>
<td>Bis:</td>
<td><select name="bis">
<?
foreach ($Logs as $elem) {
if ($elem == $_POST["bis"]) {
echo ' <option value="'.$elem.'" selected>'.date2datum($elem).'</option>';
} else {
echo ' <option value="'.$elem.'">'.date2datum($elem).'</option>';
}
}
?>
</select></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="Erstelle Graphen"></td>
</tr>
</table>
<p> </p>
(Sollten beim ersten Aufruf keine Rechner zur Auswahl<br />
stehen, dann bitte Script ohne Auswahl starten.)
</form>
</div>
</body>
</html>

