Crash-reports code update
This commit is contained in:
parent
e7e54d0ffd
commit
ddf48c0587
@ -2,4 +2,6 @@ package ru.windcorp.progressia.common.util.crash;
|
|||||||
|
|
||||||
public interface Analyzer {
|
public interface Analyzer {
|
||||||
String analyze(Throwable throwable, String messageFormat, Object... args);
|
String analyze(Throwable throwable, String messageFormat, Object... args);
|
||||||
|
|
||||||
|
String getName();
|
||||||
}
|
}
|
||||||
|
@ -3,5 +3,7 @@ package ru.windcorp.progressia.common.util.crash;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface ContextProvider {
|
public interface ContextProvider {
|
||||||
Map<String, String> provideContext();
|
void provideContext(Map<String, String> output);
|
||||||
|
|
||||||
|
String getName();
|
||||||
}
|
}
|
||||||
|
@ -3,25 +3,28 @@ package ru.windcorp.progressia.common.util.crash;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class CrashReportGenerator {
|
public class CrashReportGenerator {
|
||||||
|
|
||||||
private CrashReportGenerator() {}
|
private CrashReportGenerator() {
|
||||||
|
}
|
||||||
|
|
||||||
private static final File LATEST_LOG_FILE = new File("crash-reports/latest.log");
|
private static final Path CRASH_REPORTS_PATH = Paths.get("crash-reports");
|
||||||
|
|
||||||
private static final Collection<ContextProvider> PROVIDERS = new ArrayList<>();
|
private static final Collection<ContextProvider> PROVIDERS = new ArrayList<>();
|
||||||
private static final Collection<Map<String, String>> PROVIDER_RESPONSES = new ArrayList<>();
|
|
||||||
|
|
||||||
private static final Collection<Analyzer> ANALYZER = new ArrayList<>();
|
private static final Collection<Analyzer> ANALYZERS = new ArrayList<>();
|
||||||
private static final Collection<String> ANALYZER_RESPONSES = new ArrayList<>();
|
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger("crash");
|
private static final Logger LOGGER = LogManager.getLogger("crash");
|
||||||
|
|
||||||
@ -31,32 +34,56 @@ public class CrashReportGenerator {
|
|||||||
|
|
||||||
for (ContextProvider provider : PROVIDERS) {
|
for (ContextProvider provider : PROVIDERS) {
|
||||||
if (provider != null) {
|
if (provider != null) {
|
||||||
PROVIDER_RESPONSES.add(provider.provideContext());
|
Map<String, String> buf = new HashMap<>();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Analyzer analyzer : ANALYZER) {
|
try {
|
||||||
if (analyzer != null) {
|
provider.provideContext(buf);
|
||||||
ANALYZER_RESPONSES.add(analyzer.analyze(throwable, messageFormat, args));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map<String, String> response : PROVIDER_RESPONSES) {
|
addSeparator(output);
|
||||||
if (response != null && !response.isEmpty()) {
|
output.append("Provider name: ").append(provider.getName()).append("\n");
|
||||||
addSeparator(output);
|
for (Map.Entry<String, String> entry : buf.entrySet()) {
|
||||||
for (Map.Entry<String, String> entry : response.entrySet()) {
|
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
|
||||||
output.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
try {
|
||||||
|
addSeparator(output);
|
||||||
|
output.append(provider.getName()).append(" is broken").append("\n");
|
||||||
|
} catch (Throwable th) {
|
||||||
|
// You stupid
|
||||||
|
}
|
||||||
|
// Analyzer is broken
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String response : ANALYZER_RESPONSES) {
|
addSeparator(output);
|
||||||
if (response != null && !response.isEmpty()) {
|
|
||||||
addSeparator(output);
|
boolean analyzerResponseExist = false;
|
||||||
output.append(response).append("\n");
|
for (Analyzer analyzer : ANALYZERS) {
|
||||||
|
if (analyzer != null) {
|
||||||
|
|
||||||
|
String answer;
|
||||||
|
try {
|
||||||
|
answer = analyzer.analyze(throwable, messageFormat, args);
|
||||||
|
|
||||||
|
if (answer != null && !answer.isEmpty()) {
|
||||||
|
analyzerResponseExist = true;
|
||||||
|
output.append(analyzer.getName()).append(": ").append(answer).append("\n");
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
try {
|
||||||
|
analyzerResponseExist = true;
|
||||||
|
output.append(analyzer.getName()).append(" is broken").append("\n");
|
||||||
|
} catch (Throwable th) {
|
||||||
|
// You stupid
|
||||||
|
}
|
||||||
|
// Analyzer is broken
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (analyzerResponseExist) addSeparator(output);
|
||||||
|
|
||||||
// Formatting to a human-readable string
|
// Formatting to a human-readable string
|
||||||
StringWriter sink = new StringWriter();
|
StringWriter sink = new StringWriter();
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
@ -69,47 +96,48 @@ public class CrashReportGenerator {
|
|||||||
sink.append("Null");
|
sink.append("Null");
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.info(output.toString());
|
|
||||||
LOGGER.fatal("Stacktrace: \n" + sink.toString());
|
|
||||||
|
|
||||||
addSeparator(output);
|
|
||||||
|
|
||||||
output.append("Stacktrace: \n");
|
output.append("Stacktrace: \n");
|
||||||
output.append(sink.toString()).append("\n");
|
output.append(sink.toString()).append("\n");
|
||||||
|
|
||||||
|
LOGGER.fatal("/n" + output.toString());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
System.err.println(output.toString());
|
System.err.println(output.toString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// PLAK
|
// PLAK
|
||||||
}
|
}
|
||||||
|
|
||||||
createFileForCrashReport(output);
|
generateCrashReportFiles(output.toString());
|
||||||
createFileForLatestCrashReport(output);
|
|
||||||
|
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void createFileForCrashReport(StringBuilder sb) {
|
public static void generateCrashReportFiles(String output) {
|
||||||
Date date = new Date();
|
Date date = new Date();
|
||||||
|
|
||||||
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");
|
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");
|
||||||
|
|
||||||
File logFile = new File("crash-reports/" + "crash-" + dateFormat.format(date) + ".log");
|
boolean pathExist = false;
|
||||||
|
if (!Files.exists(CRASH_REPORTS_PATH)) {
|
||||||
|
|
||||||
try (FileOutputStream fos = new FileOutputStream(logFile)) {
|
try {
|
||||||
byte[] buffer = sb.toString().getBytes();
|
Files.createDirectory(CRASH_REPORTS_PATH);
|
||||||
|
;
|
||||||
|
pathExist = true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Crash Report not created
|
||||||
|
}
|
||||||
|
|
||||||
fos.write(buffer, 0, buffer.length);
|
} else pathExist = true;
|
||||||
} catch (IOException ex) {
|
|
||||||
// Crash Report not created
|
if (pathExist) {
|
||||||
|
createFileForCrashReport(output, CRASH_REPORTS_PATH.toString() + "/latest.log");
|
||||||
|
createFileForCrashReport(output, CRASH_REPORTS_PATH.toString() + "/crash-" + dateFormat.format(date) + ".log");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void createFileForLatestCrashReport(StringBuilder sb) {
|
public static void createFileForCrashReport(String buffer, String filename) {
|
||||||
try (FileOutputStream fos = new FileOutputStream(LATEST_LOG_FILE)) {
|
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(filename), StandardCharsets.UTF_8)) {
|
||||||
byte[] buffer = sb.toString().getBytes();
|
writer.write(buffer);
|
||||||
|
|
||||||
fos.write(buffer, 0, buffer.length);
|
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
// Crash Report not created
|
// Crash Report not created
|
||||||
}
|
}
|
||||||
@ -120,7 +148,7 @@ public class CrashReportGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void registerAnalyzer(Analyzer analyzer) {
|
public static void registerAnalyzer(Analyzer analyzer) {
|
||||||
ANALYZER.add(analyzer);
|
ANALYZERS.add(analyzer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addSeparator(StringBuilder sb) {
|
private static void addSeparator(StringBuilder sb) {
|
||||||
|
@ -9,4 +9,9 @@ public class OutOfMemoryAnalyzer implements Analyzer {
|
|||||||
return "Try add memory for the JVM";
|
return "Try add memory for the JVM";
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.getClass().getSimpleName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,17 +2,19 @@ package ru.windcorp.progressia.common.util.crash.providers;
|
|||||||
|
|
||||||
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
import ru.windcorp.progressia.common.util.crash.ContextProvider;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class OSContextProvider implements ContextProvider {
|
public class OSContextProvider implements ContextProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, String> provideContext() {
|
public void provideContext(Map<String, String> output) {
|
||||||
Map<String, String> result = new HashMap<>();
|
output.put("Name OS", System.getProperty("os.name"));
|
||||||
result.put("Name OS", System.getProperty("os.name"));
|
output.put("Version OS", System.getProperty("os.version"));
|
||||||
result.put("Version OS", System.getProperty("os.version"));
|
output.put("Architecture OS", System.getProperty("os.arch"));
|
||||||
result.put("Architecture OS", System.getProperty("os.arch"));
|
}
|
||||||
return result;
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.getClass().getSimpleName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user