From b15f9a03c9f424e0831e8ca1778b840a7f58a9d0 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Thu, 14 May 2020 00:32:26 +0300 Subject: [PATCH] Add logging to file (#10) --- src/ru/krlvm/powertunnel/PowerTunnel.java | 6 ++++ src/ru/krlvm/powertunnel/frames/LogFrame.java | 2 +- .../system/MirroredOutputStream.java | 6 ++++ .../krlvm/powertunnel/utilities/Utility.java | 31 +++++++++++++++++-- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/ru/krlvm/powertunnel/PowerTunnel.java b/src/ru/krlvm/powertunnel/PowerTunnel.java index 1f5d5751..53545327 100644 --- a/src/ru/krlvm/powertunnel/PowerTunnel.java +++ b/src/ru/krlvm/powertunnel/PowerTunnel.java @@ -127,6 +127,7 @@ public static void main(String[] args) { " -port [Port] sets port\n" + " -enable-journal enables PowerTunnel journal (when UI enabled)\n" + " -enable-logs enables PowerTunnel logs (when UI enabled)\n" + + " -enable-log-to-file enables PowerTunnel logger and log file\n" + " -with-web-ui [appendix] enables Web UI at http://" + String.format(PowerTunnelMonitor.FAKE_ADDRESS_TEMPLATE, "[appendix]") + "\n" + " -disable-auto-proxy-setup disables auto proxy setup on Windows\n" + " -auto-proxy-setup-win-ie auto proxy setup using IE instead of native API on Windows\n" + @@ -151,6 +152,7 @@ public static void main(String[] args) { } case "full-output-mirroring": { FULL_OUTPUT_MIRRORING = true; + Utility.print("[+] Enabled full output mirroring"); break; } case "debug": { @@ -179,6 +181,10 @@ public static void main(String[] args) { SETTINGS.setTemporaryValue(Settings.ENABLE_LOGS, "true"); break; } + case "enable-log-to-file": { + Utility.initializeLogger(); + break; + } case "disable-auto-proxy-setup": { SETTINGS.setTemporaryValue(Settings.AUTO_PROXY_SETUP_ENABLED, "false"); break; diff --git a/src/ru/krlvm/powertunnel/frames/LogFrame.java b/src/ru/krlvm/powertunnel/frames/LogFrame.java index 8bc96917..be5cdba2 100644 --- a/src/ru/krlvm/powertunnel/frames/LogFrame.java +++ b/src/ru/krlvm/powertunnel/frames/LogFrame.java @@ -88,7 +88,7 @@ public static void print(String s) { return; } instance.logArea.append(s); - if(!PowerTunnel.FULL_OUTPUT_MIRRORING) { + if(!s.endsWith("\n")) { instance.logArea.append("\r\n"); } instance.logArea.setCaretPosition(instance.logArea.getDocument().getLength()); diff --git a/src/ru/krlvm/powertunnel/system/MirroredOutputStream.java b/src/ru/krlvm/powertunnel/system/MirroredOutputStream.java index 292b054f..8aef5fa5 100644 --- a/src/ru/krlvm/powertunnel/system/MirroredOutputStream.java +++ b/src/ru/krlvm/powertunnel/system/MirroredOutputStream.java @@ -1,6 +1,7 @@ package ru.krlvm.powertunnel.system; import ru.krlvm.powertunnel.frames.LogFrame; +import ru.krlvm.powertunnel.utilities.Utility; import java.io.FilterOutputStream; import java.io.IOException; @@ -35,6 +36,11 @@ public void write(byte[] b, int off, int len) { } private void writeToLog(String s) { + if(Utility.LOGGER != null && !s.startsWith(MIRROR_TAG)) { + Utility.LOGGER.info(MIRROR_TAG + s); + } LogFrame.print(s); } + + private static final String MIRROR_TAG = "[Mirrored] "; } diff --git a/src/ru/krlvm/powertunnel/utilities/Utility.java b/src/ru/krlvm/powertunnel/utilities/Utility.java index faaaa103..02743293 100644 --- a/src/ru/krlvm/powertunnel/utilities/Utility.java +++ b/src/ru/krlvm/powertunnel/utilities/Utility.java @@ -3,6 +3,8 @@ import ru.krlvm.powertunnel.PowerTunnel; import ru.krlvm.powertunnel.frames.LogFrame; +import java.util.logging.*; + /** * PowerTunnel Utilities * Main utility class @@ -35,8 +37,12 @@ public static void print(String message) { print(); return; } - System.out.println(message); - if(PowerTunnel.isUIEnabled() && !PowerTunnel.FULL_OUTPUT_MIRRORING) { + if(LOGGER == null) { + System.out.println(message); + } else { + LOGGER.info(message); + } + if(PowerTunnel.isUIEnabled() && (LOGGER != null || !PowerTunnel.FULL_OUTPUT_MIRRORING)) { LogFrame.print(message); } } @@ -47,4 +53,25 @@ public static void print(String message) { public static void print() { print(""); } + + public static void initializeLogger() { + LOGGER = Logger.getLogger("PT"); + try { + FileHandler handler = new FileHandler("powertunnel.log"); + handler.setFormatter(new Formatter() { + @Override + public String format(LogRecord record) { + return String.valueOf(record.getLevel()) + ':' + + record.getMessage() + '\n'; + } + }); + LOGGER.addHandler(handler); + } catch (Exception ex) { + LOGGER = null; + print("[x] Failed to initialize logger: " + ex.getMessage()); + Debugger.debug(ex); + } + } + + public static Logger LOGGER; }