[tor-commits] [metrics-web/release] Replace System.{out|err} calls with proper logging.

karsten at torproject.org karsten at torproject.org
Wed Sep 26 15:20:35 UTC 2018


commit 344f7a5da0436ded44eb49fd0874473aa6b18b1a
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Mon Aug 20 21:51:29 2018 +0200

    Replace System.{out|err} calls with proper logging.
---
 .../org/torproject/metrics/stats/clients/Main.java |  9 ++-
 .../metrics/stats/connbidirect/Main.java           | 80 +++++++++++-----------
 .../metrics/stats/hidserv/Aggregator.java          | 11 ++-
 .../stats/hidserv/ComputedNetworkFractions.java    | 19 ++---
 .../metrics/stats/hidserv/DocumentStore.java       | 40 ++++++-----
 .../stats/hidserv/ExtrapolatedHidServStats.java    | 13 +++-
 .../metrics/stats/hidserv/Extrapolator.java        |  9 ++-
 .../org/torproject/metrics/stats/hidserv/Main.java | 21 +++---
 .../torproject/metrics/stats/hidserv/Parser.java   | 30 ++++----
 .../stats/hidserv/ReportedHidServStats.java        |  9 ++-
 .../torproject/metrics/stats/hidserv/Simulate.java | 16 +++--
 .../org/torproject/metrics/web/UpdateNews.java     |  9 ++-
 12 files changed, 160 insertions(+), 106 deletions(-)

diff --git a/src/main/java/org/torproject/metrics/stats/clients/Main.java b/src/main/java/org/torproject/metrics/stats/clients/Main.java
index 4f083b9..3ccfe96 100644
--- a/src/main/java/org/torproject/metrics/stats/clients/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/clients/Main.java
@@ -12,6 +12,9 @@ import org.torproject.descriptor.ExtraInfoDescriptor;
 import org.torproject.descriptor.NetworkStatusEntry;
 import org.torproject.descriptor.RelayNetworkStatusConsensus;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -25,6 +28,8 @@ import java.util.TreeMap;
 
 public class Main {
 
+  private static Logger log = LoggerFactory.getLogger(Main.class);
+
   /** Executes this data-processing module. */
   public static void main(String[] args) throws Exception {
     parseArgs(args);
@@ -46,8 +51,8 @@ public class Main {
       writeToSingleFile = false;
       byStatsDateNotByDescHour = false;
     } else {
-      System.err.println("Usage: java " + Main.class.getName()
-          + " [ --stats-date | --desc-hour ]");
+      log.warn("Usage: java {} [ --stats-date | --desc-hour ]",
+          Main.class.getName());
       System.exit(1);
     }
   }
diff --git a/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java b/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
index 4474966..c4f1b34 100644
--- a/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/connbidirect/Main.java
@@ -8,6 +8,9 @@ import org.torproject.descriptor.DescriptorReader;
 import org.torproject.descriptor.DescriptorSourceFactory;
 import org.torproject.descriptor.ExtraInfoDescriptor;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -30,6 +33,8 @@ import java.util.TreeSet;
 
 public class Main {
 
+  private static Logger log = LoggerFactory.getLogger(Main.class);
+
   static class RawStat implements Comparable<RawStat> {
 
     /* Date when the statistics interval ended in days since the epoch. */
@@ -73,13 +78,13 @@ public class Main {
           return new RawStat(dateDays, fingerprint, fractionRead,
               fractionWrite, fractionBoth);
         } else {
-          System.err.println("Could not deserialize raw statistic from "
-              + "string '" + string + "'.");
+          log.warn("Could not deserialize raw statistic from string '" + string
+              + "'.");
           return null;
         }
       } catch (NumberFormatException e) {
-        System.err.println("Could not deserialize raw statistic from "
-            + "string '" + string + "'.");
+        log.warn("Could not deserialize raw statistic from string '{}'.",
+            string, e);
         return null;
       }
     }
@@ -133,14 +138,13 @@ public class Main {
     SortedMap<String, Long> parseHistory = parseParseHistory(
         readStringFromFile(parseHistoryFile));
     if (parseHistory == null) {
-      System.err.println("Could not parse "
-          + parseHistoryFile.getAbsolutePath() + ".  Proceeding without "
-          + "parse history.");
+      log.warn("Could not parse {}. Proceeding without parse history.",
+          parseHistoryFile.getAbsolutePath());
     }
     SortedMap<String, Short> aggregateStats = parseAggregateStats(
         readStringFromFile(aggregateStatsFile));
     if (aggregateStats == null) {
-      System.err.println("Could not parse previously aggregated "
+      log.warn("Could not parse previously aggregated "
           + "statistics.  Not proceeding, because we would otherwise "
           + "lose previously aggregated values for which we don't have "
           + "raw statistics anymore.");
@@ -150,7 +154,7 @@ public class Main {
     parseHistory = addRawStatsFromDescriptors(newRawStats,
         descriptorsDirectories, parseHistory);
     if (parseHistory == null) {
-      System.err.println("Could not parse raw statistics from "
+      log.warn("Could not parse raw statistics from "
           + "descriptors.  Not proceeding, because we would otherwise "
           + "leave out those descriptors in future runs.");
       return;
@@ -159,7 +163,7 @@ public class Main {
     SortedSet<RawStat> rawStats = parseRawStats(
         readStringFromFile(rawStatsFile));
     if (rawStats == null) {
-      System.err.println("Could not parse previously parsed raw "
+      log.warn("Could not parse previously parsed raw "
           + "statistics.  Not proceeding, because we might otherwise "
           + "leave out previously parsed statistics in the aggregates.");
       return;
@@ -167,7 +171,8 @@ public class Main {
     SortedSet<Long> conflictingDates = mergeRawStats(rawStats,
         newRawStats);
     if (!conflictingDates.isEmpty()) {
-      System.err.print("Could not update aggregate statistics, because "
+      StringBuilder sb = new StringBuilder(
+          "Could not update aggregate statistics, because "
           + "we already aggregated statistics for at least one contained "
           + "date and discarded the underlying raw statistics.  Not "
           + "proceeding.  To fix this, you'll have to re-import "
@@ -175,10 +180,10 @@ public class Main {
       DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
       dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
       for (long conflictingDate : conflictingDates) {
-        System.err.print(" " + dateFormat.format(conflictingDate
-            * ONE_DAY_IN_MILLIS));
+        sb.append("\n "
+            + dateFormat.format(conflictingDate * ONE_DAY_IN_MILLIS));
       }
-      System.err.println();
+      log.warn(sb.toString());
       return;
     }
     updateAggregateStats(aggregateStats, rawStats);
@@ -237,20 +242,19 @@ public class Main {
       while ((line = lnr.readLine()) != null) {
         String[] parts = line.split(",");
         if (parts.length < 2) {
-          System.err.println("Invalid line " + lnr.getLineNumber()
-              + " in parse history: '" + line + "'.");
+          log.warn("Invalid line {} in parse history: '{}'.",
+              lnr.getLineNumber(), line);
           return null;
         }
         parsedParseHistory.put(parts[0], Long.parseLong(parts[1]));
       }
     } catch (IOException e) {
-      System.err.println("Unexpected I/O exception while reading line "
-          + lnr.getLineNumber() + " from parse history.");
-      e.printStackTrace();
+      log.warn("Unexpected I/O exception while reading line {} from parse "
+          + "history.", lnr.getLineNumber(), e);
       return null;
     } catch (NumberFormatException e) {
-      System.err.println("Invalid line " + lnr.getLineNumber()
-          + " in parse history: '" + line + "'.");
+      log.warn("Invalid line {} in parse history: '{}'.", lnr.getLineNumber(),
+          line, e);
       return null;
     }
     return parsedParseHistory;
@@ -285,28 +289,27 @@ public class Main {
     String line = "";
     try {
       if (!AGGREGATE_STATS_HEADER.equals(lnr.readLine())) {
-        System.err.println("First line of aggregate statistics does not "
-            + "contain the header line.  Is this the correct file?");
+        log.warn("First line of aggregate statistics does not "
+            + "contain the header line. Is this the correct file?");
         return null;
       }
       while ((line = lnr.readLine()) != null) {
         String[] parts = line.split(",");
         if (parts.length != 4) {
-          System.err.println("Invalid line " + lnr.getLineNumber()
-              + " in aggregate statistics: '" + line + "'.");
+          log.warn("Invalid line {} in aggregate statistics: '{}'.",
+              lnr.getLineNumber(), line);
           return null;
         }
         parsedAggregateStats.put(parts[0] + "," + parts[1] + ","
             + parts[2], Short.parseShort(parts[3]));
       }
     } catch (IOException e) {
-      System.err.println("Unexpected I/O exception while reading line "
-          + lnr.getLineNumber() + " from aggregate statistics.");
-      e.printStackTrace();
+      log.warn("Unexpected I/O exception while reading line {} from aggregate "
+          + "statistics.", lnr.getLineNumber(), e);
       return null;
     } catch (NumberFormatException e) {
-      System.err.println("Invalid line " + lnr.getLineNumber()
-          + " in aggregate statistics: '" + line + "'.");
+      log.warn("Invalid line {} in aggregate statistics: '{}'.",
+          lnr.getLineNumber(), line, e);
       return null;
     }
     return parsedAggregateStats;
@@ -332,20 +335,19 @@ public class Main {
       while ((line = lnr.readLine()) != null) {
         RawStat rawStat = RawStat.fromString(line);
         if (rawStat == null) {
-          System.err.println("Invalid line " + lnr.getLineNumber()
-              + " in raw statistics: '" + line + "'.");
+          log.warn("Invalid line {} in raw statistics: '{}'.",
+              lnr.getLineNumber(), line);
           return null;
         }
         parsedRawStats.add(rawStat);
       }
     } catch (IOException e) {
-      System.err.println("Unexpected I/O exception while reading line "
-          + lnr.getLineNumber() + " from raw statistics.");
-      e.printStackTrace();
+      log.warn("Unexpected I/O exception while reading line {} from raw "
+          + "statistics.", lnr.getLineNumber(), e);
       return null;
     } catch (NumberFormatException e) {
-      System.err.println("Invalid line " + lnr.getLineNumber()
-          + " in raw statistics: '" + line + "'.");
+      log.warn("Invalid line {} in raw statistics: '{}'.", lnr.getLineNumber(),
+          line, e);
       return null;
     }
     return parsedRawStats;
@@ -384,8 +386,8 @@ public class Main {
     int write = extraInfo.getConnBiDirectWrite();
     int both = extraInfo.getConnBiDirectBoth();
     if (below < 0 || read < 0 || write < 0 || both < 0) {
-      System.err.println("Could not parse incomplete conn-bi-direct "
-          + "statistics.  Skipping descriptor.");
+      log.debug("Could not parse incomplete conn-bi-direct statistics. "
+          + "Skipping descriptor.");
       return null;
     }
     long statsEndMillis = extraInfo.getConnBiDirectStatsEndMillis();
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Aggregator.java b/src/main/java/org/torproject/metrics/stats/hidserv/Aggregator.java
index 9ef3ee8..14fc31f 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Aggregator.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Aggregator.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -21,6 +24,8 @@ import java.util.TreeMap;
  * statistics and the total network fraction of reporting relays. */
 public class Aggregator {
 
+  private static Logger log = LoggerFactory.getLogger(Aggregator.class);
+
   /** Document file containing extrapolated hidden-service statistics. */
   private File extrapolatedHidServStatsFile;
 
@@ -57,8 +62,8 @@ public class Aggregator {
         this.extrapolatedHidServStatsStore.retrieve(
         this.extrapolatedHidServStatsFile);
     if (extrapolatedStats == null) {
-      System.err.printf("Unable to retrieve extrapolated hidden-service "
-          + "statistics from file %s.  Skipping aggregation step.%n",
+      log.warn("Unable to retrieve extrapolated hidden-service "
+          + "statistics from file {}. Skipping aggregation step.",
           this.extrapolatedHidServStatsFile.getAbsolutePath());
       return;
     }
@@ -187,7 +192,7 @@ public class Aggregator {
         this.hidservStatsCsvFile))) {
       bw.write(sb.toString());
     } catch (IOException e) {
-      System.err.printf("Unable to write results to %s.  Ignoring.",
+      log.warn("Unable to write results to {}. Ignoring.",
           this.extrapolatedHidServStatsFile.getAbsolutePath());
     }
   }
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/ComputedNetworkFractions.java b/src/main/java/org/torproject/metrics/stats/hidserv/ComputedNetworkFractions.java
index 64547cc..d5fd279 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/ComputedNetworkFractions.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/ComputedNetworkFractions.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -12,6 +15,9 @@ import java.util.Map;
  * status entries and bandwidth weights in a network status consensus. */
 public class ComputedNetworkFractions implements Document {
 
+  private static Logger log
+      = LoggerFactory.getLogger(ComputedNetworkFractions.class);
+
   /** Relay fingerprint consisting of 40 upper-case hex characters. */
   private String fingerprint;
 
@@ -131,21 +137,18 @@ public class ComputedNetworkFractions implements Document {
   @Override
   public boolean parse(String[] formattedStrings) {
     if (formattedStrings.length != 2) {
-      System.err.printf("Invalid number of formatted strings.  "
-          + "Skipping.%n");
+      log.warn("Invalid number of formatted strings. Skipping.");
       return false;
     }
     String[] firstParts = formattedStrings[0].split(",", 2);
     if (firstParts.length != 2) {
-      System.err.printf("Invalid number of comma-separated values.  "
-          + "Skipping.%n");
+      log.warn("Invalid number of comma-separated values. Skipping.");
       return false;
     }
     String fingerprint = firstParts[0];
     String[] secondParts = formattedStrings[1].split(",", 3);
     if (secondParts.length != 3) {
-      System.err.printf("Invalid number of comma-separated values.  "
-          + "Skipping.%n");
+      log.warn("Invalid number of comma-separated values. Skipping.");
       return false;
     }
     String validAfterDate = firstParts[1];
@@ -163,7 +166,7 @@ public class ComputedNetworkFractions implements Document {
     if (validAfterDateMillis == DateTimeHelper.NO_TIME_AVAILABLE
         || validAfterTimeMillis < 0L
         || validAfterTimeMillis >= DateTimeHelper.ONE_DAY) {
-      System.err.printf("Invalid date/hour format.  Skipping.%n");
+      log.warn("Invalid date/hour format. Skipping.");
       return false;
     }
     long validAfterMillis = validAfterDateMillis + validAfterTimeMillis;
@@ -176,7 +179,7 @@ public class ComputedNetworkFractions implements Document {
           ? 0.0 : Double.parseDouble(secondParts[2]);
       return true;
     } catch (NumberFormatException e) {
-      System.err.printf("Invalid number format.  Skipping.%n");
+      log.warn("Invalid number format. Skipping.");
       return false;
     }
   }
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/DocumentStore.java b/src/main/java/org/torproject/metrics/stats/hidserv/DocumentStore.java
index 118071e..f73812a 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/DocumentStore.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/DocumentStore.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -22,6 +25,8 @@ import java.util.TreeSet;
  * interface to a file and later to retrieve them. */
 public class DocumentStore<T extends Document> {
 
+  private static Logger log = LoggerFactory.getLogger(DocumentStore.class);
+
   /** Document class, needed to create new instances when retrieving
    * documents. */
   private Class<T> clazz;
@@ -41,8 +46,8 @@ public class DocumentStore<T extends Document> {
     /* Retrieve existing documents. */
     Set<T> retrievedDocuments = this.retrieve(documentFile);
     if (retrievedDocuments == null) {
-      System.err.printf("Unable to read and update %s.  Not storing "
-          + "documents.%n", documentFile.getAbsoluteFile());
+      log.warn("Unable to read and update {}. Not storing documents.",
+          documentFile.getAbsoluteFile());
       return false;
     }
 
@@ -64,9 +69,9 @@ public class DocumentStore<T extends Document> {
     File documentTempFile = new File(documentFile.getAbsoluteFile()
         + ".tmp");
     if (documentTempFile.exists()) {
-      System.err.printf("Temporary document file %s still exists, "
+      log.warn("Temporary document file {} still exists, "
           + "indicating that a previous execution did not terminate "
-          + "cleanly.  Not storing documents.%n",
+          + "cleanly.  Not storing documents.",
           documentTempFile.getAbsoluteFile());
       return false;
     }
@@ -86,8 +91,8 @@ public class DocumentStore<T extends Document> {
       documentFile.delete();
       documentTempFile.renameTo(documentFile);
     } catch (IOException e) {
-      System.err.printf("Unable to write %s.  Not storing documents.%n",
-          documentFile.getAbsolutePath());
+      log.warn("Unable to write {}. Not storing documents.",
+          documentFile.getAbsolutePath(), e);
       return false;
     }
 
@@ -121,9 +126,9 @@ public class DocumentStore<T extends Document> {
         if (!line.startsWith(" ")) {
           formattedString0 = line;
         } else if (formattedString0 == null) {
-          System.err.printf("First line in %s must not start with a "
-              + "space.  Not retrieving any previously stored "
-              + "documents.%n", documentFile.getAbsolutePath());
+          log.warn("First line in {} must not start with a space. Not "
+              + "retrieving any previously stored documents.",
+              documentFile.getAbsolutePath());
           return null;
         } else if (prefix.length() > formattedString0.length()
             && !(formattedString0 + line.substring(1))
@@ -138,24 +143,21 @@ public class DocumentStore<T extends Document> {
           T document = this.clazz.newInstance();
           if (!document.parse(new String[] { formattedString0,
               line.substring(1) })) {
-            System.err.printf("Unable to read line %d from %s.  Not "
-                + "retrieving any previously stored documents.%n",
-                lnr.getLineNumber(), documentFile.getAbsolutePath());
+            log.warn("Unable to read line {} from {}. Not retrieving any "
+                + "previously stored documents.", lnr.getLineNumber(),
+                documentFile.getAbsolutePath());
             return null;
           }
           result.add(document);
         }
       }
     } catch (IOException e) {
-      System.err.printf("Unable to read %s.  Not retrieving any "
-          + "previously stored documents.%n",
-          documentFile.getAbsolutePath());
-      e.printStackTrace();
+      log.warn("Unable to read {}. Not retrieving any previously stored "
+          + "documents.", documentFile.getAbsolutePath(), e);
       return null;
     } catch (InstantiationException | IllegalAccessException e) {
-      System.err.printf("Unable to read %s.  Cannot instantiate document "
-          + "object.%n", documentFile.getAbsolutePath());
-      e.printStackTrace();
+      log.warn("Unable to read {}. Cannot instantiate document object.",
+          documentFile.getAbsolutePath(), e);
       return null;
     }
     return result;
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/ExtrapolatedHidServStats.java b/src/main/java/org/torproject/metrics/stats/hidserv/ExtrapolatedHidServStats.java
index 9379d87..ec09630 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/ExtrapolatedHidServStats.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/ExtrapolatedHidServStats.java
@@ -3,11 +3,17 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /** Extrapolated network totals of hidden-service statistics reported by a
  * single relay.  Extrapolated values are based on reported statistics and
  * computed network fractions in the statistics interval. */
 public class ExtrapolatedHidServStats implements Document {
 
+  private static Logger log
+      = LoggerFactory.getLogger(ExtrapolatedHidServStats.class);
+
   /** Date of statistics interval end in milliseconds. */
   private long statsDateMillis;
 
@@ -130,15 +136,16 @@ public class ExtrapolatedHidServStats implements Document {
   @Override
   public boolean parse(String[] formattedStrings) {
     if (formattedStrings.length != 2) {
-      System.err.printf("Invalid number of formatted strings.  Skipping.%n");
+      log.warn("Invalid number of formatted strings: {}. Skipping.",
+          formattedStrings.length);
       return false;
     }
     long statsDateMillis = DateTimeHelper.parse(formattedStrings[0],
         DateTimeHelper.ISO_DATE_FORMAT);
     String[] secondParts = formattedStrings[1].split(",", 5);
     if (secondParts.length != 5) {
-      System.err.printf("Invalid number of comma-separated values.  "
-          + "Skipping.%n");
+      log.warn("Invalid number of comma-separated values: {}. Skipping.",
+          secondParts.length);
       return false;
     }
     String fingerprint = secondParts[0];
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Extrapolator.java b/src/main/java/org/torproject/metrics/stats/hidserv/Extrapolator.java
index 4bce0e6..2c4a8f8 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Extrapolator.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Extrapolator.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.File;
 import java.util.HashSet;
 import java.util.Map;
@@ -17,6 +20,8 @@ import java.util.TreeSet;
  * observed by the relay. */
 public class Extrapolator {
 
+  private static Logger log = LoggerFactory.getLogger(Extrapolator.class);
+
   /** Document file containing previously parsed reported hidden-service
    * statistics. */
   private File reportedHidServStatsFile;
@@ -84,8 +89,8 @@ public class Extrapolator {
 
     /* Make sure that all documents could be retrieved correctly. */
     if (extrapolatedStats == null || reportedStats == null) {
-      System.err.printf("Could not read previously parsed or "
-          + "extrapolated hidserv-stats.  Skipping.");
+      log.warn("Could not read previously parsed or extrapolated "
+          + "hidserv-stats. Skipping.");
       return false;
     }
 
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Main.java b/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
index eafeeb1..b6a4e43 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Main.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.File;
 
 /** Main class for updating extrapolated network totals of hidden-service
@@ -11,6 +14,8 @@ import java.io.File;
  * do not overlap. */
 public class Main {
 
+  private static Logger log = LoggerFactory.getLogger(Main.class);
+
   /** Parses new descriptors, extrapolate contained statistics using
    * computed network fractions, aggregate results, and writes results to
    * disk. */
@@ -24,8 +29,7 @@ public class Main {
 
     /* Initialize parser and read parse history to avoid parsing
      * descriptor files that haven't changed since the last execution. */
-    System.out.println("Initializing parser and reading parse "
-        + "history...");
+    log.info("Initializing parser and reading parse history...");
     DocumentStore<ReportedHidServStats> reportedHidServStatsStore =
         new DocumentStore<>(ReportedHidServStats.class);
     DocumentStore<ComputedNetworkFractions>
@@ -37,29 +41,28 @@ public class Main {
 
     /* Parse new descriptors and store their contents using the document
      * stores. */
-    System.out.println("Parsing descriptors...");
+    log.info("Parsing descriptors...");
     parser.parseDescriptors();
 
     /* Write the parse history to avoid parsing descriptor files again
      * next time.  It's okay to do this now and not at the end of the
      * execution, because even if something breaks apart below, it's safe
      * not to parse descriptor files again. */
-    System.out.println("Writing parse history...");
+    log.info("Writing parse history...");
     parser.writeParseHistory();
 
     /* Extrapolate reported statistics using computed network fractions
      * and write the result to disk using a document store.  The result is
      * a single file with extrapolated network totals based on reports by
      * single relays. */
-    System.out.println("Extrapolating statistics...");
+    log.info("Extrapolating statistics...");
     DocumentStore<ExtrapolatedHidServStats> extrapolatedHidServStatsStore
         = new DocumentStore<>(ExtrapolatedHidServStats.class);
     Extrapolator extrapolator = new Extrapolator(statusDirectory,
         reportedHidServStatsStore, computedNetworkFractionsStore,
         extrapolatedHidServStatsStore);
     if (!extrapolator.extrapolateHidServStats()) {
-      System.err.println("Could not extrapolate statistics.  "
-          + "Terminating.");
+      log.warn("Could not extrapolate statistics. Terminating.");
       return;
     }
 
@@ -67,14 +70,14 @@ public class Main {
      * This includes calculating daily weighted interquartile means, among
      * other statistics.  Write the result to a .csv file that can be
      * processed by other tools. */
-    System.out.println("Aggregating statistics...");
+    log.info("Aggregating statistics...");
     File hidservStatsExtrapolatedCsvFile = new File("stats/hidserv.csv");
     Aggregator aggregator = new Aggregator(statusDirectory,
         extrapolatedHidServStatsStore, hidservStatsExtrapolatedCsvFile);
     aggregator.aggregateHidServStats();
 
     /* End this execution. */
-    System.out.println("Terminating.");
+    log.info("Terminating.");
   }
 }
 
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Parser.java b/src/main/java/org/torproject/metrics/stats/hidserv/Parser.java
index 9c95db5..4f7ac6c 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Parser.java
@@ -10,6 +10,9 @@ import org.torproject.descriptor.ExtraInfoDescriptor;
 import org.torproject.descriptor.NetworkStatusEntry;
 import org.torproject.descriptor.RelayNetworkStatusConsensus;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -32,6 +35,8 @@ import java.util.TreeSet;
  * document files for later use. */
 public class Parser {
 
+  private static Logger log = LoggerFactory.getLogger(Parser.class);
+
   /** File containing tuples of last-modified times and file names of
    * descriptor files parsed in the previous execution. */
   private File parseHistoryFile;
@@ -106,14 +111,14 @@ public class Parser {
             String[] parts = line.split(" ", 2);
             excludedFiles.put(parts[1], Long.parseLong(parts[0]));
           } catch (NumberFormatException e) {
-            System.err.printf("Illegal line '%s' in parse history.  "
-                + "Skipping line.%n", line);
+            log.warn("Illegal line '{}' in parse history. Skipping line.", line,
+                e);
           }
         }
       } catch (IOException e) {
-        System.err.printf("Could not read history file '%s'.  Not "
+        log.warn("Could not read history file '{}'. Not "
             + "excluding descriptors in this execution.",
-            this.parseHistoryFile.getAbsolutePath());
+            this.parseHistoryFile.getAbsolutePath(), e);
       }
 
       /* Tell the descriptor reader to exclude the files contained in the
@@ -146,9 +151,8 @@ public class Parser {
             + "\n");
       }
     } catch (IOException e) {
-      System.err.printf("Could not write history file '%s'.  Not "
-          + "excluding descriptors in next execution.",
-          this.parseHistoryFile.getAbsolutePath());
+      log.warn("Could not write history file '{}'. Not excluding descriptors "
+          + "in next execution.", this.parseHistoryFile.getAbsolutePath(), e);
     }
   }
 
@@ -234,8 +238,8 @@ public class Parser {
      * because relays can in theory write anything in their extra-info
      * descriptors.  But maybe we'll want to know. */
     } else {
-      System.err.println("Relay " + fingerprint + " published "
-          + "incomplete hidserv-stats.  Ignoring.");
+      log.warn("Relay {} published incomplete hidserv-stats. Ignoring.",
+          fingerprint);
     }
   }
 
@@ -257,8 +261,8 @@ public class Parser {
     SortedMap<String, Integer> bandwidthWeights =
         consensus.getBandwidthWeights();
     if (bandwidthWeights == null) {
-      System.err.printf("Consensus with valid-after time %s doesn't "
-          + "contain any Wxx weights.  Skipping.%n",
+      log.warn("Consensus with valid-after time {} doesn't contain any Wxx "
+          + "weights. Skipping.",
           DateTimeHelper.format(consensus.getValidAfterMillis()));
       return;
     }
@@ -269,8 +273,8 @@ public class Parser {
         new TreeSet<>(Arrays.asList("Wmg,Wmm,Wme,Wmd".split(",")));
     expectedWeightKeys.removeAll(bandwidthWeights.keySet());
     if (!expectedWeightKeys.isEmpty()) {
-      System.err.printf("Consensus with valid-after time %s doesn't "
-          + "contain expected Wmx weights.  Skipping.%n",
+      log.warn("Consensus with valid-after time {} doesn't contain expected "
+          + "Wmx weights. Skipping.",
           DateTimeHelper.format(consensus.getValidAfterMillis()));
       return;
     }
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/ReportedHidServStats.java b/src/main/java/org/torproject/metrics/stats/hidserv/ReportedHidServStats.java
index 08ab024..58abbf7 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/ReportedHidServStats.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/ReportedHidServStats.java
@@ -3,11 +3,17 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /* Hidden-service statistics reported by a single relay covering a single
  * statistics interval of usually 24 hours.  These statistics are reported
  * by the relay in the "hidserv-" lines of its extra-info descriptor. */
 public class ReportedHidServStats implements Document {
 
+  private static Logger log
+      = LoggerFactory.getLogger(ReportedHidServStats.class);
+
   /* Relay fingerprint consisting of 40 upper-case hex characters. */
   private String fingerprint;
 
@@ -109,7 +115,8 @@ public class ReportedHidServStats implements Document {
   @Override
   public boolean parse(String[] formattedStrings) {
     if (formattedStrings.length != 2) {
-      System.err.printf("Invalid number of formatted strings.  Skipping.%n");
+      log.warn("Invalid number of formatted strings: {} Skipping.",
+          formattedStrings.length);
       return false;
     }
     String[] secondParts = formattedStrings[1].split(",", 4);
diff --git a/src/main/java/org/torproject/metrics/stats/hidserv/Simulate.java b/src/main/java/org/torproject/metrics/stats/hidserv/Simulate.java
index 7acf1e8..ac8a82e 100644
--- a/src/main/java/org/torproject/metrics/stats/hidserv/Simulate.java
+++ b/src/main/java/org/torproject/metrics/stats/hidserv/Simulate.java
@@ -3,6 +3,9 @@
 
 package org.torproject.metrics.stats.hidserv;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -20,6 +23,9 @@ import java.util.TreeSet;
 /* NOTE: This class is not required for running the Main class!  (It
  * contains its own main method.) */
 public class Simulate {
+
+  private static Logger log = LoggerFactory.getLogger(Simulate.class);
+
   private static File simCellsCsvFile =
       new File("out/csv/sim-cells.csv");
 
@@ -28,11 +34,11 @@ public class Simulate {
 
   /** Runs two simulations to evaluate this data-processing module. */
   public static void main(String[] args) throws Exception {
-    System.out.print("Simulating extrapolation of rendezvous cells");
+    log.info("Simulating extrapolation of rendezvous cells");
     simulateManyCells();
-    System.out.print("\nSimulating extrapolation of .onions");
+    log.info("Simulating extrapolation of .onions");
     simulateManyOnions();
-    System.out.println("\nTerminating.");
+    log.info("Terminating.");
   }
 
   private static Random rnd = new Random();
@@ -45,7 +51,7 @@ public class Simulate {
     final int numberOfExtrapolations = 1000;
     for (int i = 0; i < numberOfExtrapolations; i++) {
       bw.write(simulateCells(i));
-      System.out.print(".");
+      log.info(".");
     }
     bw.close();
   }
@@ -58,7 +64,7 @@ public class Simulate {
     final int numberOfExtrapolations = 1000;
     for (int i = 0; i < numberOfExtrapolations; i++) {
       bw.write(simulateOnions(i));
-      System.out.print(".");
+      log.info(".");
     }
     bw.close();
   }
diff --git a/src/main/java/org/torproject/metrics/web/UpdateNews.java b/src/main/java/org/torproject/metrics/web/UpdateNews.java
index 2865516..abce4f1 100644
--- a/src/main/java/org/torproject/metrics/web/UpdateNews.java
+++ b/src/main/java/org/torproject/metrics/web/UpdateNews.java
@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.FileWriter;
@@ -14,6 +16,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class UpdateNews {
+
+  private static Logger log = LoggerFactory.getLogger(UpdateNews.class);
+
   /** Update news. */
   public static void main(String[] args) throws Exception {
     URL textFile = new URL(
@@ -72,7 +77,7 @@ public class UpdateNews {
           int space = desc.indexOf(" ", open);
           int close = desc.indexOf("]", open);
           if (open < 0 || space < 0 || close < 0) {
-            System.err.println("Cannot convert link.");
+            log.warn("Cannot convert link in line {}. Exiting.");
             System.exit(1);
           }
           desc = desc.substring(0, open) + "<a href=\""
@@ -84,7 +89,7 @@ public class UpdateNews {
           int open = desc.indexOf("`");
           int close = desc.indexOf("`", open + 1);
           if (open < 0 || close < 0) {
-            System.err.println("Cannot convert code fragment.");
+            log.warn("Cannot convert code fragment in line {}. Exiting.");
             System.exit(1);
           }
           desc = desc.substring(0, open) + "<code>"





More information about the tor-commits mailing list