Logování – vzdálený syslog

Logování – vzdálený syslog

How Can We Help?

Categories

Logování – vzdálený syslog

You are here:
< Zpět

Ú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

Pomohl Vám náš blog? Chcete nás podpořit? I málo udělá radost 😉
Become a patron at Patreon!
Table of Contents

32 thoughts on “Logování – vzdálený syslog

  1. 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?

  2. 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

  3. Je to opraveno. Doufám, že mi žádne jiné věci vlivem formátování nevypadly. Kdyby něco nefungovalo, pište.

  4. 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.)

  5. 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.

  6. 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

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

  8. Cestu jsem opravil, ale chybu mi to háže pořád stejnou – forbidden 🙁
    Jinak jedu na : Raspbian GNU/Linux 9 (stretch)

  9. 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

  10. 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.

    1. 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/

  11. 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

    1. 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.

      1. 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!

  12. 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.

  13. 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

  14. 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!

    1. 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.

  15. 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

  16. 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

  17. 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

Leave a Reply to Rado Cancel reply

Your email address will not be published. Required fields are marked *