Initial OpenECOMP MSO commit
[so.git] / common / src / main / java / org / openecomp / mso / logger / MsoLoggingServlet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.mso.logger;
22
23
24 import java.util.List;
25
26 import javax.ws.rs.DefaultValue;
27 import javax.ws.rs.GET;
28 import javax.ws.rs.Path;
29 import javax.ws.rs.PathParam;
30 import javax.ws.rs.Produces;
31 import javax.ws.rs.QueryParam;
32 import javax.ws.rs.core.Response;
33
34 import org.slf4j.LoggerFactory;
35
36 import ch.qos.logback.classic.Level;
37 import ch.qos.logback.classic.Logger;
38 import ch.qos.logback.classic.LoggerContext;
39 import ch.qos.logback.classic.joran.JoranConfigurator;
40 import ch.qos.logback.core.Appender;
41
42 @Path("/logging")
43 public class MsoLoggingServlet {
44
45     private static final String DEBUGLOG = "asyncEELFDebug";
46     private MsoLogger logger = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL);
47     private static final String GENERAL_LOGGER = "com.att.eelf.error";
48     private static final String AUDIT_LOGGER = "com.att.eelf.audit";
49     private static final String METRICS_LOGGER = "com.att.eelf.metrics";
50
51     @GET
52     @Path("/setLevel/{logContext}/{level}")
53     @Produces("text/plain")
54     public Response setLogLevel (@PathParam("logContext") String logContext, @PathParam("level") String level) {
55         logger.info (MessageEnum.LOGGER_SETUP, "", "");
56         
57         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
58                 JoranConfigurator jc = new JoranConfigurator(); 
59                 jc.setContext(context); 
60                 Logger updateLogger = context.getLogger (logContext);
61         
62         if (updateLogger == null) {
63             logger.info (MessageEnum.LOGGER_NOT_FOUND, logContext, "", "");
64             String response = "Unknown logger: " + logContext;
65             return Response.status (200).entity (response).build ();
66         }
67         
68         Level currentLevel = updateLogger.getLevel();
69         if (!currentLevel.equals(Level.toLevel(level))) {
70                 Level newLevel = Level.toLevel (level);
71                 updateLogger.setLevel (newLevel);
72             logger.info (MessageEnum.LOGGER_UPDATE_SUC, updateLogger.getName (), currentLevel.toString(), newLevel.toString());
73         }
74
75         String response = "Log level set to: " + level + " for " + updateLogger.getName ();
76         return Response.status (200).entity (response).build ();
77
78     }
79
80     @GET
81     @Path("/loggers")
82     @Produces("text/plain")
83     @SuppressWarnings("rawtypes")
84     public Response getLoggers () {
85         StringBuilder response = new StringBuilder ();
86         LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
87                 JoranConfigurator jc = new JoranConfigurator(); 
88                 jc.setContext(context); 
89                 List <Logger> loggerList = context.getLoggerList();
90         for (Logger logger:loggerList) {
91                 //if (logger.getLevel() != null) {
92                         response.append (logger.getName () + ":" + logger.getLevel () + " (" + logger.getEffectiveLevel () + ")\n");
93                 //}
94         }
95         return Response.status (200).entity (response).build ();
96
97     }
98
99     @GET
100     @Path("/debug")
101     @Produces("text/plain")
102     @SuppressWarnings("rawtypes")
103     /*
104      * Debug log is used as a general log to store all the logs events, including events generated by MSO code or by
105      * components used by MSO.
106      * This method will only enable/disable the function to store MSO generated events into debug log,
107      * since those events will also be generated to error, audit, metrics log.
108      * The events generated by other components will not be affected by this interface.
109      */
110     public Response updateDebugAppender (@DefaultValue("true") @QueryParam("enable") Boolean enable) {
111         String response;
112         
113                 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 
114                 JoranConfigurator jc = new JoranConfigurator(); 
115                 jc.setContext(context); 
116                 List <Logger> loggerList = context.getLoggerList();
117                 Logger rootLogger = context.getLogger("ROOT");
118         Appender appender = rootLogger.getAppender(DEBUGLOG);
119
120         if (null == appender) {
121                 return Response.status (500).entity ("Not able to found Debug appender. Please verify to make sure the needed logback file is present in the config folder.").build ();
122         }
123
124         if (enable) {
125             logger.info (MessageEnum.LOGGER_UPDATE_DEBUG, "", "");
126
127             for (Logger logger: loggerList) {
128                 if (isMsoLogger (logger.getName ()) && logger.getAppender (DEBUGLOG) == null && logger.getLevel () != null) {
129                         logger.addAppender (appender);
130                         logger.setAdditive(false);
131                 }
132             }
133             logger.info (MessageEnum.LOGGER_UPDATE_DEBUG_SUC, "enabled", "", "");
134             response = "Debuglog successfully enabled.";
135         } else {
136             logger.info (MessageEnum.LOGGER_UPDATE_DEBUG, "", "");
137             for (Logger logger: loggerList) {
138                 if (isMsoLogger (logger.getName ())) {
139                         logger.detachAppender (appender);
140                 }
141             }
142             logger.info (MessageEnum.LOGGER_UPDATE_DEBUG_SUC, "disabled", "", "");
143             response = "Debuglog successfully disabled.";
144         }
145         return Response.status (200).entity (response).build ();
146         
147         
148     }
149
150     private boolean isMsoLogger (String loggerName) {
151         return loggerName.contains (GENERAL_LOGGER) || loggerName.equals (AUDIT_LOGGER)
152                || loggerName.equals (METRICS_LOGGER);
153     }
154
155 }