package org.fenixedu.bennu.core.api; import java.net.InetAddress; import java.net.UnknownHostException; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.core.rest.BennuRestResource; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @Path("/bennu-core/system/logger") public class LogbackResource extends BennuRestResource { private static boolean available = checkIfIsAvailable(); private static String serverName; static { try { serverName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { serverName = "UNKNOWN"; } } @GET @Produces(MediaType.APPLICATION_JSON) public JsonObject getAllLoggers() { accessControl(Group.managers()); if (available) { return Holder.getAllLoggers(); } JsonObject empty = new JsonObject(); empty.add("loggers", new JsonArray()); return empty; } @POST @Path("/{name}/{level}") public JsonObject setLogLevel(@PathParam("name") String loggerName, @PathParam("level") String level) { accessControl(Group.managers()); if (available) { Holder.setLevel(loggerName, level); } return getAllLoggers(); } /* * Holder class that will interact with logback. * * The purpose of this class is to avoid class loading errors if logback is not available */ private static final class Holder { public static JsonObject getAllLoggers() { JsonArray loggers = new JsonArray(); LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); for (Logger logger : context.getLoggerList()) { JsonObject obj = new JsonObject(); obj.addProperty("name", logger.getName()); obj.addProperty("level", logger.getEffectiveLevel().toString()); loggers.add(obj); } JsonObject obj = new JsonObject(); obj.add("loggers", loggers); obj.addProperty("server", serverName); return obj; } public static void setLevel(String loggerName, String level) { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); context.getLogger(loggerName).setLevel(Level.valueOf(level)); } } /* * Checks if Logback is in the classpath */ private static boolean checkIfIsAvailable() { try { Class.forName("ch.qos.logback.classic.Logger"); return true; } catch (ClassNotFoundException e) { return false; } } }