From 322eef1c0f2e5f54377c6bb6b955c923e4134e45 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 17 Feb 2020 10:20:24 -0800 Subject: [PATCH] Add more info to system log (#4899) * Add more info to system log * Add util, oops * Tweak UI --- src/data/integration.ts | 10 ++++ src/data/system_log.ts | 6 +++ .../developer-tools/info/integrations-card.ts | 14 +++--- .../logs/dialog-system-log-detail.ts | 47 ++++++++++++++++++- .../developer-tools/logs/system-log-card.ts | 38 ++++++++------- src/panels/developer-tools/logs/util.ts | 13 +++++ 6 files changed, 102 insertions(+), 26 deletions(-) create mode 100644 src/data/integration.ts create mode 100644 src/panels/developer-tools/logs/util.ts diff --git a/src/data/integration.ts b/src/data/integration.ts new file mode 100644 index 0000000000..f322e96f10 --- /dev/null +++ b/src/data/integration.ts @@ -0,0 +1,10 @@ +import { LocalizeFunc } from "../common/translations/localize"; + +export const integrationDocsUrl = (domain: string) => + `https://www.home-assistant.io/integrations/${domain}`; + +export const integrationIssuesUrl = (domain: string) => + `https://github.com/home-assistant/home-assistant/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+${domain}%22`; + +export const domainToName = (localize: LocalizeFunc, domain: string) => + localize(`domain.${domain}`) || domain; diff --git a/src/data/system_log.ts b/src/data/system_log.ts index 49f93b79ee..f780adffe3 100644 --- a/src/data/system_log.ts +++ b/src/data/system_log.ts @@ -1,6 +1,7 @@ import { HomeAssistant } from "../types"; export interface LoggedError { + name: string; message: string; level: string; source: string; @@ -14,3 +15,8 @@ export interface LoggedError { export const fetchSystemLog = (hass: HomeAssistant) => hass.callApi("GET", "error/all"); + +export const getLoggedErrorIntegration = (item: LoggedError) => + item.name.startsWith("homeassistant.components.") + ? item.name.split(".")[2] + : undefined; diff --git a/src/panels/developer-tools/info/integrations-card.ts b/src/panels/developer-tools/info/integrations-card.ts index e51f73366a..f16ad1e904 100644 --- a/src/panels/developer-tools/info/integrations-card.ts +++ b/src/panels/developer-tools/info/integrations-card.ts @@ -9,6 +9,10 @@ import { } from "lit-element"; import { HomeAssistant } from "../../../types"; import memoizeOne from "memoize-one"; +import { + integrationDocsUrl, + integrationIssuesUrl, +} from "../../../data/integration"; @customElement("integrations-card") class IntegrationsCard extends LitElement { @@ -28,18 +32,12 @@ class IntegrationsCard extends LitElement { ${domain} - + Documentation - + Issues diff --git a/src/panels/developer-tools/logs/dialog-system-log-detail.ts b/src/panels/developer-tools/logs/dialog-system-log-detail.ts index e7a89162a9..11c075ae1d 100644 --- a/src/panels/developer-tools/logs/dialog-system-log-detail.ts +++ b/src/panels/developer-tools/logs/dialog-system-log-detail.ts @@ -14,6 +14,13 @@ import { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; +import { + integrationDocsUrl, + integrationIssuesUrl, + domainToName, +} from "../../../data/integration"; +import { formatSystemLogTime } from "./util"; +import { getLoggedErrorIntegration } from "../../../data/system_log"; class DialogSystemLogDetail extends LitElement { @property() public hass!: HomeAssistant; @@ -30,6 +37,8 @@ class DialogSystemLogDetail extends LitElement { } const item = this._params.item; + const integration = getLoggedErrorIntegration(item); + return html` -

${new Date(item.timestamp * 1000)}

+

+ Logger: ${item.name} + ${integration + ? html` +
+ Integration: ${domainToName(this.hass.localize, integration)} + (documentation, + issues) + ` + : ""} +
+ ${item.count > 0 + ? html` + First occured: + ${formatSystemLogTime( + item.first_occured, + this.hass!.language + )} + (${item.count} occurences)
+ ` + : ""} + Last logged: + ${formatSystemLogTime(item.timestamp, this.hass!.language)} +

${item.message ? html`
${item.message}
@@ -73,6 +109,15 @@ class DialogSystemLogDetail extends LitElement { ha-paper-dialog { direction: ltr; } + a { + color: var(--primary-color); + } + p { + margin-top: 0; + } + pre { + margin-bottom: 0; + } `, ]; } diff --git a/src/panels/developer-tools/logs/system-log-card.ts b/src/panels/developer-tools/logs/system-log-card.ts index 1a03a72e1c..cf619d5c45 100644 --- a/src/panels/developer-tools/logs/system-log-card.ts +++ b/src/panels/developer-tools/logs/system-log-card.ts @@ -15,20 +15,14 @@ import "../../../components/ha-card"; import "../../../components/buttons/ha-call-service-button"; import "../../../components/buttons/ha-progress-button"; import { HomeAssistant } from "../../../types"; -import { LoggedError, fetchSystemLog } from "../../../data/system_log"; -import { formatDateTimeWithSeconds } from "../../../common/datetime/format_date_time"; -import { formatTimeWithSeconds } from "../../../common/datetime/format_time"; +import { + LoggedError, + fetchSystemLog, + getLoggedErrorIntegration, +} from "../../../data/system_log"; import { showSystemLogDetailDialog } from "./show-dialog-system-log-detail"; - -const formatLogTime = (date, language: string) => { - const today = new Date().setHours(0, 0, 0, 0); - const dateTime = new Date(date * 1000); - const dateTimeDay = new Date(date * 1000).setHours(0, 0, 0, 0); - - return dateTimeDay < today - ? formatDateTimeWithSeconds(dateTime, language) - : formatTimeWithSeconds(dateTime, language); -}; +import { formatSystemLogTime } from "./util"; +import { domainToName } from "../../../data/integration"; @customElement("system-log-card") export class SystemLogCard extends LitElement { @@ -42,6 +36,9 @@ export class SystemLogCard extends LitElement { } protected render(): TemplateResult { + const integrations = this._items + ? this._items.map((item) => getLoggedErrorIntegration(item)) + : []; return html`
@@ -61,25 +58,32 @@ export class SystemLogCard extends LitElement {
` : this._items.map( - (item) => html` + (item, idx) => html`
${item.message}
- ${formatLogTime( + ${formatSystemLogTime( item.timestamp, this.hass!.language )} - ${item.source} (${item.level}) + – + ${integrations[idx] + ? domainToName( + this.hass!.localize, + integrations[idx]! + ) + : item.source} + (${item.level}) ${item.count > 1 ? html` - ${this.hass.localize( "ui.panel.developer-tools.tabs.logs.multiple_messages", "time", - formatLogTime( + formatSystemLogTime( item.first_occured, this.hass!.language ), diff --git a/src/panels/developer-tools/logs/util.ts b/src/panels/developer-tools/logs/util.ts new file mode 100644 index 0000000000..53912f5f91 --- /dev/null +++ b/src/panels/developer-tools/logs/util.ts @@ -0,0 +1,13 @@ +import { formatDateTimeWithSeconds } from "../../../common/datetime/format_date_time"; + +import { formatTimeWithSeconds } from "../../../common/datetime/format_time"; + +export const formatSystemLogTime = (date, language: string) => { + const today = new Date().setHours(0, 0, 0, 0); + const dateTime = new Date(date * 1000); + const dateTimeDay = new Date(date * 1000).setHours(0, 0, 0, 0); + + return dateTimeDay < today + ? formatDateTimeWithSeconds(dateTime, language) + : formatTimeWithSeconds(dateTime, language); +};