• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Bukkit & BungeeCord Log auslesen

Y

yoshicrafter

Guest
Hallo,
ich möchte ein PLugin programmieren für ein php webinterface.
Wie kann ich von dem PLugin aus den Server Log auslesen, den ich dann an php schick
für bukkit und bungeecord
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Klingt in meinen Ohren nur begrenzt sinnvoll, das so zu handhaben, aber mal gucken was du mit machst.
Gibt mehrere Möglichkeiten, ich denke die simpelsten für deine Frage wären:

a) Logging abfangen im Code und per HTTP Request an eine entsprechend ausgelegt PHP Datei senden.
b) Log Nachrichten an Datenbank senden und vom Interface aus abrufen.
c) Das Gleiche wie bei a), bloß statt HTTP Request direkt nen WebSocket.
d) Log Datei regelmäßig auslesen und anzeigen.

Also, a) und c) sind zu 100% Quark ehrlich gesagt. :D
d) würde verlangen, dass das Interface auf der selben Maschine liegt, außer du machst dir entsprechende extra Arbeit. Also auch Quark.

Logs in der DB speichern wäre in diesem Fall gar nicht mal so übel.
Klingt für mich praktischer zu handhaben, einfacher umzusetzen und sicherer sowie weniger fehleranfällig als die anderen Methoden.
Da es sich ja um Logs handelt die du als Interface Nutzer hernimmst um interagieren zu können wäre es in der Tat gar nicht so dumm diese Logs eine Weile und in gewisser Menge zu speichern.

Allerdings solltest du das begrenzen, da sonst eine gewaltige Flut an Daten relativ zackig entstehen kann.
Hier mein Vorschlag:

Du speicherst die Log Einträge jeweils mit einem Zeitstempel und ggf. Zusatzinformationen um sie einem bestimmten Server zuzuordnen.
Im Interface rufst du... sagen wir mal die letzten 100 Logeinträge ab und zeigst sie an.
Wenn der Nutzer hochscrollt, dann lädst du im Hintergrund weitere Einträge nach.
In einem gewissen Intervall kannst du auch neue Einträge anzeigen lassen - das sieht wiederum nicht ganz so smooth aus, aber einen Tod muss man ja sterben...
Dann schaust du auf jeden Fall zu, dass du in zeitlichen Intervallen ein Script durch die DB jagst um Log Einträge die älter als z.B. 24 Stunden sind zu löschen.

Was die Sache mit dem Logging abfangen angeht... du kannst um das einfach mal zu testen System.out durch einen eigenen PrintStream ersetzen, welcher and den Ursprünglichen System.out delegiert und die Nachricht an die DB weitergibt.
Letzteres am besten asynchron, sonst wird das dem Server gar nicht gefallen... Gründe dafür sollten klar sein.
 
Zuletzt bearbeitet:

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Was genau bekommst du nicht hin?
  • Das Loggen irgendwie abzufangen?
  • Eine Datenbankverbindung zu MySQL aufzubauen?
  • Eine Datenbankstruktur dazu zu entwerfen?
  • Die Daten in die Datenbank zu laden?
  • Per PHP auf die Datenbank zu zugreifen?
  • Die Daten im HTML-Format darzustellen?
Ich glaub, das Projekt ist etwas zu groß für dich...
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Ich weiß nicht ganz ob dieses Selbstbewusstsein gesund oder naiv ist.

Zu deiner Frage mit dem Logging abfangen:

Bin mir momentan nicht mehr ganz sicher, aber ich glaube sämtliche Logger delegieren letzten Endes wieder zu System.out.
Wäre schön, wenn das jemand bestätigen oder widerlegen könnte - bis dahin gehen wir einfach mal davon aus.

Du kannst also eine Klasse erstellen, welche von PrintStream erbt und dann System.setOut(); ausführen um den Logger zu ersetzen.

Zu beachten sind 3 Dinge, wenn nicht mehr:

- System.out muss auf jeden Fall in deinem custom Stream gekapselt werden, bedeutet als Parameter im Konstruktor übergeben werden, damit du eine Referenz zu diesem Stream behälst, sonst kannst du keine Nachrichten mehr in die Konsole schreiben. System.out.println() würde wieder zurück in deinen Stream gehen -> Endlosschleife.

- Um einen möglichst effektiven Logger zu erhalten, solltest du ihn so früh wie möglich setzen, damit in der Web Konsole auch schon frühe Nachrichten nicht verloren gehen.
Um größeren Aufwand zu vermeiden, schreibst du in deine plugin.yml "load: STARTUP" und fügst in deine Plugin Klasse die onLoad() Methode ein. Dort ersetzt du den System.out Stream durch deinen Eigenen, dann solltest du "relativ" früh mit von der Partie sein.

- Ich habe es bestimmt oben schon mal angemerkt, mach den Teil mit den Datenbankzugriffen auf alle Fälle asynchron, sonst wird der Server nurmehr auf dem Zahnfleisch kriechen.
Am besten delegierst du zu aller erst an den originalen System.out Stream und gibst dann einen Hintergrundtask auf mit dem Datenbankzugriff.

Eventuell sammelst du auch ein paar Nachrichten in z.B. einem Queue und schickst sie als Batch an die Datenbank, damit du sie nicht mit X Anfragen pro Sekunde zuspammst. Kann die DB zwar ab, muss aber absolut nicht sein, von abgesehen, dass manche Hoster (falls du Nitrado oder so nutzt) auch gewisse Limits einsetzen damit ihre Datenbankserver nicht überlastet werden.

Der Web Client wird ja sowieso nicht 100 Mal in der Sekunde prüfen, das wäre schlicht dumm, von daher fallen die 1 - 3 Sekunden Verzögerung auch nicht groß auf. So kannst du z.B. 25 oder 100 oder X Nachrichten in einem Batch Aufruf zusammenfassen und so die Datenbank ein wenig schonen, sodass sie auch bei zahlreichen Servern nicht schlagartig anfängt nachzulassen.

Evtl. noch einen Zähler, der dafür sorgt, dass z.B. nach 5 Durchgängen ohne Übergabe an die DB alles was an Rest im Queue ist abgeschickt wird. So bleibt nichts liegen, wenn der Server erstmal geladen ist und nur noch so sporadische Sachen wie Chat und Commands etc. im Log landen.
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Solltest du allerdings bei Spigot log4j benutzen wollen, so hab ich mit etwas googeln das herausgefunden:
https://stackoverflow.com/questions/2555865/how-to-read-log4j-output-to-a-web-page
Sieht gut aus! :)

ich wollte ein BEISPIEL, keine erklärung
Mit anderen Worten... du willst die fertige Lösung aufm Silbertablett serviert bekommen?
Ich hab dir ein paar Beispiele gegeben, jetzt darfst du allerdings auch etwas Eigeninitiative zeigen und dein Hirn mal selbst anstrengen.
Bisschen basteln, Schlüsselwörter vom Text in Google reindonnern und mal @JOO200's Link dir durchlesen, dann hast du genug um anzufangen - arbeiten musst du allerdings selber, ich gebe dir in diesem Fall lediglich Hilfestellungen.
 
Y

yoshicrafter

Guest
?

Ich weiß nicht ganz ob dieses Selbstbewusstsein gesund oder naiv ist.

Zu deiner Frage mit dem Logging abfangen:

Bin mir momentan nicht mehr ganz sicher, aber ich glaube sämtliche Logger delegieren letzten Endes wieder zu System.out.
Wäre schön, wenn das jemand bestätigen oder widerlegen könnte - bis dahin gehen wir einfach mal davon aus.

Du kannst also eine Klasse erstellen, welche von PrintStream erbt und dann System.setOut(); ausführen um den Logger zu ersetzen.

Zu beachten sind 3 Dinge, wenn nicht mehr:

- System.out muss auf jeden Fall in deinem custom Stream gekapselt werden, bedeutet als Parameter im Konstruktor übergeben werden, damit du eine Referenz zu diesem Stream behälst, sonst kannst du keine Nachrichten mehr in die Konsole schreiben. System.out.println() würde wieder zurück in deinen Stream gehen -> Endlosschleife.

- Um einen möglichst effektiven Logger zu erhalten, solltest du ihn so früh wie möglich setzen, damit in der Web Konsole auch schon frühe Nachrichten nicht verloren gehen.
Um größeren Aufwand zu vermeiden, schreibst du in deine plugin.yml "load: STARTUP" und fügst in deine Plugin Klasse die onLoad() Methode ein. Dort ersetzt du den System.out Stream durch deinen Eigenen, dann solltest du "relativ" früh mit von der Partie sein.

- Ich habe es bestimmt oben schon mal angemerkt, mach den Teil mit den Datenbankzugriffen auf alle Fälle asynchron, sonst wird der Server nurmehr auf dem Zahnfleisch kriechen.
Am besten delegierst du zu aller erst an den originalen System.out Stream und gibst dann einen Hintergrundtask auf mit dem Datenbankzugriff.

Eventuell sammelst du auch ein paar Nachrichten in z.B. einem Queue und schickst sie als Batch an die Datenbank, damit du sie nicht mit X Anfragen pro Sekunde zuspammst. Kann die DB zwar ab, muss aber absolut nicht sein, von abgesehen, dass manche Hoster (falls du Nitrado oder so nutzt) auch gewisse Limits einsetzen damit ihre Datenbankserver nicht überlastet werden.

Der Web Client wird ja sowieso nicht 100 Mal in der Sekunde prüfen, das wäre schlicht dumm, von daher fallen die 1 - 3 Sekunden Verzögerung auch nicht groß auf. So kannst du z.B. 25 oder 100 oder X Nachrichten in einem Batch Aufruf zusammenfassen und so die Datenbank ein wenig schonen, sodass sie auch bei zahlreichen Servern nicht schlagartig anfängt nachzulassen.

Evtl. noch einen Zähler, der dafür sorgt, dass z.B. nach 5 Durchgängen ohne Übergabe an die DB alles was an Rest im Queue ist abgeschickt wird. So bleibt nichts liegen, wenn der Server erstmal geladen ist und nur noch so sporadische Sachen wie Chat und Commands etc. im Log landen.
das nennst du beispiele?
hahaha
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
das nennst du beispiele?
Jap.
Ich erklär dir die Situation und gebe dir ein paar Vorschläge mit wie deine Lösung beispielsweise aussehen könnte.
Was du letzten Endes draus machst ist deine Sache.

Du willst Code "Beispiele", ist schon klar.
Aber wo ist dann dein Lerneffekt? Copy&Paste dürftest du bereits gemeistert haben.
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
:alone:Machs uns einfach - hör auf damit. Anscheinend hast du dich weder mit der Materie beschäftigt noch hast du vor, das zu tun.
Log4j ist ein Logging Tool, welches Spigot benutzt, um das Loggen von Sachen in Logs und Konsolen zu vereinheitlichen (um das simpel auszudrücken).

Nachdem Google nicht deine Stärke ist: Hier noch ein letztes Beispiel: https://www.spigotmc.org/threads/capturing-console-output.76444/
 

UnityGaming

Workaholic
Registriert
25 Oktober 2015
Beiträge
527
Alter
26
Diamanten
312
Minecraft
FastFelix771
Oben