001 /**
002 * Copyright 2010-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.common.jdbc.listeners;
017
018 import org.kuali.common.jdbc.model.LogSqlMode;
019 import org.kuali.common.jdbc.model.event.SqlEvent;
020 import org.kuali.common.util.Assert;
021 import org.kuali.common.util.FormatUtils;
022 import org.kuali.common.util.Str;
023 import org.kuali.common.util.log.LoggerLevel;
024 import org.kuali.common.util.log.LoggerUtils;
025 import org.slf4j.Logger;
026 import org.slf4j.LoggerFactory;
027
028 public final class LogSqlListener extends NoOpSqlListener {
029
030 private static final Logger logger = LoggerFactory.getLogger(LogSqlListener.class);
031 public static final LoggerLevel DEFAULT_LOGGER_LEVEL = LoggerLevel.DEBUG;
032 public static final LogSqlMode DEFAULT_MODE = LogSqlMode.AFTER;
033 public static final boolean DEFAULT_FLATTEN = true;
034
035 private final LoggerLevel level;
036 private final boolean flatten;
037 private final LogSqlMode mode;
038
039 public LogSqlListener() {
040 this(DEFAULT_LOGGER_LEVEL, DEFAULT_MODE, DEFAULT_FLATTEN);
041 }
042
043 public LogSqlListener(LoggerLevel level, LogSqlMode mode) {
044 this(level, mode, DEFAULT_FLATTEN);
045 }
046
047 public LogSqlListener(LoggerLevel level, LogSqlMode mode, boolean flatten) {
048 Assert.noNulls(level, mode);
049 this.level = level;
050 this.mode = mode;
051 this.flatten = flatten;
052 }
053
054 @Override
055 public void beforeExecuteSql(SqlEvent event) {
056 switch (mode) {
057 case BEFORE:
058 case BOTH:
059 String sql = getSql(event.getSql(), flatten);
060 LoggerUtils.logMsg(sql, logger, level);
061 return;
062 case AFTER:
063 return;
064 default:
065 throw new IllegalArgumentException("Mode [" + mode + "] is unknown");
066 }
067 }
068
069 @Override
070 public void afterExecuteSql(SqlEvent event) {
071 switch (mode) {
072 case BEFORE:
073 return;
074 case BOTH:
075 case AFTER:
076 String sql = getSql(event.getSql(), flatten);
077 String elapsed = FormatUtils.getTime(event.getStopTimeMillis() - event.getStartTimeMillis());
078 Object[] args = { sql, elapsed };
079 LoggerUtils.logMsg("{} - {}", args, logger, level);
080 return;
081 default:
082 throw new IllegalArgumentException("Mode [" + mode + "] is unknown");
083 }
084 }
085
086 protected String getSql(String sql, boolean flatten) {
087 if (flatten) {
088 return "[" + Str.flatten(sql) + "]";
089 } else {
090 return sql;
091 }
092 }
093
094 public static Logger getLogger() {
095 return logger;
096 }
097
098 public LoggerLevel getLevel() {
099 return level;
100 }
101
102 public boolean isFlatten() {
103 return flatten;
104 }
105
106 public LogSqlMode getMode() {
107 return mode;
108 }
109
110 }