Puncte:0

Citiți jurnalele în timp real cu bash

drapel be

Am asta în jurnalele de sistem:

27 februarie 02:53:51 Latitude-E6430 rsyslogd: acțiune în sus 7
27 februarie 02:53:51 Latitude-E6430 rsyslogd: acțiune în jos B
27 februarie 02:53:51 Latitude-E6430 rsyslogd: acțiune până U
....etc

Vreau să fac un script care monitorizează jurnalele cu normă întreagă ca serviciu, dar nu știu cum să fac condiția.

1 - Că atunci când citești, rând cu rând, să-l păstrezi într-o variabilă.

2 - citire variabilă dacă găsește în linie, cuvintele [rsyslogd] și [7] arată [echo „Găsit” ]

Ar fi o buclă să citiți fișierul linie cu linie, căutând acel model de cuvinte.

Exemplu de Script

path_full_log="/home/full.log"


funcția reader_time_real(){

    while read full_log; do
        chek7=$(cat $full_log | grep "rsyslogdd" | grep 7 )
            dacă [[ $? = 0 ]]; atunci 
                ecou „Găsit 7”;

            fi

        chekB=$(cat $full_log | grep "rsyslogdd" | grep B )
            dacă [[ $? = 0 ]]; atunci 
                ecou „Găsit B”;

            fi
    terminat < $path_full_log
}
David avatar
drapel cn
Arată scriptul pe care l-ai făcut, astfel încât cineva să poată vedea care ar putea fi erorile.
BurstBass BurstBass avatar
drapel be
gata... mai jos
Soren A avatar
drapel mx
Vă rugăm să adăugați scriptul la întrebarea dvs., nu ca răspuns... probabil că se va închide.
WU-TANG avatar
drapel cn
Nu este aceasta o funcție a rsyslog în mod natural? Am configurat doar un server syslog-ng, dar cred că sunt suficient de asemănătoare încât amândoi pot face filtre???
BurstBass BurstBass avatar
drapel be
nu sunt la fel, precizez in ambele ca trebuie sa aiba cuvantul "rsyslogdd" si cele 2 variante posibile, 7 sau B
BurstBass BurstBass avatar
drapel be
S-a rezolvat, doar schimbați `cat $full_log` pentru `echo $full_log`
Lorenz Keel avatar
drapel gr
@BurstBass BurstBass dacă ați reparat, puneți singur un răspuns cu versiunea finală a scriptului, apoi acceptați propriul răspuns.
WU-TANG avatar
drapel cn
@BurstBassBurstBass Dacă răspunsul dvs. a fost la mine (nu ați etichetat pe nimeni), atunci cred că ați înțeles greșit ceea ce spuneam.... Spuneam că „cred că” acel syslog are deja capacitatea încorporată de a face ceea ce scriptul tău merge. Am mai configurat un server syslog-ng și am configurat filtre pentru a capta cuvintele și a le trimite într-un jurnal separat (chiar și comenzi de declanșare). Aș crede că rsyslog are aceeași funcționalitate.
Puncte:1
drapel vn

Am realizat următorul script, care se actualizează în fiecare secundă și evidențiază orice noi intrări de jurnal. De asemenea, definește zona în care ar trebui să fie afișat jurnalul (cu codul succese și logcols variabile), deci este făcut pentru a fi utilizat într-o fereastră de terminal de dimensiune fixă ​​(o folosesc în interiorul tmux).

Probabil că ați putea modifica acest script pentru a evidenția numai liniile care se potrivesc unui anumit criteriu, așa cum indicați.

#!/bin/bash

# Variabilele de configurare inițială
rezultate=31
logcols=127

# Definiția funcției locale
printnew() {
  clar
  echo -e „\e[0;30;47m”
  hightail=$(coada -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${hightail}\e[0m"
}

printdif() {
  (( newrows = logrows - logdiff ))
  clar
  normtail=$(coada -n "$logrows" /var/log/syslog | head -n "$newrows" | cut -b "1-$logcols")
  echo -n "$normtail"
  echo -e „\e[0;30;47m”
  hightail=$(coada -n "$logdiff" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${hightail}\e[0m"
}

printold() {
  clar
  normtail=$(coada -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  echo -n "$normtail"
}

# Buclă în fiecare secundă
în timp ce adevărat
do
  dormi 1 &

  # Citiți dimensiunile jurnalului
  logsize=$(wc -l /var/log/syslog | cut -d ' ' -f1)
  (( logdiff = dimensiunea log - presize ))

  # Dacă mai mult de $logrows linii sunt noi
  if (( logdiff > „$logrows” ))
  atunci
    printnew
    redesenare=1
  # Dacă mai puțin de $logrows linii, dar mai mult de 0 linii sunt noi
  elif (( logdiff > 0 ))
  atunci
    printdif
    redesenare=1
  # Dacă nu există linii noi
  altfel
    dacă [[ "$redesenează" -eq 1 ]]
    atunci
      printold
      redesenare=0
    fi
  fi

  presize="$logsize"
  așteptați # pentru somn
Terminat

Scriptul este realizat având în vedere 3 scenarii:

  1. Întregul conținut al succese este nou - totul este evidențiat (printnew).
  2. Unele linii din jurnal sunt noi - acestea sunt evidențiate (printdif).
  3. Fără linii noi de jurnal - nimic nu este evidențiat (printold).

Disclaimer: Codul ar putea fi probabil optimizat, dar, în general, sunt mai preocupat ca codul meu să fie lizibil, mai degrabă decât cât mai condensat posibil.

Puncte:1
drapel in

Scriptul tău nu este potrivit pentru a face ceea ce vrei să faci. Citește fișierul o singură dată, dar complet. Dacă treceți în buclă, nu veți obține doar rezultate noi și ar fi un coșmar de performanță.

De asemenea, aveți o utilizare inutilă a pisică, tu grep un șir fix cu un model regex și salvați rezultatul într-o variabilă pe care nu o mai utilizați. De asemenea, nu ar trebui să utilizați variabile cu nume de fișier fără ghilimele.


Utilizare coada -f | grep --line-buffered:

coada -fn0 „$path_full_log” \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| în timp ce linia de citire; do
      echo „Găsit $line”
  Terminat

Sau folosind xargs:

coada -fn0 „$path_full_log” \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| xargs -I{} echo „Găsit {}”
  • coada -fn0 citește linii noi ale fișierului când sunt adăugate.
  • grep -F caută un șir fix în acea linie.
  • --line-buffered spune grep pentru a citi liniile când vin în loc să aștepte sfârșitul fluxului de intrare, care este implicit.
  • grep -Eo caută ERE model (-E) (7|B) și scoate numai șirul potrivit (-o).
  • în timp ce linia citită sau xargs -I{} preia acea ieșire și rulează comanda pe ieșire (aici: ecou).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.