diff options
Diffstat (limited to 'jdisc_http_service')
-rw-r--r-- | jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java | 55 | ||||
-rw-r--r-- | jdisc_http_service/src/test/java/com/yahoo/container/logging/LogFileHandlerTestCase.java | 8 |
2 files changed, 51 insertions, 12 deletions
diff --git a/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java b/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java index 5b30ffbe363..04cbb2217fe 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java +++ b/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java @@ -13,6 +13,11 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -22,6 +27,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.logging.ErrorManager; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -35,7 +41,7 @@ import java.util.zip.GZIPOutputStream; * @author Bob Travis * @author bjorncs */ -class LogFileHandler extends StreamHandler { +class LogFileHandler { enum Compression { NONE, GZIP, ZSTD } @@ -56,6 +62,8 @@ class LogFileHandler extends StreamHandler { private volatile String fileName; private volatile long lastDropPosition = 0; + private volatile Writer writer; + static private class LogThread extends Thread { LogFileHandler logFileHandler; long lastFlush = 0; @@ -112,8 +120,6 @@ class LogFileHandler extends StreamHandler { long[] rotationTimes, String symlinkName, Formatter formatter) { - super(); - super.setFormatter(formatter); this.compression = compression; this.filePattern = filePattern; this.rotationTimes = rotationTimes; @@ -127,7 +133,6 @@ class LogFileHandler extends StreamHandler { * * @param r logrecord to publish */ - @Override public void publish(LogRecord r) { try { logQueue.put(r); @@ -135,9 +140,14 @@ class LogFileHandler extends StreamHandler { } } - @Override public synchronized void flush() { - super.flush(); + if(writer != null) { + try { + writer.flush(); + } catch (IOException e) { + logger.warning("Failed flushing file writer: " + Exceptions.toMessageString(e)); + } + } try { if (currentOutputStream != null && compression == Compression.GZIP) { long newPos = currentOutputStream.getChannel().position(); @@ -151,6 +161,29 @@ class LogFileHandler extends StreamHandler { } } + private synchronized void setOutputStream(OutputStream out) { + if (out == null) { + throw new NullPointerException(); + } + flushAndClose(); + writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); + } + private synchronized void flushAndClose() throws SecurityException { + if (writer != null) { + try { + writer.flush(); + writer.close(); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Failed to close writer", ex); + } + writer = null; + } + } + + public void close() { + flushAndClose(); + } + private void internalPublish(LogRecord r) { // first check to see if new file needed. // if so, use this.internalRotateNow() to do it @@ -162,7 +195,11 @@ class LogFileHandler extends StreamHandler { if (now > nextRotationTime || currentOutputStream == null) { internalRotateNow(); } - super.publish(r); + try { + writer.write(r.getMessage()); + } catch (IOException e) { + logger.warning("Failed writing log record: " + Exceptions.toMessageString(e)); + } } /** @@ -228,12 +265,12 @@ class LogFileHandler extends StreamHandler { long now = System.currentTimeMillis(); fileName = LogFormatter.insertDate(filePattern, now); flush(); - super.close(); + flushAndClose(); try { checkAndCreateDir(fileName); FileOutputStream os = new FileOutputStream(fileName, true); // append mode, for safety - super.setOutputStream(os); + setOutputStream(os); currentOutputStream = os; lastDropPosition = 0; LogFileDb.nowLoggingTo(fileName); diff --git a/jdisc_http_service/src/test/java/com/yahoo/container/logging/LogFileHandlerTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/container/logging/LogFileHandlerTestCase.java index c0dafe05bb6..a2e56290962 100644 --- a/jdisc_http_service/src/test/java/com/yahoo/container/logging/LogFileHandlerTestCase.java +++ b/jdisc_http_service/src/test/java/com/yahoo/container/logging/LogFileHandlerTestCase.java @@ -113,7 +113,8 @@ public class LogFileHandlerTestCase { LogFileHandler handler = new LogFileHandler( Compression.NONE, root.getAbsolutePath() + "/logfilehandlertest.%Y%m%d%H%M%S%s", new long[]{0}, "symlink", formatter); - handler.publish(new LogRecord(Level.INFO, "test")); + String message = formatter.format(new LogRecord(Level.INFO, "test")); + handler.publish(new LogRecord(Level.INFO, message)); String firstFile; do { Thread.sleep(1); @@ -126,7 +127,8 @@ public class LogFileHandlerTestCase { secondFileName = handler.getFileName(); } while (firstFile.equals(secondFileName)); - handler.publish(new LogRecord(Level.INFO, "string which is way longer than the word test")); + String longMessage = formatter.format(new LogRecord(Level.INFO, "string which is way longer than the word test")); + handler.publish(new LogRecord(Level.INFO, longMessage)); handler.waitDrained(); assertThat(Files.size(Paths.get(firstFile))).isEqualTo(31); final long expectedSecondFileLength = 72; @@ -177,7 +179,7 @@ public class LogFileHandlerTestCase { compression, root.getAbsolutePath() + "/logfilehandlertest.%Y%m%d%H%M%S%s", new long[]{0}, null, formatter); int logEntries = 10000; for (int i = 0; i < logEntries; i++) { - LogRecord lr = new LogRecord(Level.INFO, "test"); + LogRecord lr = new LogRecord(Level.INFO, "test\n"); h.publish(lr); } h.waitDrained(); |