Java >> Java tutorial >  >> Tag >> Log4j

Hvordan konfigureres slf4j (til JDA) til at arbejde med log4j (til Minecraft Paper)?

Jeg laver plugin til Minecraft - 'Paper' præcis. Og den bruger JDA til Discord bot-funktion.

Problemet er, Minecraft(Paper) bruger log4j som dets logbibliotek. JDA bruger slf4j som logbibliotek. Jeg vil have JDA til at bruge log4j, så fejlmeddelelsen fra JDA vil blive vist i konsollen som plugins fejlmeddelelse. (Se EDIT2 for faktiske logfiler)

Ingen System.out.println() fordi Minecraft(Paper) vil klage over at bruge det.
Ingen logback, fordi jeg tror, ​​det er et andet logbibliotek, så det kan ikke fungere godt med Minecraft(Paper)'s logningssystem (ingen JDA-logs i Minecraft-log osv.). Jeg ønsker ikke at implementere et andet logbibliotek, når der allerede er et logningssystem leveret af Minecraft, som er log4j.

JDA wiki beskriver kun om Logback, så jeg er nødt til at finde min egen måde at lave JDA med Minecrafts logningssystem, men det var ingen succes.

For eksempel:

// Something went wrong in JDA and shows stacktrace
[05:20:26] [Server thread/ERROR]: [MyPlugin] [JDA] 'JDA Error Message'
(prints stacktrace of the error)

// Show debug message of WebSocketClient (Since it is debug message, this can be turned off)
[05:20:26] [Server thread/DEBUG]: [MyPlugin] [JDA] WebSocketClient - Connected to WebSocket

// Show JDA message when JDA bot is loaded
[05:20:26] [Server thread/DEBUG]: [MyPlugin] [JDA] JDA - Finished Loading!

Alle disse meddelelser skal være en del af Minecraft(Paper)'s logningssystem, ikke efterligne det. Det betyder, at den skal bruge JavaPlugin#getLogger().info() eller noget lignende et sted i koden.

Hvordan får man JDA til at være sådan?
Bare implementering af log4j-slf4j18-impl virker ikke. Jeg synes, jeg skal gøre noget ved JDA's logting.

EDIT:Her er den nuværende build.gradle filindhold. LINK

I øjeblikket implementerer mit plugin log4j-slf4j-impl for JDA.

Svar

Du skal tilføje en "bro" fra slf4j til log4j .Den passende afhængighed skal passe til både slf4j version og log4j version.

For at finde den korrekte version har jeg tjekket build.gradle.kts af JDA JDA bruger 1.7.25 version af slf4j og dit modul bruger 2.17.2 version af log4j .

Så du skal tilføje log4j-slf4j-impl .
log4j-slf4j18-impl er til sl4j fra 18 og nyere version.

Maven-version

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.17.2</version>
</dependency>

Gradle-version

compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2'

Hvis du også antager, at din build afhænger af JDA, kan det være nyttigt helt at undlade at importere SL4J, da afhængigt af JDA vil gøre SL4J tilgængelig for dit plugin. JDA afhængighed af SLF4J er erklæret som en API og er derfor tilgængelig.

Dette blev også afledt af build.gradle.kts fra JDA

Så højst sandsynligt kan du sikkert fjerne org.slf4j:slf4j-api:1.8.0-beta4 fra dine afhængigheder.

Opdatering:for gradle.build-filen.

  • Shadowjar-ing/shading sl4j og log4j kan forstyrre initialiseringsprocessen. Jeg kunne finde en begivenhed til at understøtte dette. Du kan fjerne alle relaterede flytninger og prøve igen.
  • Erstat compileOnly('org.slf4j:slf4j-api:1.7.36') med compileOnly('org.slf4j:slf4j-api:1.7.25') at matche den version, som JDA erklærer. Dette har højst sandsynligt intet at gøre med fejlen.

Java tag