Skip to content

Instantly share code, notes, and snippets.

@cruor99
Created December 18, 2019 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cruor99/647027585cca06382a3fded1c2b0706c to your computer and use it in GitHub Desktop.
Save cruor99/647027585cca06382a3fded1c2b0706c to your computer and use it in GitHub Desktop.
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
<LogScreen>:
BoxLayout:
orientation: "vertical"
Toolbar:
id: toolbar
title: "Logs for {}".format(root.machine_name)
left_action_items: [["chevron-left", lambda x: app.root.onBackBtn(), False]]
md_bg_color: app.theme_cls.primary_color
background_color: app.theme_cls.primary_color
BoxLayout:
orientation: "vertical"
padding: dp(5)
BoxLayout:
size_hint_y: .1
orientation: "horizontal"
MDTextField:
hint_text: "Søk i loggen"
on_text: root.update_query(self.text)
MDFlatButton:
text: "Filtre"
on_release: MDDropdownMenu(items=root.filter_items, width_mult=2).open(self)
RecycleView:
MDList:
spacing: dp(4)
height: self.minimum_height
id: logger_list
<LogCard>:
size_hint_y: None
height: log_text.texture_size[1]
BoxLayout:
spacing: dp(2)
MDLabel:
size_hint_x: .5
id: log_text
text: root.log_message
padding: dp(2), dp(2)
MDLabel:
padding: dp(2), dp(2)
size_hint_x: .5
halign: "right"
text: "{}".format(root.timestamp[:19])
# -*- coding: utf-8 -*-
from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.properties import StringProperty, ListProperty, ObjectProperty, NumericProperty
from kivy.network.urlrequest import UrlRequest
from kivy.lang import Builder
from kivy.clock import Clock
from kivy.logger import Logger
from kivymd.card import MDCard
from kivymd.list import ThreeLineListItem
from kivymd.snackbar import Snackbar
from elasticsearch import Elasticsearch
import pytz
import datetime
from dateutil import parser
from components.popups import LogAmountPopup
Builder.load_file("kv/screens/log_screen.kv")
class LogScreen(Screen):
machine_id = StringProperty("")
machine_name = StringProperty("")
search_scheduler = ObjectProperty()
log_results = ListProperty([])
query = StringProperty("")
log_size = NumericProperty(100)
filter_items = ListProperty([])
def open_log_size_dialog(self, *args):
Logger.info("Args from filter_items: {}".format(args))
logsize_popup = LogAmountPopup()
logsize_popup.bind(on_dismiss=self.set_log_amount)
logsize_popup.open()
def set_log_amount(self, instance):
self.log_size = instance.log_size
Logger.info("New log size: {}".format(self.log_size))
def on_enter(self):
self.query = "tags:"+'"{}"'.format(self.machine_id)
self.do_search()
self.search_scheduler = Clock.schedule_interval(self.do_search, 5)
Clock.schedule_once(self.setup_filter_items)
def setup_filter_items(self, *args):
self.filter_items = [
{
'viewclass': 'MDMenuItem',
'text': 'Logstørrelse',
"on_release": self.open_log_size_dialog
}
]
def on_leave(self):
self.ids.logger_list.clear_widgets()
self.search_scheduler.cancel()
def update_query(self, text):
if len(text) == 0:
self.query = 'tags:"{}"'.format(self.machine_id)
else:
self.query = 'tags:"{}" AND {}'.format(self.machine_id, text)
def do_search(self, *args):
es = Elasticsearch(["elasticsearchurlgoeshere"])
try:
res = es.search(index="logstash-*", q=self.query, body={"sort":[
{
"@timestamp": {
"order": "desc"
}
}
],
"size": self.log_size,
})
self.log_results = res["hits"]["hits"]
except Exception as e:
Logger.info(e)
Snackbar(text=str(e)).show()
def on_log_results(self, instance, value):
widget_list = []
self.ids.logger_list.clear_widgets()
for hit in self.log_results:
data = hit["_source"]
timeobject = parser.parse(data["@timestamp"])
corrected_time = timeobject + datetime.timedelta(hours=2)
item = LogCard()
item.log_message = data["message"]
item.logger_name = data["logger_name"]
item.timestamp = str(corrected_time)
widget_list.append(item)
self.ids.logger_list.add_widget(item)
class LogCard(MDCard):
log_message = StringProperty("")
timestamp = StringProperty("")
logger_name = StringProperty("")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment