From 5ebb28e9bfe98cacef6c95c9d3b5f338a444efc9 Mon Sep 17 00:00:00 2001 From: evernat Date: Sat, 26 May 2018 18:05:51 +0200 Subject: [PATCH] when crash logs (hs_err_pid*.log) are found, display them in the system actions --- .../javamelody/internal/common/HttpPart.java | 1 + .../javamelody/internal/model/HsErrPid.java | 123 ++++++++++++++++++ .../internal/model/JavaInformations.java | 15 +++ .../internal/model/LabradorRetriever.java | 5 + .../internal/web/CollectorController.java | 30 +++++ .../internal/web/HtmlController.java | 6 + .../internal/web/MonitoringController.java | 36 ++++- .../internal/web/SerializableController.java | 7 + .../internal/web/html/HtmlCoreReport.java | 13 ++ .../internal/web/html/HtmlHsErrPidReport.java | 84 ++++++++++++ .../internal/web/html/HtmlReport.java | 10 ++ .../resource/translations.properties | 4 + .../resource/translations_de.properties | 4 + .../resource/translations_fr.properties | 4 + .../resource/translations_pt.properties | 4 + .../resource/translations_zh.properties | 4 + 16 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 javamelody-core/src/main/java/net/bull/javamelody/internal/model/HsErrPid.java create mode 100644 javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlHsErrPidReport.java diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/common/HttpPart.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/common/HttpPart.java index fdc47c214..3f1319204 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/common/HttpPart.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/common/HttpPart.java @@ -41,6 +41,7 @@ public enum HttpPart { USAGES("usages"), JNDI("jndi"), MBEANS("mbeans"), + CRASHES("crashes"), THREADS("threads"), THREADS_DUMP("threadsDump"), COUNTER_SUMMARY_PER_CLASS("counterSummaryPerClass"), diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/model/HsErrPid.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/HsErrPid.java new file mode 100644 index 000000000..b6d602cad --- /dev/null +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/HsErrPid.java @@ -0,0 +1,123 @@ +/* + * Copyright 2008-2017 by Emeric Vernat + * + * This file is part of Java Melody. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.bull.javamelody.internal.model; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.Serializable; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +/** + * HsErrPid files. + * @author Emeric Vernat + */ +public final class HsErrPid implements Serializable { + /** + * Comparateur de HsErrPid par date. + */ + static final class HsErrPidComparator implements Comparator, Serializable { + private static final long serialVersionUID = 1L; + + /** {@inheritDoc} */ + @Override + public int compare(HsErrPid hsErrPid1, HsErrPid hsErrPid2) { + return hsErrPid2.getDate().compareTo(hsErrPid1.getDate()); + } + } + + private static final String XX_ERROR_FILE = "-XX:ErrorFile="; + + private static final long serialVersionUID = 1L; + + private static final FilenameFilter FILENAME_FILTER = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.startsWith("hs_err_pid") && name.endsWith(".log"); + } + }; + + private final String file; + + private final Date date; + + private HsErrPid(String file, Date date) { + super(); + this.file = file; + this.date = date; + } + + public static List buildHsErrPidList() { + final List directories = new ArrayList(); + // locations of fatal error log: + // http://www.oracle.com/technetwork/java/javase/felog-138657.html + directories.add(new File("./")); + // linux: + directories.add(new File("/tmp")); + // windows: + final String tmp = System.getenv("TMP"); + if (tmp != null) { + directories.add(new File(tmp)); + } + final List args = ManagementFactory.getRuntimeMXBean().getInputArguments(); + for (final String arg : args) { + if (arg.startsWith(XX_ERROR_FILE)) { + final String errorFile = arg.substring(XX_ERROR_FILE.length()); + final File dir = new File(errorFile).getParentFile(); + if (dir != null) { + directories.add(dir); + } + } + } + + final List result = new ArrayList(); + for (final File dir : directories) { + final File[] files = dir.listFiles(FILENAME_FILTER); + if (files != null) { + for (final File file : files) { + result.add(new HsErrPid(file.getAbsolutePath(), new Date(file.lastModified()))); + } + } + } + return result; + } + + public static List getHsErrPidList(List javaInformationsList) { + final List result = new ArrayList(); + for (final JavaInformations javaInformations : javaInformationsList) { + final List hsErrPidList = javaInformations.getHsErrPidList(); + if (hsErrPidList != null) { + result.addAll(hsErrPidList); + } + } + Collections.sort(result, new HsErrPidComparator()); + return result; + } + + public String getFile() { + return file; + } + + public Date getDate() { + return date; + } +} diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/model/JavaInformations.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/JavaInformations.java index a0b8e4ed9..2250e5f3a 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/model/JavaInformations.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/JavaInformations.java @@ -41,6 +41,7 @@ import net.bull.javamelody.SessionListener; import net.bull.javamelody.SpringContext; import net.bull.javamelody.internal.common.Parameters; +import net.bull.javamelody.internal.model.HsErrPid.HsErrPidComparator; /** * Informations systèmes sur le serveur, sans code html de présentation. @@ -98,6 +99,8 @@ public class JavaInformations implements Serializable { // NOPMD private final List cacheInformationsList; @SuppressWarnings("all") private final List jobInformationsList; + @SuppressWarnings("all") + private final List hsErrPidList; private final boolean webXmlExists = localWebXmlExists; private final boolean pomXmlExists = localPomXmlExists; private final boolean springBeanExists; @@ -186,6 +189,7 @@ public JavaInformations(ServletContext servletContext, boolean includeDetails) { threadInformationsList = buildThreadInformationsList(); cacheInformationsList = CacheInformations.buildCacheInformationsList(); jobInformationsList = JobInformations.buildJobInformationsList(); + hsErrPidList = HsErrPid.buildHsErrPidList(); pid = PID.getPID(); } else { dataBaseVersion = null; @@ -193,6 +197,7 @@ public JavaInformations(ServletContext servletContext, boolean includeDetails) { threadInformationsList = null; cacheInformationsList = null; jobInformationsList = null; + hsErrPidList = null; pid = null; } } @@ -667,6 +672,16 @@ public int getCurrentlyExecutingJobCount() { return result; } + public List getHsErrPidList() { + if (hsErrPidList != null) { + // on trie sur demande (si affichage) + final List result = new ArrayList(hsErrPidList); + Collections.sort(result, new HsErrPidComparator()); + return Collections.unmodifiableList(result); + } + return null; + } + public boolean isStackTraceEnabled() { for (final ThreadInformations threadInformations : threadInformationsList) { final List stackTrace = threadInformations.getStackTrace(); diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/model/LabradorRetriever.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/LabradorRetriever.java index b5b98fa90..9e970d38d 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/model/LabradorRetriever.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/model/LabradorRetriever.java @@ -211,6 +211,11 @@ public void copyTo(HttpServletRequest httpRequest, HttpServletResponse httpRespo httpRequest.getHeader("Accept-Language")); connection.connect(); httpResponse.setContentType(connection.getContentType()); + // Content-Disposition pour téléchargement hs_err_pid par exemple + final String contentDisposition = connection.getHeaderField("Content-Disposition"); + if (contentDisposition != null) { + httpResponse.setHeader("Content-Disposition", contentDisposition); + } final OutputStream output = httpResponse.getOutputStream(); dataLength = pump(output, connection); } finally { diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/CollectorController.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/CollectorController.java index 26fadebf8..3ba077738 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/CollectorController.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/CollectorController.java @@ -49,6 +49,7 @@ import net.bull.javamelody.internal.model.CounterRequestAggregation; import net.bull.javamelody.internal.model.CounterRequestContext; import net.bull.javamelody.internal.model.DatabaseInformations; +import net.bull.javamelody.internal.model.HsErrPid; import net.bull.javamelody.internal.model.JavaInformations; import net.bull.javamelody.internal.model.JndiBinding; import net.bull.javamelody.internal.model.LabradorRetriever; @@ -220,6 +221,10 @@ private void doPart(HttpServletRequest req, HttpServletResponse resp, String app final URL url = getUrlsByApplication(application).get(0); doProxy(req, resp, url, HttpPart.SOURCE.getName() + '&' + HttpParameter.CLASS + '=' + HttpParameter.CLASS.getParameterFrom(req)); + } else if (HttpPart.CRASHES.isPart(req) + && HttpParameter.PATH.getParameterFrom(req) != null) { + noCache(resp); + doCrashDownload(req, resp, application); } else if (HttpPart.CONNECTIONS.isPart(req)) { doMultiHtmlProxy(req, resp, application, HttpPart.CONNECTIONS.getName(), I18N.getString("Connexions_jdbc_ouvertes"), I18N.getString("connexions_intro"), @@ -237,6 +242,25 @@ private void doPart(HttpServletRequest req, HttpServletResponse resp, String app } } + private void doCrashDownload(HttpServletRequest req, HttpServletResponse resp, + String application) throws IOException { + final String partParameter = HttpPart.CRASHES.getName() + '&' + HttpParameter.PATH + '=' + + HttpParameter.PATH.getParameterFrom(req); + boolean found = false; + for (final URL url : getUrlsByApplication(application)) { + try { + doProxy(req, resp, url, partParameter); + found = true; + break; + } catch (final IOException e) { + continue; + } + } + if (!found) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + } + } + private void doJmxValue(HttpServletRequest req, HttpServletResponse resp, String application, String jmxValueParameter) throws IOException { noCache(resp); @@ -411,6 +435,12 @@ private Serializable createSerializableForSystemActions(HttpServletRequest httpR Action.checkSystemActionsEnabled(); return new ArrayList>( collectorServer.collectConnectionInformations(application)); + } else if (HttpPart.CRASHES.isPart(httpRequest)) { + // par sécurité + Action.checkSystemActionsEnabled(); + final List javaInformationsList = getJavaInformationsByApplication( + application); + return new ArrayList(HsErrPid.getHsErrPidList(javaInformationsList)); } return null; } diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/HtmlController.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/HtmlController.java index c66b20e0f..1a47fe0ff 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/HtmlController.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/HtmlController.java @@ -306,6 +306,12 @@ void doMBeans() throws IOException { } } + @RequestPart(HttpPart.CRASHES) + void doCrashes() throws IOException { + Action.checkSystemActionsEnabled(); + htmlReport.writeCrashes(); + } + @RequestPart(HttpPart.SPRING_BEANS) void doSpringBeans() throws IOException { htmlReport.writeSpringContext(); diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/MonitoringController.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/MonitoringController.java index b196a489d..25d0c6364 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/MonitoringController.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/MonitoringController.java @@ -19,6 +19,8 @@ import java.io.BufferedInputStream; import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -43,6 +45,7 @@ import net.bull.javamelody.internal.model.Action; import net.bull.javamelody.internal.model.Collector; import net.bull.javamelody.internal.model.CollectorServer; +import net.bull.javamelody.internal.model.HsErrPid; import net.bull.javamelody.internal.model.JRobin; import net.bull.javamelody.internal.model.JavaInformations; import net.bull.javamelody.internal.model.MBeans; @@ -194,6 +197,10 @@ public void doReport(HttpServletRequest httpRequest, HttpServletResponse httpRes } else if (HttpPart.JNLP.isPart(httpRequest)) { final Range range = httpCookieManager.getRange(httpRequest, httpResponse); doJnlp(httpRequest, httpResponse, range); + } else if (HttpPart.CRASHES.isPart(httpRequest) + && HttpParameter.PATH.getParameterFrom(httpRequest) != null) { + final String path = HttpParameter.PATH.getParameterFrom(httpRequest); + doHsErrPid(httpResponse, javaInformationsList, path); } else if (HttpParameter.REPORT.getParameterFrom(httpRequest) != null) { final String reportName = URLDecoder .decode(HttpParameter.REPORT.getParameterFrom(httpRequest), "UTF-8"); @@ -482,6 +489,32 @@ private void doJnlp(HttpServletRequest httpRequest, HttpServletResponse httpResp .toJnlp(); } + private void doHsErrPid(HttpServletResponse httpResponse, + List javaInformationsList, String path) throws IOException { + for (final JavaInformations javaInformations : javaInformationsList) { + for (final HsErrPid hsErrPid : javaInformations.getHsErrPidList()) { + if (hsErrPid.getFile().replace('\\', '/').equals(path) && new File(path).exists()) { + final File file = new File(path); + final OutputStream out = httpResponse.getOutputStream(); + httpResponse.setContentType("text/plain"); + // attachment et non inline pour proposer le téléchargement et non l'affichage direct dans le navigateur + httpResponse.addHeader("Content-Disposition", + "attachment;filename=" + file.getName()); + final InputStream in = new FileInputStream(file); + try { + TransportFormat.pump(in, out); + } finally { + in.close(); + } + return; + } + } + } + // si le fichier demandé n'est pas dans la liste des fichiers hs_err_pid*.log, + // alors il n'existe plus ou alors le fichier demandé est une invention malveillante + httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND); + } + private static void doCustomReport(HttpServletRequest httpRequest, HttpServletResponse httpResponse, String reportName) throws ServletException, IOException { @@ -517,7 +550,8 @@ public static boolean isJavaInformationsNeeded(HttpServletRequest httpRequest) { || HttpPart.DEFAULT_WITH_CURRENT_REQUESTS.getName().equals(part) || HttpPart.JVM.getName().equals(part) || HttpPart.THREADS.getName().equals(part) - || HttpPart.THREADS_DUMP.getName().equals(part); + || HttpPart.THREADS_DUMP.getName().equals(part) + || HttpPart.CRASHES.getName().equals(part); } return false; } diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/SerializableController.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/SerializableController.java index 4eefb641e..128233707 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/SerializableController.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/SerializableController.java @@ -47,6 +47,7 @@ import net.bull.javamelody.internal.model.CounterRequestAggregation; import net.bull.javamelody.internal.model.CounterRequestContext; import net.bull.javamelody.internal.model.DatabaseInformations; +import net.bull.javamelody.internal.model.HsErrPid; import net.bull.javamelody.internal.model.JRobin; import net.bull.javamelody.internal.model.JavaInformations; import net.bull.javamelody.internal.model.JndiBinding; @@ -344,6 +345,12 @@ private List getCurrentRequests() { return collector.getRootCurrentContexts(newCounters); } + @RequestPart(HttpPart.CRASHES) + Serializable createCrashesSerializable( + @RequestAttribute(JAVA_INFORMATIONS_LIST_KEY) List javaInformationsList) { + return new ArrayList(HsErrPid.getHsErrPidList(javaInformationsList)); + } + private Map convertJRobinsToImages(Collection jrobins, Range range, int width, int height) throws IOException { final Map images = new LinkedHashMap(jrobins.size()); diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlCoreReport.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlCoreReport.java index 6b96de47d..489a8a42e 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlCoreReport.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlCoreReport.java @@ -39,6 +39,7 @@ import net.bull.javamelody.internal.model.CollectorServer; import net.bull.javamelody.internal.model.Counter; import net.bull.javamelody.internal.model.CounterRequestContext; +import net.bull.javamelody.internal.model.HsErrPid; import net.bull.javamelody.internal.model.JRobin; import net.bull.javamelody.internal.model.JavaInformations; import net.bull.javamelody.internal.model.JobInformations; @@ -577,6 +578,10 @@ private boolean isJobEnabled() { return false; } + List getHsErrPidList() { + return HsErrPid.getHsErrPidList(javaInformationsList); + } + private void writeCaches() throws IOException { int i = 0; for (final JavaInformations javaInformations : javaInformationsList) { @@ -709,6 +714,14 @@ private void writeSystemActionsLinks() throws IOException { // NOPMD writeln("\"#database#\" #database#"); } + final int hsErrPidCount = getHsErrPidList().size(); + if (hsErrPidCount > 0) { + writeln(separator); + write(""); + write("\"#Crashes# #Crashes# (" + hsErrPidCount + ")"); + } + writeln("
"); } diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlHsErrPidReport.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlHsErrPidReport.java new file mode 100644 index 000000000..8af5fdd0f --- /dev/null +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlHsErrPidReport.java @@ -0,0 +1,84 @@ +/* + * Copyright 2008-2017 by Emeric Vernat + * + * This file is part of Java Melody. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.bull.javamelody.internal.web.html; + +import java.io.IOException; +import java.io.Writer; +import java.text.DateFormat; +import java.util.List; + +import net.bull.javamelody.internal.common.I18N; +import net.bull.javamelody.internal.model.HsErrPid; + +/** + * Partie du rapport html pour les crashs de JVM. + * @author Emeric Vernat + */ +public class HtmlHsErrPidReport extends HtmlAbstractReport { + private final List hsErrPidList; + private final DateFormat dateTimeFormat = I18N.createDateAndTimeFormat(); + + HtmlHsErrPidReport(List hsErrPidList, Writer writer) { + super(writer); + assert hsErrPidList != null; + + this.hsErrPidList = hsErrPidList; + } + + @Override + void toHtml() throws IOException { + writeLinks(); + writeln("
"); + + writeTitle("alert.png", getString("Crashes") + " (" + hsErrPidList.size() + ')'); + writeTable(); + } + + void writeTable() throws IOException { + final HtmlTable table = new HtmlTable(); + table.beginTable(getString("Crashes")); + write("#File#"); + write("#Date#"); + for (final HsErrPid hsErrPid : hsErrPidList) { + table.nextRow(); + writeHsErrPid(hsErrPid); + } + table.endTable(); + } + + private void writeHsErrPid(HsErrPid hsErrPid) throws IOException { + write(""); + write(htmlEncode(hsErrPid.getFile())); + write(""); + final String newColumnRight = ""; + write(newColumnRight); + write(dateTimeFormat.format(hsErrPid.getDate())); + write(""); + } + + void writeLinks() throws IOException { + writeln("
"); + writeln("#Retour# #Retour#"); + writeln("     "); + writeln("#Actualiser# #Actualiser#"); + writeln("
"); + } +} diff --git a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlReport.java b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlReport.java index 28ebbd28e..9f21abbf8 100644 --- a/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlReport.java +++ b/javamelody-core/src/main/java/net/bull/javamelody/internal/web/html/HtmlReport.java @@ -39,6 +39,7 @@ import net.bull.javamelody.internal.model.CounterRequestContext; import net.bull.javamelody.internal.model.DatabaseInformations; import net.bull.javamelody.internal.model.HeapHistogram; +import net.bull.javamelody.internal.model.HsErrPid; import net.bull.javamelody.internal.model.JavaInformations; import net.bull.javamelody.internal.model.JndiBinding; import net.bull.javamelody.internal.model.MBeanNode; @@ -416,4 +417,13 @@ public void writeCacheWithKeys(String cacheId, CacheInformations cacheInformatio } } } + + public void writeCrashes() throws IOException { + writeHtmlHeader(); + final List hsErrPidList = htmlCoreReport.getHsErrPidList(); + final HtmlHsErrPidReport htmlHsErrPidReport = new HtmlHsErrPidReport(hsErrPidList, + getWriter()); + htmlHsErrPidReport.toHtml(); + writeHtmlFooter(); + } } diff --git a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations.properties b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations.properties index f254d9d2c..d95ec7880 100644 --- a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations.properties +++ b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations.properties @@ -40,6 +40,7 @@ database=Database Arbre_JNDI=JNDI tree Arbre_JNDI_pour_contexte=JNDI tree for the context {0} MBeans=MBeans +Crashes=JVM crashes Choix_application=Choice of application Retour=Return Page_principale=Main page @@ -289,6 +290,9 @@ start=Start cpuTime=CPU time command=Command +# HsErrPidReport +File=File + # Actions Actions_non_activees=System actions not enabled Statistiques_reinitialisees=Statistics {0} cleared. diff --git a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_de.properties b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_de.properties index 187eb062c..c92c033d3 100644 --- a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_de.properties +++ b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_de.properties @@ -40,6 +40,7 @@ database=Datenbank Arbre_JNDI=JNDI-Baum Arbre_JNDI_pour_contexte=JNDI-Baum für Kontext {0} MBeans=MBeans +Crashes=JVM crashes Choix_application=Anwendung auswählen Retour=Zurück Page_principale=Startseite @@ -290,6 +291,9 @@ start=Start cpuTime=CPU-Zeit command=Kommando +# HsErrPidReport +File=Datei + # Actions Actions_non_activees=Systemaktionen nicht aktiv Statistiques_reinitialisees=Statistiken für {0} gelöscht. diff --git a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_fr.properties b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_fr.properties index 28aaeae30..3c2625894 100644 --- a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_fr.properties +++ b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_fr.properties @@ -40,6 +40,7 @@ database=Base de donn Arbre_JNDI=Arbre JNDI Arbre_JNDI_pour_contexte=Arbre JNDI pour le contexte {0} MBeans=MBeans +Crashes=Crashs JVM Choix_application=Choix de l'application Retour=Retour Page_principale=Page principale @@ -289,6 +290,9 @@ start=D cpuTime=Temps cpu command=Commande +# HsErrPidReport +File=Fichier + # Actions Actions_non_activees=Actions systèmes non activées Statistiques_reinitialisees=Statistiques {0} réinitialisées. diff --git a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_pt.properties b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_pt.properties index 31b6be248..0d7ac164c 100644 --- a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_pt.properties +++ b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_pt.properties @@ -45,6 +45,7 @@ database=Banco de dados Arbre_JNDI=Árvore JNDI Arbre_JNDI_pour_contexte=Árvore JNDI par ao contexto {0} MBeans=MBeans +Crashes=JVM crashes Choix_application=Escolha a aplicação Retour=Retornar Page_principale=Página inicial @@ -294,6 +295,9 @@ start=In cpuTime=Tempo de CPU command=Comando +# HsErrPidReport +File=Arquivo + # Actions Actions_non_activees=Ações no sistema não disponíveis Statistiques_reinitialisees=Estatísticas {0} limpas. diff --git a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_zh.properties b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_zh.properties index 474edbd74..96eb6a2f4 100644 --- a/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_zh.properties +++ b/javamelody-core/src/main/resources/net/bull/javamelody/resource/translations_zh.properties @@ -950,3 +950,7 @@ Interrupt=Interrupt storage_used_by_multiple_instances=Do not use the same storage directory with multiple instances or it will cause data loss. \ Configure the storage-directory parameter if needed. + +# HsErrPidReport +File=File +Crashes=JVM crashes