From 77fd6a84c8ddd4ba3eab31fe4e3b867a27cf7762 Mon Sep 17 00:00:00 2001 From: Banks T Date: Fri, 24 Jul 2020 12:06:54 -0400 Subject: [PATCH] Logging additions 2 (#55) * Add overload to logger.error() for Throwable to print stack trace * Replaced all e.printStackTrace() with logger.error() * Log level dependent on dev or release --- .../src/main/java/org/photonvision/Main.java | 14 +++++------ .../common/configuration/ConfigManager.java | 18 ++++++--------- .../common/dataflow/DataChangeService.java | 3 +-- .../photonvision/common/logging/Logger.java | 23 +++++++++++++++++-- .../common/networking/LinuxNetworking.java | 6 ++--- .../common/networking/NetworkInterface.java | 6 ++++- .../common/scripting/ScriptEvent.java | 2 +- .../common/scripting/ScriptManager.java | 14 +++++------ .../photonvision/common/util/Platform.java | 6 ++++- .../common/util/SerializationUtils.java | 5 ++-- .../common/util/file/FileUtils.java | 2 +- .../photonvision/server/SocketHandler.java | 8 +++---- .../server/UIOutboundSubscriber.java | 3 +-- .../vision/camera/USBCameraSource.java | 3 +-- .../vision/pipe/impl/Calibrate3dPipe.java | 2 +- .../vision/pipe/impl/SolvePNPPipe.java | 6 ++++- .../vision/processes/VisionModule.java | 10 ++++---- 17 files changed, 74 insertions(+), 57 deletions(-) diff --git a/photon-server/src/main/java/org/photonvision/Main.java b/photon-server/src/main/java/org/photonvision/Main.java index a0d426a3b..bbe542d74 100644 --- a/photon-server/src/main/java/org/photonvision/Main.java +++ b/photon-server/src/main/java/org/photonvision/Main.java @@ -40,11 +40,12 @@ public class Main { public static final int DEFAULT_WEBPORT = 5800; public static void main(String[] args) { - Logger.setLevel(LogGroup.Camera, LogLevel.TRACE); - Logger.setLevel(LogGroup.WebServer, LogLevel.TRACE); - Logger.setLevel(LogGroup.VisionModule, LogLevel.TRACE); - Logger.setLevel(LogGroup.Data, LogLevel.TRACE); - Logger.setLevel(LogGroup.General, LogLevel.TRACE); + var logLevel = PhotonVersion.isRelease ? LogLevel.ERROR : LogLevel.TRACE; + Logger.setLevel(LogGroup.Camera, logLevel); + Logger.setLevel(LogGroup.WebServer, logLevel); + Logger.setLevel(LogGroup.VisionModule, logLevel); + Logger.setLevel(LogGroup.Data, logLevel); + Logger.setLevel(LogGroup.General, logLevel); logger.info("Logging initialized!"); @@ -57,8 +58,7 @@ public class Main { logger.info("Loading native libraries..."); CameraServerCvJNI.forceLoad(); } catch (Exception e) { - logger.error("Failed to load native libraries!"); - e.printStackTrace(); // TODO: redirect stacktrace to Logger stream somehow + logger.error("Failed to load native libraries!", e); } logger.info("Native libaries loaded."); diff --git a/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java b/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java index b9e175ec8..841ebc2df 100644 --- a/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java +++ b/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java @@ -132,14 +132,12 @@ public class ConfigManager { try { JacksonUtils.serializer(hardwareConfigFile.toPath(), config.getHardwareConfig()); } catch (IOException e) { - logger.error("Could not save hardware config!"); - e.printStackTrace(); + logger.error("Could not save hardware config!", e); } try { JacksonUtils.serializer(networkConfigFile.toPath(), config.getNetworkConfig()); } catch (IOException e) { - logger.error("Could not save network config!"); - e.printStackTrace(); + logger.error("Could not save network config!", e); } // save all of our cameras @@ -172,8 +170,7 @@ public class ConfigManager { if (pipelineFolder.toFile().exists()) Files.list(pipelineFolder).map(Path::toFile).filter(File::exists).forEach(File::delete); } catch (IOException e) { - logger.error("Exception while deleting old configs!"); - e.printStackTrace(); + logger.error("Exception while deleting old configs!", e); } for (var pipe : camConfig.pipelineSettings) { @@ -187,7 +184,7 @@ public class ConfigManager { try { JacksonUtils.serializer(pipePath, pipe); } catch (IOException e) { - logger.error("Could not save " + pipe.pipelineNickname + ".json!"); + logger.error("Could not save " + pipe.pipelineNickname + ".json!", e); } } } @@ -209,7 +206,7 @@ public class ConfigManager { JacksonUtils.deserialize( cameraConfigPath.toAbsolutePath(), CameraConfiguration.class); } catch (JsonProcessingException e) { - e.printStackTrace(); + logger.error("Camera config deserialization failed!", e); } if (loadedConfig == null) { // If the file could not be deserialized logger.warn("Could not load camera " + subdir + "'s config.json! Loading " + "default"); @@ -250,8 +247,7 @@ public class ConfigManager { try { return JacksonUtils.deserialize(p, CVPipelineSettings.class); } catch (JsonProcessingException e) { - logger.error("Exception while deserializing " + relativizedFilePath); - e.printStackTrace(); + logger.error("Exception while deserializing " + relativizedFilePath, e); } catch (IOException e) { logger.warn( "Could not load pipeline at " @@ -270,7 +266,7 @@ public class ConfigManager { loadedConfigurations.put(subdir.toFile().getName(), loadedConfig); } } catch (IOException e) { - e.printStackTrace(); + logger.error("Error loading camera configs!", e); } return loadedConfigurations; } diff --git a/photon-server/src/main/java/org/photonvision/common/dataflow/DataChangeService.java b/photon-server/src/main/java/org/photonvision/common/dataflow/DataChangeService.java index 189a75ee5..e2dedfb3c 100644 --- a/photon-server/src/main/java/org/photonvision/common/dataflow/DataChangeService.java +++ b/photon-server/src/main/java/org/photonvision/common/dataflow/DataChangeService.java @@ -67,8 +67,7 @@ public class DataChangeService { } } } catch (Exception e) { - logger.error("Exception when dispatching event!"); - e.printStackTrace(); + logger.error("Exception when dispatching event!", e); } } } diff --git a/photon-server/src/main/java/org/photonvision/common/logging/Logger.java b/photon-server/src/main/java/org/photonvision/common/logging/Logger.java index bf13d1485..4a0e3070f 100644 --- a/photon-server/src/main/java/org/photonvision/common/logging/Logger.java +++ b/photon-server/src/main/java/org/photonvision/common/logging/Logger.java @@ -18,6 +18,8 @@ package org.photonvision.common.logging; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousFileChannel; import java.nio.file.Path; @@ -33,6 +35,7 @@ import org.photonvision.common.dataflow.events.OutgoingUIEvent; import org.photonvision.server.SocketHandler; import org.photonvision.server.UIUpdateType; +@SuppressWarnings("unused") public class Logger { public static final String ANSI_RESET = "\u001B[0m"; @@ -85,8 +88,8 @@ public class Logger { return builder.toString(); } - private static HashMap levelMap = new HashMap<>(); - private static List currentAppenders = new ArrayList<>(); + private static final HashMap levelMap = new HashMap<>(); + private static final List currentAppenders = new ArrayList<>(); static { levelMap.put(LogGroup.Camera, LogLevel.INFO); @@ -101,6 +104,7 @@ public class Logger { currentAppenders.add(new UILogAppender()); } + @SuppressWarnings("ResultOfMethodCallIgnored") public static void addFileAppender(Path logFilePath) { var file = logFilePath.toFile(); if (!file.exists()) { @@ -151,6 +155,11 @@ public class Logger { log(message, LogLevel.ERROR); } + public void error(String message, Throwable t) { + log(message, LogLevel.ERROR); + log(convertStackTraceToString(t), LogLevel.ERROR); + } + public void warn(Supplier messageSupplier) { log(messageSupplier, LogLevel.WARN); } @@ -183,6 +192,16 @@ public class Logger { log(message, LogLevel.TRACE); } + private static String convertStackTraceToString(Throwable throwable) { + try (StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw)) { + throwable.printStackTrace(pw); + return sw.toString(); + } catch (IOException ioe) { + throw new IllegalStateException(ioe); + } + } + private interface LogAppender { void log(String message, LogLevel level); } diff --git a/photon-server/src/main/java/org/photonvision/common/networking/LinuxNetworking.java b/photon-server/src/main/java/org/photonvision/common/networking/LinuxNetworking.java index fabe464d2..1082f0b79 100644 --- a/photon-server/src/main/java/org/photonvision/common/networking/LinuxNetworking.java +++ b/photon-server/src/main/java/org/photonvision/common/networking/LinuxNetworking.java @@ -61,7 +61,7 @@ public class LinuxNetworking extends SysNetworking { } } } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to set DHCP!", e); return false; } @@ -78,7 +78,7 @@ public class LinuxNetworking extends SysNetworking { var setHostnameRetCode = shell.execute("hostnamectl", "set-hostname", newHostname); return setHostnameRetCode == 0; } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to set hostname!", e); return false; } } @@ -97,7 +97,7 @@ public class LinuxNetworking extends SysNetworking { FileUtils.writeLines(dhcpConf, lines); return true; } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to set Static IP!", e); } return false; } diff --git a/photon-server/src/main/java/org/photonvision/common/networking/NetworkInterface.java b/photon-server/src/main/java/org/photonvision/common/networking/NetworkInterface.java index 6453f548a..f3e58177d 100644 --- a/photon-server/src/main/java/org/photonvision/common/networking/NetworkInterface.java +++ b/photon-server/src/main/java/org/photonvision/common/networking/NetworkInterface.java @@ -18,9 +18,13 @@ package org.photonvision.common.networking; import java.net.InterfaceAddress; +import org.photonvision.common.logging.LogGroup; +import org.photonvision.common.logging.Logger; @SuppressWarnings("WeakerAccess") public class NetworkInterface { + private static final Logger logger = new Logger(NetworkInterface.class, LogGroup.General); + public final String name; public final String displayName; public final String IPAddress; @@ -68,7 +72,7 @@ public class NetworkInterface { + (shiftby & 255); // return InetAddress.getByName(maskString); } catch (Exception e) { - e.printStackTrace(); + logger.error("Failed to get netmask!", e); } // Something went wrong here... return null; diff --git a/photon-server/src/main/java/org/photonvision/common/scripting/ScriptEvent.java b/photon-server/src/main/java/org/photonvision/common/scripting/ScriptEvent.java index 18b01dd42..841aa3f7f 100644 --- a/photon-server/src/main/java/org/photonvision/common/scripting/ScriptEvent.java +++ b/photon-server/src/main/java/org/photonvision/common/scripting/ScriptEvent.java @@ -39,7 +39,7 @@ public class ScriptEvent { String error = executor.getError(); if (!error.isEmpty()) { - System.err.printf("Error when running \"%s\" script: %s\n", config.eventType.name(), error); + logger.error("Error when running \"" + config.eventType.name() + "\" script: " + error); } else if (!output.isEmpty()) { logger.info( String.format("Output from \"%s\" script: %s\n", config.eventType.name(), output)); diff --git a/photon-server/src/main/java/org/photonvision/common/scripting/ScriptManager.java b/photon-server/src/main/java/org/photonvision/common/scripting/ScriptManager.java index 885da4c84..0ac0ab884 100644 --- a/photon-server/src/main/java/org/photonvision/common/scripting/ScriptManager.java +++ b/photon-server/src/main/java/org/photonvision/common/scripting/ScriptManager.java @@ -51,7 +51,7 @@ public class ScriptManager { TimedTaskManager.getInstance().addTask("ScriptRunner", new ScriptRunner(), 10); } else { - System.err.println("Something went wrong initializing scripts! Events will not run."); + logger.error("Something went wrong initializing scripts! Events will not run."); } } @@ -61,7 +61,7 @@ public class ScriptManager { try { handleEvent(queuedEvents.takeFirst()); } catch (InterruptedException e) { - e.printStackTrace(); + logger.error("ScriptRunner queue interrupted!", e); } } @@ -76,9 +76,7 @@ public class ScriptManager { try { toRun.run(); } catch (IOException e) { - System.err.printf( - "Failed to run script for event: %s, exception below.\n%s\n", - eventType.name(), e.getMessage()); + logger.error("Failed to run script for event \"" + eventType.name() + "\"", e); } } } @@ -107,7 +105,7 @@ public class ScriptManager { JacksonUtils.serializer( scriptConfigPath, eventsConfig.toArray(new ScriptConfig[0]), true); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to initialize!", e); } } } @@ -119,7 +117,7 @@ public class ScriptManager { return List.of(raw); } } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to load scripting config!", e); } return new ArrayList<>(); } @@ -139,7 +137,7 @@ public class ScriptManager { queuedEvents.putLast(eventType); logger.info("Queued event: " + eventType.name()); } catch (InterruptedException e) { - System.err.println("Failed to add event to queue: " + eventType.name()); + logger.error("Failed to add event to queue: " + eventType.name(), e); } } } diff --git a/photon-server/src/main/java/org/photonvision/common/util/Platform.java b/photon-server/src/main/java/org/photonvision/common/util/Platform.java index 44691a1a8..aed98bfad 100644 --- a/photon-server/src/main/java/org/photonvision/common/util/Platform.java +++ b/photon-server/src/main/java/org/photonvision/common/util/Platform.java @@ -20,6 +20,8 @@ package org.photonvision.common.util; import edu.wpi.first.wpiutil.RuntimeDetector; import java.io.IOException; import org.apache.commons.lang3.SystemUtils; +import org.photonvision.common.logging.LogGroup; +import org.photonvision.common.logging.Logger; @SuppressWarnings("unused") public enum Platform { @@ -42,6 +44,8 @@ public enum Platform { this.value = value; } + private static final Logger logger = new Logger(Platform.class, LogGroup.General); + public static final Platform CurrentPlatform = getCurrentPlatform(); public static boolean isWindows() { @@ -64,7 +68,7 @@ public enum Platform { try { shell.execute("id", null, true, "-u"); } catch (IOException e) { - e.printStackTrace(); + logger.error("Failed to perform root check!", e); } while (!shell.isOutputCompleted()) { diff --git a/photon-server/src/main/java/org/photonvision/common/util/SerializationUtils.java b/photon-server/src/main/java/org/photonvision/common/util/SerializationUtils.java index e4d299361..b0f15721f 100644 --- a/photon-server/src/main/java/org/photonvision/common/util/SerializationUtils.java +++ b/photon-server/src/main/java/org/photonvision/common/util/SerializationUtils.java @@ -22,7 +22,7 @@ import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; public final class SerializationUtils { - private static final Logger LOGGER = new Logger(SerializationUtils.class, LogGroup.General); + private static final Logger logger = new Logger(SerializationUtils.class, LogGroup.General); public static HashMap objectToHashMap(Object src) { var ret = new HashMap(); @@ -37,8 +37,7 @@ public final class SerializationUtils { ret.put(field.getName(), ordinal.ordinal()); } } catch (IllegalArgumentException | IllegalAccessException e) { - LOGGER.error("Could not serialize " + src.getClass().getSimpleName()); - e.printStackTrace(); + logger.error("Could not serialize " + src.getClass().getSimpleName(), e); } } return ret; diff --git a/photon-server/src/main/java/org/photonvision/common/util/file/FileUtils.java b/photon-server/src/main/java/org/photonvision/common/util/file/FileUtils.java index 50023e8b8..ee591e189 100644 --- a/photon-server/src/main/java/org/photonvision/common/util/file/FileUtils.java +++ b/photon-server/src/main/java/org/photonvision/common/util/file/FileUtils.java @@ -63,7 +63,7 @@ public class FileUtils { p.waitFor(); } catch (Exception e) { - e.printStackTrace(); + logger.error("Setting perms failed!", e); } } else { logger.info("Cannot set directory permissions on Windows!"); diff --git a/photon-server/src/main/java/org/photonvision/server/SocketHandler.java b/photon-server/src/main/java/org/photonvision/server/SocketHandler.java index 810862f4f..ba2535b57 100644 --- a/photon-server/src/main/java/org/photonvision/server/SocketHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/SocketHandler.java @@ -272,14 +272,12 @@ public class SocketHandler { break; } } - } catch (Exception ex) { - logger.error("unknown booboo"); - ex.printStackTrace(); + } catch (Exception e) { + logger.error("Failed to parse message!", e); } } } catch (IOException e) { - // TODO: log - e.printStackTrace(); + logger.error("Failed to deserialize message!", e); } } diff --git a/photon-server/src/main/java/org/photonvision/server/UIOutboundSubscriber.java b/photon-server/src/main/java/org/photonvision/server/UIOutboundSubscriber.java index b4be58a88..f02dbe0a9 100644 --- a/photon-server/src/main/java/org/photonvision/server/UIOutboundSubscriber.java +++ b/photon-server/src/main/java/org/photonvision/server/UIOutboundSubscriber.java @@ -71,8 +71,7 @@ class UIOutboundSubscriber extends DataChangeSubscriber { } } } catch (JsonProcessingException e) { - // TODO: Log - e.printStackTrace(); + logger.error("Failed to process outgoing message!", e); } } } diff --git a/photon-server/src/main/java/org/photonvision/vision/camera/USBCameraSource.java b/photon-server/src/main/java/org/photonvision/vision/camera/USBCameraSource.java index b4e864794..5af19c92e 100644 --- a/photon-server/src/main/java/org/photonvision/vision/camera/USBCameraSource.java +++ b/photon-server/src/main/java/org/photonvision/vision/camera/USBCameraSource.java @@ -135,8 +135,7 @@ public class USBCameraSource implements VisionSource { videoModesList.add(videoMode); } } catch (Exception e) { - logger.error("Exception while enumerating video modes!"); - e.printStackTrace(); + logger.error("Exception while enumerating video modes!", e); videoModesList = List.of(); } for (VideoMode videoMode : videoModesList) { diff --git a/photon-server/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java b/photon-server/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java index b0f705e9c..ea35290d0 100644 --- a/photon-server/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java +++ b/photon-server/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java @@ -82,7 +82,7 @@ public class Calibrate3dPipe stdDeviationsExtrinsics, perViewErrors); } catch (Exception e) { - e.printStackTrace(); + logger.error("Calibration failed!", e); } JsonMat cameraMatrixMat = JsonMat.fromMat(cameraMatrix); JsonMat distortionCoefficientsMat = JsonMat.fromMat(distortionCoefficients); diff --git a/photon-server/src/main/java/org/photonvision/vision/pipe/impl/SolvePNPPipe.java b/photon-server/src/main/java/org/photonvision/vision/pipe/impl/SolvePNPPipe.java index 6a48afe68..e63e0dbde 100644 --- a/photon-server/src/main/java/org/photonvision/vision/pipe/impl/SolvePNPPipe.java +++ b/photon-server/src/main/java/org/photonvision/vision/pipe/impl/SolvePNPPipe.java @@ -27,6 +27,8 @@ import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint2f; import org.opencv.core.Scalar; +import org.photonvision.common.logging.LogGroup; +import org.photonvision.common.logging.Logger; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.pipe.CVPipe; import org.photonvision.vision.target.TargetModel; @@ -35,6 +37,8 @@ import org.photonvision.vision.target.TrackedTarget; public class SolvePNPPipe extends CVPipe, List, SolvePNPPipe.SolvePNPPipeParams> { + private static final Logger logger = new Logger(SolvePNPPipe.class, LogGroup.VisionModule); + private final MatOfPoint2f imagePoints = new MatOfPoint2f(); @Override @@ -68,7 +72,7 @@ public class SolvePNPPipe rVec, tVec); } catch (Exception e) { - e.printStackTrace(); + logger.error("Exception when attempting solvePnP!", e); return; } diff --git a/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java b/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java index 6842af61f..7fe9e10c6 100644 --- a/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java +++ b/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java @@ -197,8 +197,7 @@ public class VisionModule { try { method.invoke(visionSource.getSettables(), newPropValue); } catch (Exception e) { - logger.error("Failed to invoke camera settable method: " + method.getName()); - e.printStackTrace(); + logger.error("Failed to invoke camera settable method: " + method.getName(), e); } } } @@ -249,11 +248,10 @@ public class VisionModule { + " with value " + newPropValue + " on " - + currentSettings); - e.printStackTrace(); + + currentSettings, + e); } catch (Exception e) { - logger.error("Unknown exception when setting PSC prop!"); - e.printStackTrace(); + logger.error("Unknown exception when setting PSC prop!", e); } saveModule();