PageRenderTime 51ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/web/action/admin/ViewLogging.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 400 lines | 299 code | 91 blank | 10 comment | 35 complexity | b1bc4e166739bb16cbe2228256bf9818 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.web.action.admin;
  2. import com.atlassian.jira.cluster.logging.LoggingManager;
  3. import com.atlassian.jira.logging.JiraHomeAppender;
  4. import com.atlassian.jira.mail.MailLoggingManager;
  5. import com.atlassian.jira.util.json.JsonUtil;
  6. import com.atlassian.jira.util.log.Log4jKit;
  7. import com.atlassian.jira.web.action.JiraWebActionSupport;
  8. import com.atlassian.mail.server.MailServerManager;
  9. import com.atlassian.sal.api.websudo.WebSudoRequired;
  10. import com.atlassian.util.profiling.UtilTimerStack;
  11. import com.google.common.base.Function;
  12. import com.google.common.base.Predicate;
  13. import com.google.common.collect.ImmutableList;
  14. import com.google.common.collect.Iterables;
  15. import org.apache.commons.io.FilenameUtils;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.apache.log4j.Appender;
  18. import org.apache.log4j.Level;
  19. import org.apache.log4j.LogManager;
  20. import org.apache.log4j.Logger;
  21. import javax.annotation.Nullable;
  22. import java.io.File;
  23. import java.util.ArrayList;
  24. import java.util.Collection;
  25. import java.util.Collections;
  26. import java.util.Comparator;
  27. import java.util.Enumeration;
  28. import java.util.HashSet;
  29. import java.util.List;
  30. import java.util.Set;
  31. import static com.google.common.collect.ImmutableList.copyOf;
  32. import static com.google.common.collect.Iterables.transform;
  33. /**
  34. * The view action for the JIRA Profiling and Logging Admin section
  35. */
  36. @WebSudoRequired
  37. public class ViewLogging extends JiraWebActionSupport {
  38. protected final LoggingManager loggingManager;
  39. private List<Logger> loggers;
  40. private Logger rootLogger;
  41. private String markMessage;
  42. private boolean rollOver;
  43. private static final Collection<Level> availableLevels = ImmutableList.of(Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.OFF);
  44. private static final String VIEW_LOGGING_JSPA = "ViewLogging.jspa";
  45. private static final String HASH_HTTP = "#http";
  46. private static final String HASH_SQL = "#sql";
  47. private static final String HASH_PROFILING = "#profiling";
  48. private static final String HASH_MAIL = "#mail";
  49. private static final String HTTP_ACCESS_LOG = "com.atlassian.jira.web.filters.accesslog.AccessLogFilter";
  50. private static final String HTTP_DUMP_LOG = "com.atlassian.jira.web.filters.accesslog.AccessLogFilterDump";
  51. private static final String HTTP_ACCESS_LOG_INCLUDE_IMAGES = "com.atlassian.jira.web.filters.accesslog.AccessLogFilterIncludeImages";
  52. private static final String SQL_LOG = "com.atlassian.jira.ofbiz.LoggingSQLInterceptor";
  53. private static final Set<String> LOGGER_NAME_EXEMPTION_SET;
  54. private final MailServerManager mailServerManager;
  55. private final MailLoggingManager mailLoggingManager;
  56. public ViewLogging(MailServerManager mailServerManager, MailLoggingManager mailLoggingManager, LoggingManager loggingManager) {
  57. this.mailServerManager = mailServerManager;
  58. this.mailLoggingManager = mailLoggingManager;
  59. this.loggingManager = loggingManager;
  60. }
  61. static {
  62. Set<String> set = new HashSet<String>();
  63. set.add(SQL_LOG);
  64. set.add(HTTP_ACCESS_LOG);
  65. set.add(HTTP_DUMP_LOG);
  66. set.add(HTTP_ACCESS_LOG_INCLUDE_IMAGES);
  67. LOGGER_NAME_EXEMPTION_SET = Collections.unmodifiableSet(set);
  68. }
  69. public Collection getLoggers() {
  70. if (loggers == null) {
  71. loggers = new ArrayList<Logger>();
  72. final Enumeration currentLoggers = LogManager.getCurrentLoggers();
  73. while (currentLoggers.hasMoreElements()) {
  74. Logger logger = (Logger) currentLoggers.nextElement();
  75. //only display categories that have an explicit level
  76. if (logger.getLevel() != null) {
  77. if (!LOGGER_NAME_EXEMPTION_SET.contains(logger.getName()) && !mailLoggingManager.isMailRelatedLogger(logger)) {
  78. loggers.add(logger);
  79. }
  80. }
  81. }
  82. Collections.sort(loggers, new LoggerComparator());
  83. }
  84. return loggers;
  85. }
  86. public Logger getRootLogger() {
  87. if (rootLogger == null) {
  88. rootLogger = Logger.getRootLogger();
  89. }
  90. return rootLogger;
  91. }
  92. public Collection<Level> getAvailableLevels() {
  93. return availableLevels;
  94. }
  95. public String getAvailableLevelsAsJson() {
  96. return JsonUtil.toJsonString(copyOf(transform(getAvailableLevels(), new Function<Level, String>() {
  97. @Override
  98. public String apply(Level from) {
  99. return from.toString();
  100. }
  101. })));
  102. }
  103. //---------Log mark related methods ------------------------//
  104. public String doMarkLogs() throws Exception {
  105. String msg = getMarkMessage();
  106. loggingManager.markLogs(msg, rollOver);
  107. return getRedirect(VIEW_LOGGING_JSPA);
  108. }
  109. //---------Profiling related methods ------------------------//
  110. public String doEnableProfiling() throws Exception {
  111. loggingManager.enableProfiling();
  112. return getRedirect(VIEW_LOGGING_JSPA + HASH_PROFILING);
  113. }
  114. public String doDisableProfiling() throws Exception {
  115. loggingManager.disableProfiling();
  116. return getRedirect(VIEW_LOGGING_JSPA + HASH_PROFILING);
  117. }
  118. public boolean isProfilingEnabled() {
  119. return UtilTimerStack.isActive();
  120. }
  121. //---------HTTP related methods ------------------------//
  122. public String doEnableHttpAccessLog() {
  123. loggingManager.setLogLevel(getHttpAccessLogger(), Level.INFO);
  124. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  125. }
  126. public String doDisableHttpAccessLog() {
  127. // always do these in pairs
  128. loggingManager.setLogLevel(getHttpAccessLogger(), Level.OFF);
  129. loggingManager.setLogLevel(getHttpAccessIncludeImagesLogger(), Level.OFF);
  130. loggingManager.setLogLevel(getHttpDumpLogger(), Level.OFF);
  131. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  132. }
  133. private Logger getHttpAccessLogger() {
  134. return Logger.getLogger(HTTP_ACCESS_LOG);
  135. }
  136. public boolean isHttpAccessLogEnabled() {
  137. return getHttpAccessLogger().getLevel() != Level.OFF;
  138. }
  139. public String doEnableHttpDumpLog() {
  140. loggingManager.setLogLevel(getHttpDumpLogger(), Level.INFO);
  141. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  142. }
  143. public String doDisableHttpDumpLog() {
  144. loggingManager.setLogLevel(getHttpDumpLogger(), Level.OFF);
  145. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  146. }
  147. private Logger getHttpDumpLogger() {
  148. return Logger.getLogger(HTTP_DUMP_LOG);
  149. }
  150. public boolean isHttpDumpLogEnabled() {
  151. return getHttpDumpLogger().getLevel() != Level.OFF;
  152. }
  153. public String doEnableHttpAccessLogIncludeImages() {
  154. loggingManager.setLogLevel(getHttpAccessIncludeImagesLogger(), Level.INFO);
  155. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  156. }
  157. public String doDisableHttpAccessLogIncludeImages() {
  158. loggingManager.setLogLevel(getHttpAccessIncludeImagesLogger(), Level.OFF);
  159. return getRedirect(VIEW_LOGGING_JSPA + HASH_HTTP);
  160. }
  161. private Logger getHttpAccessIncludeImagesLogger() {
  162. return Logger.getLogger(HTTP_ACCESS_LOG_INCLUDE_IMAGES);
  163. }
  164. public boolean isHttpAccessLogIncludeImagesEnabled() {
  165. return getHttpAccessIncludeImagesLogger().getLevel() != Level.OFF;
  166. }
  167. //---------SQL related methods ------------------------//
  168. public String doEnableSqlLog() {
  169. loggingManager.setLogLevel(getSqlLogger(), Level.INFO);
  170. return getRedirect(VIEW_LOGGING_JSPA + HASH_SQL);
  171. }
  172. public String doDisableSqlLog() {
  173. loggingManager.setLogLevel(getSqlLogger(), Level.OFF);
  174. return getRedirect(VIEW_LOGGING_JSPA + HASH_SQL);
  175. }
  176. public String doEnableSqlDumpLog() {
  177. loggingManager.setLogLevel(getSqlLogger(), Level.DEBUG);
  178. return getRedirect(VIEW_LOGGING_JSPA + HASH_SQL);
  179. }
  180. public String doDisableSqlDumpLog() {
  181. loggingManager.setLogLevel(getSqlLogger(), Level.INFO);
  182. return getRedirect(VIEW_LOGGING_JSPA + HASH_SQL);
  183. }
  184. private Logger getSqlLogger() {
  185. return Logger.getLogger(SQL_LOG);
  186. }
  187. public boolean isSqlLogEnabled() {
  188. return getSqlLogger().getLevel() != Level.OFF;
  189. }
  190. public boolean isSqlDumpLogEnabled() {
  191. return getSqlLogger().getLevel() == Level.DEBUG;
  192. }
  193. public boolean isAtLevel(final Logger logger, final String targetLevel) {
  194. final String loggerLevelName = logger.getEffectiveLevel().toString();
  195. return targetLevel.equals(loggerLevelName);
  196. }
  197. //------------- Mail logging related methods ---------------------------/
  198. public Logger getOutgoingMailLogger() {
  199. return Logger.getLogger("com.atlassian.mail");
  200. }
  201. public boolean isOutgoingMailLoggingEnabled() {
  202. return mailLoggingManager.getOutgoingMailLoggingLevel() != Level.OFF;
  203. }
  204. public boolean isOutgoingMailDebugEnabled() {
  205. return mailLoggingManager.getOutgoingMailLoggingLevel() == Level.DEBUG;
  206. }
  207. public boolean isIncomingMailLoggingEnabled() {
  208. return mailLoggingManager.getIncomingMailLoggingLevel() != Level.OFF;
  209. }
  210. public boolean isIncomingMailDebugEnabled() {
  211. return mailLoggingManager.getIncomingMailLoggingLevel() == Level.DEBUG;
  212. }
  213. public boolean isOutgoingMailServerDefined() {
  214. return mailServerManager.getDefaultSMTPMailServer() != null;
  215. }
  216. public boolean isIncomingMailServerDefined() {
  217. return !mailServerManager.getPopMailServers().isEmpty();
  218. }
  219. @Nullable
  220. public String getOutgoingMailFirstLogFileName() {
  221. return StringUtils.defaultString(getFirstFileAppenderFileName(mailLoggingManager.getOutgoingMailLogger()),
  222. "atlassian-jira-outgoing-mail.log");
  223. }
  224. @Nullable
  225. public String getIncomingMailFirstLogFileName() {
  226. return StringUtils.defaultString(getFirstFileAppenderFileName(mailLoggingManager.getIncomingMailLogger()),
  227. "atlassian-jira-incoming-mail.log");
  228. }
  229. @Nullable
  230. public String getFirstFileAppenderFileName(final Logger logger) {
  231. @SuppressWarnings("unchecked")
  232. final ArrayList<Appender> appenders = Collections.list(logger.getAllAppenders());
  233. final Appender fileAppender = Iterables.get(Iterables.filter(appenders, new Predicate<Appender>() {
  234. @Override
  235. public boolean apply(Appender input) {
  236. if (input instanceof JiraHomeAppender) {
  237. return ((JiraHomeAppender) input).getFile() != null;
  238. }
  239. return Log4jKit.getLogFileName(input.getName()) != null;
  240. }
  241. }), 0, null);
  242. if (fileAppender == null) {
  243. return null;
  244. }
  245. if (fileAppender instanceof JiraHomeAppender) {
  246. return FilenameUtils.getName(((JiraHomeAppender) fileAppender).getFile());
  247. }
  248. final File file = Log4jKit.getLogFileName(fileAppender.getName());
  249. return file != null ? file.getName() : null;
  250. }
  251. public String doEnableOutgoingMailLogging() {
  252. return setOutgoingMailLoggingLevelAndRedirectBack(Level.INFO);
  253. }
  254. public String doDisableOutgoingMailLogging() {
  255. return setOutgoingMailLoggingLevelAndRedirectBack(Level.OFF);
  256. }
  257. public String doDisableOutgoingMailDebugging() {
  258. return setOutgoingMailLoggingLevelAndRedirectBack(Level.INFO);
  259. }
  260. public String doEnableOutgoingMailDebugging() {
  261. return setOutgoingMailLoggingLevelAndRedirectBack(Level.DEBUG);
  262. }
  263. public String doEnableIncomingMailLogging() {
  264. return setIncomingMailLoggingLevelAndRedirectBack(Level.INFO);
  265. }
  266. public String doDisableIncomingMailLogging() {
  267. return setIncomingMailLoggingLevelAndRedirectBack(Level.OFF);
  268. }
  269. public String doDisableIncomingMailDebugging() {
  270. return setIncomingMailLoggingLevelAndRedirectBack(Level.INFO);
  271. }
  272. public String doEnableIncomingMailDebugging() {
  273. return setIncomingMailLoggingLevelAndRedirectBack(Level.DEBUG);
  274. }
  275. private String setOutgoingMailLoggingLevelAndRedirectBack(Level loggingLevel) {
  276. mailLoggingManager.setOutgoingMailLoggingLevel(loggingLevel);
  277. return getRedirect(VIEW_LOGGING_JSPA + HASH_MAIL);
  278. }
  279. private String setIncomingMailLoggingLevelAndRedirectBack(Level loggingLevel) {
  280. mailLoggingManager.setIncomingMailLoggingLevel(loggingLevel);
  281. return getRedirect(VIEW_LOGGING_JSPA + HASH_MAIL);
  282. }
  283. public String getMarkMessage() {
  284. return markMessage;
  285. }
  286. public void setMarkMessage(String markMessage) {
  287. this.markMessage = markMessage;
  288. }
  289. public boolean isRollOver() {
  290. return rollOver;
  291. }
  292. public void setRollOver(boolean rollOver) {
  293. this.rollOver = rollOver;
  294. }
  295. private static class LoggerComparator implements Comparator<Logger> {
  296. public int compare(final Logger o1, final Logger o2) {
  297. if (o1 == null || o2 == null) {
  298. return 0; //lazy
  299. }
  300. String name1 = o1.getName();
  301. String name2 = o2.getName();
  302. if (name1 == null || name2 == null) {
  303. return 0; //lazy
  304. } else {
  305. return name1.compareTo(name2);
  306. }
  307. }
  308. }
  309. }