summaryrefslogtreecommitdiffstats
path: root/jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java
diff options
context:
space:
mode:
authorMorten Tokle <morten.tokle@gmail.com>2021-01-22 11:03:43 +0100
committerGitHub <noreply@github.com>2021-01-22 11:03:43 +0100
commitadb50113166649a26008db2933616f1bad35bee2 (patch)
treea752759533fd5209bbe31bd8fb20eb3a5041ac82 /jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java
parent2f5529f030431b45cb03fc2f4a508ca9676d705b (diff)
Revert "Revert "Remove locks in access logging [run-systemtest]""
Diffstat (limited to 'jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java')
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/container/logging/LogFileHandler.java62
1 files changed, 49 insertions, 13 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..58a324b7f26 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;
@@ -102,18 +110,15 @@ class LogFileHandler extends StreamHandler {
}
}
- LogFileHandler(Compression compression, String filePattern, String rotationTimes, String symlinkName, Formatter formatter) {
- this(compression, filePattern, calcTimesMinutes(rotationTimes), symlinkName, formatter);
+ LogFileHandler(Compression compression, String filePattern, String rotationTimes, String symlinkName) {
+ this(compression, filePattern, calcTimesMinutes(rotationTimes), symlinkName);
}
LogFileHandler(
Compression compression,
String filePattern,
long[] rotationTimes,
- String symlinkName,
- Formatter formatter) {
- super();
- super.setFormatter(formatter);
+ String symlinkName) {
this.compression = compression;
this.filePattern = filePattern;
this.rotationTimes = rotationTimes;
@@ -127,7 +132,6 @@ class LogFileHandler extends StreamHandler {
*
* @param r logrecord to publish
*/
- @Override
public void publish(LogRecord r) {
try {
logQueue.put(r);
@@ -135,9 +139,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 +160,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 +194,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 +264,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);