Logování – vzdálený syslog
How Can We Help?
Logování – vzdálený syslog
Úvod
Loxone nabízí možnost využití vzdáleného logu, tedy odesílání zpráv logu do logu na jiném zařízení. Výhoda je jasná – logování na SD kartu Loxone snižuje životnost SD karty a navíc na vzdáleném stroji si můžete log analyzovat. K tomu, aby šlo vzdálený log využít, potřebujeme nějaký stroj s Linuxem, nainstalovaným balíčkem rsyslog, webovým serverem s PHP (volitelně s databází). V našem návodu použijeme stroj s nainstalovaným Debianem. Není třeba instalovat grafické prostředí – zbytečně zabírá operační paměť a reálně ho vůbec nepotřebujeme. Já osobně používám virtuální server na svém domácím serveru.
LoxBerry plugin
Od 4.4.2018 je celé řešení k dispozici jako plugin Syslog Server do LoxBerry.
Rsyslog
V Debianu by měl být rsyslog defaultně nainstalovaný. Pokud není, nainstaluje se pomocí:
sudo apt-get install rsyslog
Následně provedeme konfiguraci:
sudo nano /etc/rsyslog.conf
Odkomentujeme řádky týkající se přístupu přes UDP a TCP:
# provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514
Dále pak zakomentujeme řádek s definicí formátu datumu, abychom měli plný timestamp:
# # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # #$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
Dále vytvoříme konfiguraci pro Loxone:
sudo nano /etc/rsyslog.d/loxone.conf
A vložíme do ní konfiguraci přesměrování zpráv z Loxone do samostatného Log souboru.
192.168.1.10 nahradíme adresou Loxone miniserveru:
# změnit skupinu vytvořeného logu na www-data, aby ji mohl číst LogAnalyzer $FileGroup www-data # zpracuj zprávy z Loxone do separátního souboru :fromhost-ip, isequal, "192.168.1.10" /var/log/loxone.log & ~ # pouze zprávy odjinud než z Loxone budou pokračovat dál # Vrátit skupinu pro ostatní Logy na default $FileGroup adm
Restartujeme Rsyslog:
sudo service rsyslog restart
Nastavení Loxone
V Loxone Configu si ve stromu rozbalíme položku Miniserveru, stoupneme na “Zprávy” a klikneme na ikonku Logger. Tím vložíme nový Logger. Přidělíme mu jméno dle libosti a adresu /dev/syslog/<ip_log_serveru>
Pak již běžně přiřazujeme Logger
Analyzování
Adiscon Log Analyzer
K provozování potřebujeme nainstalovat na logserver webserver a php:
(pokud používáte již existující stroj s PHP, zkontrolujte, že máte v apache2 nainstalovaný a aktivovaný mode php; na čisté instalaci se vše provede samo)
sudo apt-get install apache2 php
Stáhneme z oficiálních stránek: http://loganalyzer.adiscon.com/ Cestu za příkazem wget samozřejmě změníme na aktuální. Adekvátně k tomu pak všechny příkazy s loganalyzer-4.1.6 upravit na adekvátní název souboru / adresáře.
Pak rozbalíme a obsah adresáře src zkopírujeme do /var/www/loganalyzer
Pak změníme vlastníka:
wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.6.tar.gz sudo tar -xvzf loganalyzer-4.1.6.tar.gz sudo rm loganalyzer-4.1.6.tar.gz sudo mkdir /var/www/loganalyzer sudo cp -r loganalyzer-4.1.6/src/* /var/www/loganalyzer sudo chown -Rv www-data:www-data /var/www/loganalyzer
Nyní si zkonfigurujeme webserver pro loganalyzer. Vytvoříme soubor /etc/apache2/conf-available/loganalyzer.conf:
sudo nano /etc/apache2/conf-available/loganalyzer.conf
a vložíme do něho následující:
Alias /loganalyzer "/var/www/loganalyzer/" <Directory /var/www/loganalyzer/> Options +FollowSymlinks AllowOverride All Satisfy Any <IfModule mod_dav.c> Dav off </IfModule> SetEnv HOME /var/www/loganalyzer SetEnv HTTP_HOME /var/www/loganalyzer </Directory>
Uděláme link pro aktivaci a restartneme webserver:
sudo ln -s /etc/apache2/conf-available/loganalyzer.conf /etc/apache2/conf-enabled/loganalyzer.conf sudo service apache2 restart
Upravíme parser “misc” pro potřeby Loxone. Jedná se o upravený standardní parser pro syslog. Pro každý ze sedmi typů řádku v syslogu jsem přidal MESSAGETYPE Loxone1 – 7, aby bylo jednoduché určit, která část parseru je případně třeba upravit. V současné době je upravena Loxone2 a Loxone6 – to je log s jednoduchým datumem a precisním datumem, oba odpovídající tomu, co mi posílá Loxone. Pokud se někomu objeví jiný MESSAGETYPE, je třeba odladit další část parseru
sudo nano /var/www/loganalyzer/classes/logstreamlineparsermisc.class.php
A celý obsah nahradíme tímto:
<?php /* ********************************************************************* * LogAnalyzer - http://loganalyzer.adiscon.com * ----------------------------------------------------------------- * * Loxone Smart Home Miniserver Log Parser Class ********************************************************************* */ // --- Avoid directly accessing this file! if ( !defined('IN_PHPLOGCON') ) { die('Hacking attempt'); exit; } // --- // --- Basic Includes require_once($gl_root_path . 'classes/enums.class.php'); require_once($gl_root_path . 'include/constants_errors.php'); require_once($gl_root_path . 'include/constants_logstream.php'); // --- class LogStreamLineParsermisc extends LogStreamLineParser { // protected $_arrProperties = null; // Constructor public function __construct () { return; // Nothing } public function LogStreamLineParsermisc() { self::__construct(); } /** * ParseLine * * @param arrArguments array in&out: properties of interest. There can be no guarantee the logstream can actually deliver them. * @return integer Error stat */ public function ParseLine($szLine, &$arrArguments) { // Sample (Syslog): Mar 10 14:45:44 debandre anacron[3226]: Job `cron.daily' terminated (mailing output) if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32})\[(.*?)\]:(.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone1'; // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]); $arrArguments[SYSLOG_HOST] = $out[3]; $arrArguments[SYSLOG_SYSLOGTAG] = $out[4]; $arrArguments[SYSLOG_PROCESSID] = $out[5]; $arrArguments[SYSLOG_MESSAGE] = $out[6]; } // Sample (Syslog): Mar 10 14:45:39 debandre syslogd 1.4.1#18: restart else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}):(.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone2'; $loxone = $out[3]. ';'. $out[4].':'. $out[5]. $out[6]; $loxone = str_replace(': ',':',$loxone); $loxone = str_replace('#015','',$loxone); $loxone = str_replace('#01','',$loxone); $loxout = explode(';',$loxone); // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($loxout[0]. ' '. $loxout[1]); $arrArguments[SYSLOG_PROCESSID] = $loxout[2]; $arrArguments[SYSLOG_MESSAGE] = $loxout[3]; } // Sample (Syslog): Mar 10 14:45:39 debandre syslogd restart else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}) (.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone3'; // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]); $arrArguments[SYSLOG_HOST] = $out[3]; $arrArguments[SYSLOG_SYSLOGTAG] = $out[4]; $arrArguments[SYSLOG_MESSAGE] = $out[5]; } // Sample (Syslog): Mar 7 17:18:35 debandre exiting on signal 15 else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone4'; // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]); $arrArguments[SYSLOG_HOST] = $out[3]; $arrArguments[SYSLOG_MESSAGE] = $out[4]; } // Sample (RSyslog): 2008-03-28T11:07:40+01:00 localhost rger: test 1 else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone5'; // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($out[1]); $arrArguments[SYSLOG_HOST] = $out[2]; $arrArguments[SYSLOG_SYSLOGTAG] = $out[3]; $arrArguments[SYSLOG_MESSAGE] = $out[4]; } // Sample (RSyslog): 2017-10-24T10:37:48.680031+02:00 2017-10-24 10:37:50;Kotel - spínání;Off#015 else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone6'; $loxone = $out[2]. ';'. $out[3].':'. $out[4]. $out[5]; $loxone = str_replace(': ',':',$loxone); $loxone = str_replace('#015','',$loxone); $loxone = str_replace('#01','',$loxone); $loxout = explode(';',$loxone); // Copy parsed properties! $arrArguments[SYSLOG_DATE] = GetEventTime($loxout[0]. ' '. $loxout[1]); $arrArguments[SYSLOG_PROCESSID] = $loxout[2]; $arrArguments[SYSLOG_MESSAGE] = $loxout[3]; } // Sample: 2008-03-28T15:17:05.480876+01:00,**NO MATCH** else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}),(.*?)$/", $szLine, $out ) ) { $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone7'; // Some kind of debug message or something ... $arrArguments[SYSLOG_DATE] = GetEventTime($out[1]); $arrArguments[SYSLOG_MESSAGE] = $out[2]; } else { if ( isset($arrArguments[SYSLOG_MESSAGE]) && strlen($arrArguments[SYSLOG_MESSAGE]) > 0 ) OutputDebugMessage("Unparseable syslog msg - '" . $arrArguments[SYSLOG_MESSAGE] . "'", DEBUG_ERROR); } // If SyslogTag is set, we check for MessageType! if ( isset($arrArguments[SYSLOG_SYSLOGTAG]) ) { if ( strpos($arrArguments[SYSLOG_SYSLOGTAG], "EvntSLog" ) !== false ) $arrArguments[SYSLOG_MESSAGETYPE] = IUT_NT_EventReport; } // Return success! return SUCCESS; } } ?>
Na závěr provedeme konfiguraci. Spustíme v prohlížeči http://<log_server>/loganalyzer Načte se stránka Critical Error occured, s odkazem Click here to Install Adiscon LogAnalyzer! Kliknete na “here” a spustí se průvodce. Během konfigurace zvolíme Logline type na Miscellaneous Logfiles a Syslog file na náš Log soubor z Loxone.
Konfigurace se uloží do souboru /var/www/loganalyzer/config.php Pokud chceme udělat celý proces konfigurace znovu, stačí tento soubor vymazat a znovu jít na stránku. Po konfiguraci je třeba pro podporu českých znaků změnit v config.php parametr $CFG[‘HeaderDefaultEncoding’] na ENC_UTF8 .
Autor článku: Zmáťa
32 thoughts on “Logování – vzdálený syslog”
Super!.
Prochazel jsem navod a jedine co bych doplnil, ze “Zpravy” jsou az polozce Miniserveru, nikoli v hlavnim strome. Chvilku mi trvalo to najit 😉
A pak dotaz, kdyz dam adresu /dev/syslog/, tak jak on zjisti IP adresu, na kterou ma komunikovat?
Tam byl původně /dev/syslog/, ale jak jsem bojoval s formátováním a ztrácením tagů …, tak se to vytratilo. Až to uvolníš, tak to opravím
A zase;-)
/dev/syslog/<ip_log_serveru>
Je to opraveno. Doufám, že mi žádne jiné věci vlivem formátování nevypadly. Kdyby něco nefungovalo, pište.
Ajo, tam byly vetsitka a mensitka. No on to preklada do HTML tagu 😉
Blbá otázka od neznalého linuxu.
Toto všechno si rozběhnu na RaspberyPI.
Když se ale chci podívat ze stolního PC (s win) na ten loganalyzer (http:///loganalyzer) vyhodí mi to, že nemám oprávnění (You don’t have permission to access /loganalyzer on this server.)
Adresa je http://ip_serveru/loganalyzer
Pokud to tak zadáváš, tak zkontroluj, že adresář a soubory mají vlastníka a skupinu www-data – to řešil příkaz
sudo chown -Rv www-data:www-data /var/www/loganalyzer
Pak je možné podívat se na error log webserveru.
Pokud vše ok, napiš mi OS (předpokládám, že na raspberry máš raspbian) a jeho verzi (jessie, stretch, …). Zkusím si večer udělat virtuál s tím co máš a projít to podle návodu.
Adresu jsem myslel ve formátu jak píšeš, asi jsem špatně napsal.
Práva jsem složce /var/www/loganalyzer nastavil:
drwxr-xr-x 3 www-data www-data 4096 Nov 11 15:16 loganalyzer
V error logu mám uvedeno (IP adresu sem změnil já):
[Sun Nov 12 06:25:02.606255 2017] [mpm_prefork:notice] [pid 435] AH00163: Apache/2.4.25 (Raspbian) configured — resuming normal operations
[Sun Nov 12 06:25:02.612665 2017] [core:notice] [pid 435] AH00094: Command line: ‘/usr/sbin/apache2’
[Sun Nov 12 11:47:07.041488 2017] [authz_core:error] [pid 5494] [client 192.168.x.xxx:6579] AH01630: client denied by server configuration: /etc/apache2/\xe2\x80\x9c
V návodu mám chybu. Doma mám loganalyzer v cestě /home/www/loganalyzer a tady jsem to na některých místech nepřepsal (v definici /etc/apache2/conf-available/loganalyzer.conf) když si to opravíš na /var/www/loganalyzer, tak by ti to mělo začít fungovat. Samozřejmě po restartu apache – sudo service apache2 restart
Napiš, jestli pomohlo, já zatím opravím v návodu.
Cestu jsem opravil, ale chybu mi to háže pořád stejnou – forbidden 🙁
Jinak jedu na : Raspbian GNU/Linux 9 (stretch)
Zkus kompletní cestu: http://ip_logserveru/loganalyzer/index.php
to jsem zkoušel a se stejným výsledkem…
A v logu stále stejná hláška?
Jo, to stejný
AH01630: client denied by server configuration: /etc/apache2/\xe2\x80\x9c
Už si stahuji raspbian lite, udělám si virtual v Libvirtu a zkusím to projet dle návodu.
Tak dvě věci.
1. příkaz cp jsem měl bez -r, takže se nekopírovaly podadresáře. Tos ale předpokládám postřehl, protože to ten příkaz hlásí. Už jsem to opravil.
2. Raspbian mi dělal to co tobě. Porovnal jsem konfiguraci apache u mě a v raspbianu. Nalezl jsem, že v raspbianu byl navíc aktivovaný mod cgi. Po deaktivaci se to rozběhlo. Divné ale je, že když ho aktivuju zpátky, tak už to funguje stejně. Prostě divný.
Příkaz “ls /etc/apache2/mods-enabled/” ti vyjede seznam aktivovaných. Deaktivovat jde buď smazáním symlinku, nebo příkazem sudo a2dismod cgi
Máme problém, WordPress všechny ” přeformátuje v domnění, že to vypadá lépe. Buhužel pokud se jedná o text příkazů nebo konfiguračních souborů, při nakopírovaní do cílového souboru to pak není ta správná uvozovka.
Týká se to všech částí.
@L, nejde to nějak obejít? Myslím jinak, než vkládáním příloh se soubory.
Ja zdrojove kody vkladam tak, ze se prepnu do “Text” a pak kod uvozuju a ukoncuju tagama “hranata-zavorka”sourcecode”hranata-zavorka-konec” “hranata-zavorka”/sourcecode”hranata-zavorka-konec”. Je na to plugin. Upravil sem takto prvni “sudo apt-get” kod v clanku. V editoru se to neformatuje, az v realnem nahledu to jde videt.
Tagu a nastaveni to podporuje spousta, navod je tady https://en.support.wordpress.com/code/posting-source-code/
Pridal jsem navod na formatovani i do wiki https://www.vodnici.net/wiki/jak-vyrobit-svuj-prvni-wiki-clanek/
Díky, to pomůže.
Dobry den, v prvom rade vdaka za prinosny clanok. Poprosil by som vas o informaciu, ako, alebo kde (pocitam ze v loxone.conf) mam aplikovat: “Pro každý ze sedmi typů řádku v syslogu jsem přidal MESSAGETYPE Loxone1 – 7” aby mi log analyzer parsoval podla konkretnej messagetype (chcel by som pouzit loxone2 ako mate v clanku). Momentalne mam vsetko rozchodene avsak v loganalyzeru mam v messagetype: “syslog” (je to koli tomu ze mi defaultne bere parser loxone1). Ako teda nadefinovat messagetype a kde loxone2? Dakujem za odpoved
Loxone1 – 7 se přiřazuje v závislosti na struktuře řádku.
Nejprve je třeba mít nahrán parser dle článku.
Pak při konfiguraci (při prvním spuštění) zvolíme Logline type na Miscellaneous Logfiles a Syslog file na náš Log soubor z Loxone.
Daleko jednodušší je ale použít LoxBerry a v něm můj plugin Syslog Server, kde se vše nastaví automaticky (od rsyslogu až po konfiguraci LogAnalyzeru) na základě zadání IP adresy Loxone Miniserveru.
Dobry den, vdaka za tip. Rpi je urcite zaujimava moznost. Chcel som vsak vyskusat vyuzit moj stary pc, kde mi bezi debian. Postupoval som podla vasej rady a vsetko uz funguje ako ma. Vrela vdaka!
Rado, jsem rád, že ti to funguje, nicméně,pokud ti na tom stroji běží debian, tak je pravděpodobné, že ti na tom poběží i libvirt, a pokud ti na tom poběží libvirt, tak ti na tom poběží téměř cokoliv. Tedy i LoxBerry. Sám provozuji jeden LoxBerry jako produkci, na libvirtu (qemu), a další jako vývoj. Dáe pak jeden vývojový LoxBerry na RPI. Vytvářím pluginy, tak to potřebuji. Pokud potřebuješ vědět, jak na to, něco sepíšu.
Ahoj, Určite rád využijem vašu pomoc jak na to. Zatial som nemal možnosť vyskúšať si virtualizáciu pod linuxami. Rád si rozšírim obzory. Keby sa podarí spustit LoxBerry pod debianom na pc tak by to bolo velmi prinosné. Prípadne, že by sme využili nejak i docker na zabalenie celej konfigurácie do image? Vďaka, budem sa tešiť na ďalšie info
Aktuálně mají k d ispozici image pro raspberry, virtuozo, hyper-v a vmware.
https://download.loxberry.de/stable/images/
Právě ten pro vmware jde jednoduše zkonvertovat na qcow2, případně něco jiného pomocí příkazu qemu-img a použít v libvirtu, repektive qemu (bývalé kvm).
Zdravím, dnes som si skúsil na mojom rpi váš plugin pre loxberry. Funguje to perfektne. Na svoje logovanie použijem rpi, pretože keď som si meral spotrebu svojho stareho pc s debianom tak som na 150W, kdezto rpi beží <10W. Chcel by som sa spýtať či plánujete pridať možnosť ukladania logov niekam na externy usb disk do zlozky. Ani nemusi byť databáza, stačilo by len presmerovanie logov z ramdisku na /mnt//LoxoneLogs (trebars). Diki moc a ešte raz vďaka za super logovací plugin!
Dle informací od vývojářů se připravuje mapování přímo pro pluginy. Zatím ho nemají v SDK pro PHP, ale mám přislíbeno, že dají vědět, až bude. Zkusím se pozeptat, v jakém je to stavu.
Jinak na úrovni raspbianu si můžeš přimontovat co chceš, kam chceš již dnes.
Tedy pokud si přimontuješ nějaké úložiště (USB, SAMBA nebo NFS) do /opt/loxberry/log/plugins/syslogserver , bude se ti log ukládat do něho.
ahoj,
nainstaloval jsem si loxberry se syslog addinem, zkonfiguroval ho, ale log analyzer ukazuje “Syslog file could not be found”
nevite nekdo co stim?
thx
Ahoj,
pošli mi printscreeny do soukromé zprávy.
Cus,
udelal jsem to cele znovu, nastavil vetsi mnozstvi loggeru na neco co se fakt deje furt a vse zacalo fungovat 🙂
mam pocit, ze loxone mi neposilal zadna data a soubor na rsyslogu je vytvoren az po prijeti prvniho souboru
kuba
Zdravím, mám nainštalovaný Syslog Server od LoxBerry, logy vidím, všetko je OK, ale keď RPi reštartnem, všetky logy zmiznú a nahrávajú sa odznova… treba niekde nastaviť, aby sa nevymazali pri reštarte?
Ďakujem