Use internal logging for --log-file instead of copying stdio/stderr to file (which doesn't work for native code or sub-process console output anyway)
This commit is contained in:
parent
3fee8bed74
commit
b44df59d55
|
@ -9,6 +9,7 @@ import java.io.PrintStream;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.logging.Formatter;
|
import java.util.logging.Formatter;
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
|
@ -48,7 +49,21 @@ public final class Logging {
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static StreamHandler createLogFileHandler(FileChannel channel, Level level) throws IOException {
|
public static StreamHandler createLogFileHandler(File file, boolean lock, Level level) throws IOException {
|
||||||
|
if (!file.exists() && !file.getParentFile().mkdirs() && !file.createNewFile()) {
|
||||||
|
throw new IOException("Failed to create log file: " + file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// open file channel and lock
|
||||||
|
FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.APPEND);
|
||||||
|
if (lock) {
|
||||||
|
try {
|
||||||
|
channel.lock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException("Failed to acquire lock: " + file, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StreamHandler handler = new StreamHandler(newOutputStream(channel), new ConsoleFormatter(anonymizePattern.get(), false));
|
StreamHandler handler = new StreamHandler(newOutputStream(channel), new ConsoleFormatter(anonymizePattern.get(), false));
|
||||||
handler.setEncoding("UTF-8");
|
handler.setEncoding("UTF-8");
|
||||||
handler.setLevel(level);
|
handler.setLevel(level);
|
||||||
|
|
|
@ -14,8 +14,6 @@ import java.awt.Dialog.ModalityType;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.channels.FileChannel;
|
|
||||||
import java.nio.file.StandardOpenOption;
|
|
||||||
import java.security.CodeSource;
|
import java.security.CodeSource;
|
||||||
import java.security.Permission;
|
import java.security.Permission;
|
||||||
import java.security.PermissionCollection;
|
import java.security.PermissionCollection;
|
||||||
|
@ -392,28 +390,12 @@ public class Main {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tee stdout and stderr to log file if set
|
// tee stdout and stderr to log file if --log-file is set
|
||||||
if (args.logFile != null) {
|
if (args.logFile != null) {
|
||||||
File logFile = new File(args.logFile);
|
|
||||||
if (!logFile.isAbsolute()) {
|
|
||||||
logFile = new File(ApplicationFolder.AppData.resolve("logs"), logFile.getPath()).getAbsoluteFile(); // by default resolve relative paths against {applicationFolder}/logs/{logFile}
|
|
||||||
}
|
|
||||||
if (!logFile.exists() && !logFile.getParentFile().mkdirs() && !logFile.createNewFile()) {
|
|
||||||
throw new IOException("Failed to create log file: " + logFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
// open file channel and lock
|
|
||||||
FileChannel logChannel = FileChannel.open(logFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.APPEND);
|
|
||||||
if (args.logLock) {
|
if (args.logLock) {
|
||||||
try {
|
log.config("Locking " + log);
|
||||||
log.config("Locking " + logFile);
|
|
||||||
logChannel.lock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new IOException("Failed to acquire lock: " + logFile, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Handler logFileHandler = createLogFileHandler(args.getLogFile(), args.logLock, Level.ALL);
|
||||||
Handler logFileHandler = createLogFileHandler(logChannel, Level.ALL);
|
|
||||||
log.addHandler(logFileHandler);
|
log.addHandler(logFileHandler);
|
||||||
debug.addHandler(logFileHandler);
|
debug.addHandler(logFileHandler);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.kohsuke.args4j.Option;
|
||||||
import org.kohsuke.args4j.ParserProperties;
|
import org.kohsuke.args4j.ParserProperties;
|
||||||
import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
|
import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
|
||||||
|
|
||||||
|
import net.filebot.ApplicationFolder;
|
||||||
import net.filebot.Language;
|
import net.filebot.Language;
|
||||||
import net.filebot.StandardRenameAction;
|
import net.filebot.StandardRenameAction;
|
||||||
import net.filebot.WebServices;
|
import net.filebot.WebServices;
|
||||||
|
@ -263,6 +264,17 @@ public class ArgumentBean {
|
||||||
return optional(lang).map(Language::findLanguage).orElseThrow(error("Illegal language code", lang));
|
return optional(lang).map(Language::findLanguage).orElseThrow(error("Illegal language code", lang));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public File getLogFile() {
|
||||||
|
File file = new File(logFile);
|
||||||
|
|
||||||
|
if (file.isAbsolute()) {
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
// by default resolve relative paths against {applicationFolder}/logs/{logFile}
|
||||||
|
return ApplicationFolder.AppData.resolve("logs/" + logFile);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isStrict() {
|
public boolean isStrict() {
|
||||||
return !nonStrict;
|
return !nonStrict;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue