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.