Skip to content

Commit

Permalink
lazy initialization for FileLogger
Browse files Browse the repository at this point in the history
fixes #290
  • Loading branch information
quintonm committed May 20, 2015
1 parent a40644b commit 3639f99
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 104 deletions.
79 changes: 30 additions & 49 deletions src/main/java/com/p6spy/engine/spy/appender/BatchFileLogger.java
Expand Up @@ -19,23 +19,20 @@
*/
package com.p6spy.engine.spy.appender;

import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.P6SpyOptions;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import com.p6spy.engine.logging.Category;
import com.p6spy.engine.spy.P6SpyOptions;

/**
* SQL batch file logger Private: (?) No Appender that writes a trace of JDBC activity into an SQL
* batch file that can be later "replayed" using a generic SQL client.
* <p>
* modify the spy.properties file to make p6spy use this appender by adding line
* appender=com.p6spy.engine.logging.appender.BatchFileLogger and commenting out the existing
* appender #appender=com.p6spy.engine.logging.appender.FileLogger - specify an alternative log file
* name in spy.properties so that diagnostic entries to spy.log made by p6spy at startup do not mess
* up your batch.
* modify the spy.properties file to make p6spy use this appender by setting
* appender=com.p6spy.engine.spy.appender.BatchFileLogger.
* </p>
* <p>Here's how it works for me: logfile = spy.sql The appender writes the text of SQL
* statements as well as commit and rollback commands to the specified file, each on a new line. For
Expand All @@ -45,52 +42,36 @@
* one will have a delimiter character ';' appended to them. This batch format works well with
* WinSQL. The format is hardcoded, so if you want to make it configurable you'll have to patch my
* patch or write your own :)
* */
*/
public class BatchFileLogger extends FileLogger {
public static final char BATCH_SEPARATOR = ';';
private boolean endOfStatement = true;

public BatchFileLogger() {
//this("spy.sql");
}

@Override
public void logException(Exception e) {
}
@Override
public void logException(Exception e) {
}

@Override
public void logSQL(int connectionId, String now, long elapsed, Category category, String prepared, String sql) {
if (endOfStatement) {
qlog.println(BATCH_SEPARATOR);
}
if (category.equals("statement")) {
String actual = null == sql || 0 == sql.length() ? prepared : sql;
qlog.print(actual);
endOfStatement = true;
} else if (Category.COMMIT.equals(category) || Category.ROLLBACK.equals(category)) {
qlog.print(category/*.toUpperCase()*/);
endOfStatement = true;
} else {
qlog.println("-- " + category);
endOfStatement = false;
}
qlog.flush();
@Override
public void logSQL(int connectionId, String now, long elapsed, Category category, String prepared, String sql) {
if (endOfStatement) {
getStream().println(BATCH_SEPARATOR);
}

@Override
public void logText(String text) {
}

@Override
public void setLogfile(String fileName) {
try {
boolean append = P6SpyOptions.getActiveInstance().getAppend();
endOfStatement = append && 0L < new File(fileName).length();
qlog = new PrintStream(new FileOutputStream(fileName, append));
} catch (IOException e) {
e.printStackTrace(System.err);
}
if (category.equals("statement")) {
String actual = null == sql || 0 == sql.length() ? prepared : sql;
getStream().print(actual);
endOfStatement = true;
} else if (Category.COMMIT.equals(category) || Category.ROLLBACK.equals(category)) {
getStream().print(category);
endOfStatement = true;
} else {
getStream().println("-- " + category);
endOfStatement = false;
}
getStream().flush();
}

public static final char BATCH_SEPARATOR = ';';
@Override
public void logText(String text) {
}

private boolean endOfStatement;
}
44 changes: 36 additions & 8 deletions src/main/java/com/p6spy/engine/spy/appender/FileLogger.java
Expand Up @@ -18,20 +18,48 @@
* #L%
*/
package com.p6spy.engine.spy.appender;

import com.p6spy.engine.spy.P6SpyOptions;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

import com.p6spy.engine.spy.P6SpyOptions;

/**
* Appender which writes log messages to a file. This is the default appended for P6Spy.
*/
public class FileLogger extends StdoutLogger {

public void setLogfile(String fileName) {
try {
qlog = new PrintStream(new FileOutputStream(fileName, P6SpyOptions.getActiveInstance().getAppend()));
} catch (IOException e) {
e.printStackTrace(System.err);
}
private String fileName = null;
private PrintStream printStream = null;

private void init() {
if (fileName == null) {
throw new IllegalStateException("setLogfile() must be called before init()");
}
try {
printStream = new PrintStream(new FileOutputStream(fileName, P6SpyOptions.getActiveInstance().getAppend()));
} catch (IOException e) {
e.printStackTrace(System.err);
}
}

@Override
protected PrintStream getStream() {
// Lazy init to allow for the appender to be changed at Runtime without creating an empty log file (assuming
// that no log message has been written yet)
if (printStream == null) {
synchronized (this) {
if (printStream == null) {
init();
}
}
}
return printStream;
}

public void setLogfile(String fileName) {
this.fileName = fileName;
}
}

45 changes: 22 additions & 23 deletions src/main/java/com/p6spy/engine/spy/appender/StdoutLogger.java
Expand Up @@ -19,31 +19,30 @@
*/
package com.p6spy.engine.spy.appender;

import java.io.PrintStream;

import com.p6spy.engine.logging.Category;

import java.io.PrintStream;

public class StdoutLogger extends FormattedLogger {
protected PrintStream qlog;

public StdoutLogger() {
qlog = System.out;
}

@Override
public void logException(Exception e) {
e.printStackTrace(qlog);
}

@Override
public void logText(String text) {
qlog.println(text);
}

@Override
public boolean isCategoryEnabled(Category category) {
// no restrictions on logger side
return true;
}

protected PrintStream getStream() {
return System.out;
}

@Override
public void logException(Exception e) {
e.printStackTrace(getStream());
}

@Override
public void logText(String text) {
getStream().println(text);
}

@Override
public boolean isCategoryEnabled(Category category) {
// no restrictions on logger side
return true;
}
}

55 changes: 31 additions & 24 deletions src/test/java/com/p6spy/engine/spy/option/P6TestOptionDefaults.java
Expand Up @@ -19,23 +19,6 @@
*/
package com.p6spy.engine.spy.option;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.p6spy.engine.common.P6LogQuery;
import com.p6spy.engine.logging.Category;
import com.p6spy.engine.logging.P6LogFactory;
Expand All @@ -53,6 +36,22 @@
import com.p6spy.engine.spy.appender.SingleLineFormat;
import com.p6spy.engine.test.BaseTestCase;
import com.p6spy.engine.test.P6TestFramework;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class P6TestOptionDefaults extends BaseTestCase {

Expand All @@ -69,7 +68,7 @@ public class P6TestOptionDefaults extends BaseTestCase {
public static void setUpAll() throws SQLException, IOException {
// cleanup all
LOG_FILE.delete();

// make sure to reinit properly
new P6TestFramework("blank") {
};
Expand Down Expand Up @@ -235,22 +234,30 @@ private void assertDefaultDisabledLogCategories() throws IOException {
{
final String msg = "debug logged test msg";
P6LogQuery.debug(msg);
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertFalse(logged.contains(msg));
if( LOG_FILE.exists() ) {
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertFalse(logged.contains(msg));
}
}

{
final String msg = "info logged test msg";
P6LogQuery.info(msg);
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertFalse(logged.contains(msg));
if( LOG_FILE.exists() ) {
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertFalse(logged.contains(msg));
}
}

{
final String msg = "error logged test msg";
P6LogQuery.error(msg);
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertTrue(logged.contains(msg));
if( LOG_FILE.exists() ) {
final String logged = FileUtils.readFileToString(LOG_FILE, "UTF-8");
Assert.assertTrue(logged.contains(msg));
} else {
Assert.fail("log file not created");
}
}
}
}

0 comments on commit 3639f99

Please sign in to comment.