ThingWorx Modelldefinition in Composer > System > Protokolle > OpenTelemetry für ThingWorx Platform-Protokollierung > Benutzerdefinierte Protokollabruf-Strategie für die Abfrage von Protokollen aus externen Quellen
Benutzerdefinierte Protokollabruf-Strategie für die Abfrage von Protokollen aus externen Quellen
Die Protokollbeobachtbarkeit kann mithilfe verschiedener auf dem Markt verfügbarer Protokollierungsanbieteranwendungen von Drittanbietern erreicht werden. Diese Anwendungen bieten verschiedene Möglichkeiten, Protokolle zu übertragen und abzurufen.
Mit OpenTelemetry werden Protokolle an Protokollierungsanbieteranwendungen übertragen.
Der Hauptzweck dieser Protokollabruf-Strategie besteht darin, Protokolle von einer Drittanbieter-Quelle abzurufen und diese Protokolle auf der Seite Composer > Überwachung > Protokolle anzuzeigen.
Im Rahmen der Gesamtimplementierung stellt ThingWorx Folgendes bereit:
Standardstrategie-Ding DefaultLogRetrievalStrategyThing, das Protokolle aus ThingWorx Dateiprotokollen und Sumo-Logik abhängig von der Konfiguration abruft.
Erweiterungs-SDK, um eine benutzerdefinierte Protokollabruf-Strategie zu entwickeln.
DefaultLogRetrievalStrategyThing ist ein Systemobjekt. Nur seine Konfiguration kann aktualisiert werden. Benutzer sollten diese Vorlage DefaultLogRetrievalStrategyThing nicht verwenden, um benutzerdefinierte Protokollabruf-Strategien zu implementieren.
Das Abrufen des Protokolls erfolgt über den Dienst RetrieveLogs, der für DefaultLogRetrievalStrategyThing verfügbar ist. Der Protokollabruf basiert auf Folgendem
Wenn die Dateiprotokollierung deaktiviert ist (DisableFileLogging ist auf true festgelegt) und OpenTelemetry aktiviert ist (EnableOpenTelemetryForLogging ist auf true festgelegt) werden nur Protokolle aus der Sumo-Logik abgerufen.
In allen anderen Fällen werden Protokolle aus Dateien abgerufen.
Im Fall einer benutzerdefinierten Implementierung des Protokollabrufs kann der Dienst RetrieveLogs auf die folgenden zwei Arten implementiert werden.
Über Composer mit dem JavaScript-Dienst
a. Erstellen Sie ein Ding in Composer mit der Basisvorlage LogRetrievalStrategy.
b. Gehen Sie zu Dienste und überschreiben Sie den Dienst RetriveLogs.
c. Geben Sie Ihren JavaScript-Code für den Abruf von Protokollen aus der Protokollierungssoftware von Drittanbietern an.
* 
In der Regel werden Content Loader-Funktionen oder ähnliche Funktionen verwendet, um mit Drittanbietern zu kommunizieren.
Durch Erstellen einer Erweiterung in ThingWorx unter Verwendung des Erweiterungs-SDK
a. Erstellen Sie eine Erweiterung in Eclipse mit dem neuesten SDK (9.6.0 oder höher).
b. Erstellen Sie eine Dingvorlage (Java-Klasse) mit der Basisvorlage LogRetrievalStrategy.
Ihre Klasse sollte die Klasse "Log Retrieval Strategy" erweitern.
c. Überschreiben Sie die Java-Methode "Retrieve Log", und implementieren Sie Ihren benutzerdefinierten Code, um Protokolle aus der Protokollierungssoftware von Drittanbietern abzurufen.
d. (Optional) Aktualisieren Sie metadata.xml der Erweiterung, und erstellen Sie ein Ding. Sie können das Ding auch später in Composer erstellen, nachdem Sie die Erweiterung importiert haben.
e. Erstellen Sie die Erweiterung, und importieren Sie sie in ThingWorx.
In beiden Fällen müssen Sie, nachdem Sie ein Ding haben dieses Ding als Ding LogRetrievalStrategy im Untersystem für Protokollierung festlegen.
In diesem Tutorial wird nicht auf die Grundlagen der Erstellung von ThingWorx Erweiterungen eingegangen. Es wird von Folgendem ausgegangen:
Sie wissen, wie ThingWorx Erweiterungen erstellt werden.
Sie verfügen über das Erweiterungs-SDK, Version 9.6.0 oder höher, das die Dingvorlage LogRetrievalStrategy umfasst.
Sie wissen, wie eine Erweiterung erstellt und in ThingWorx Platform importiert wird.
Benutzerdefinierte Protokollabruf-Strategie implementieren
1. Zum Erstellen einer benutzerdefinierten Strategie erstellen Sie zunächst eine Strategie-Dingvorlage. Diese Dingvorlage dient als Codebasis für einen Java-basierten Algorithmus. Die Klassendefinition für die Dingvorlage lautet wie folgt:
@ThingworxBaseTemplateDefinition(name = "LogRetrievalStrategy")
public class CustomLogRetrievalStrategy extends LogRetrievalStrategy{
2. RetrieveLogs-Methode implementieren und überschreiben.
@ThingworxServiceDefinition(
name = LoggingConstants.RETRIEVE_LOGS_STRATEGY_SERVICE_NAME,
isAllowOverride = true,
description = "Retrieve Logs from the given source",
category = "Queries")
@ThingworxServiceResult(name = "result", description = "Table entries", baseType = "INFOTABLE", aspects = { "dataShape:LogEntry" })
@Override
public InfoTable RetrieveLogs(
@ThingworxServiceParameter(
name = LoggingConstants.MAX_ITEMS,
description = "Maximum number of items to return",
baseType = "NUMBER",
aspects = { "defaultValue:" + RESTAPIConstants.DEFAULT_ITEM_COUNT }) Double maxItems,
@ThingworxServiceParameter(
name = LoggingConstants.START_DATE,
description = "Start time",
baseType = "DATETIME") DateTime startDate,
@ThingworxServiceParameter(
name = LoggingConstants.END_DATE,
description = "End time",
baseType = "DATETIME") DateTime endDate,
@ThingworxServiceParameter(
name = LoggingConstants.FROM_LOG_LEVEL,
description = "From log level",
baseType = "STRING") String fromLogLevel,
@ThingworxServiceParameter(
name = LoggingConstants.TO_LOG_LEVEL,
description = "To log level",
baseType = "STRING") String toLogLevel,
@ThingworxServiceParameter(
name = LoggingConstants.USER,
description = "Log messages for a specific user",
baseType = "USERNAME") String user,
@ThingworxServiceParameter(
name = LoggingConstants.THREAD,
description = "Log messages for a specific thread",
baseType = "STRING") String thread,
@ThingworxServiceParameter(
name = LoggingConstants.PLATFORM_ID,
description = "Log message from a specific instance",
baseType = "STRING") String platformId,
@ThingworxServiceParameter(
name = LoggingConstants.ORIGIN,
description = "Specific class or log source",
baseType = "STRING") String origin,
@ThingworxServiceParameter(
name = LoggingConstants.INSTANCE,
description = "Specific class or log source",
baseType = "STRING") String instance,
@ThingworxServiceParameter(
name = LoggingConstants.SEARCH_EXPRESSION,
description = "Keywords to search content",
baseType = "STRING") String searchExpression,
@ThingworxServiceParameter(
name = LoggingConstants.SORT_FIELD_NAME,
description = "Sort field name",
baseType = "STRING") String sortFieldName,
@ThingworxServiceParameter(
name = LoggingConstants.ASCENDING_SEARCH,
description = "Ascending search indicator (true = ascending, false = descending)",
baseType = "BOOLEAN") Boolean ascendingSearch,
@ThingworxServiceParameter(
name = LoggingConstants.OLDEST_FIRST,
description = "Search/sort from oldest to newest",
baseType = "BOOLEAN") Boolean oldestFirst,
@ThingworxServiceParameter(
name = LoggingConstants.IS_REGEX,
description = "The Search expression should be treated as REGEX",
baseType = "BOOLEAN",
aspects = { "defaultValue:" + false }) Boolean isRegex,
@ThingworxServiceParameter(
name = "logName",
description = "Keywords to search content",
baseType = "STRING",
aspects = { Aspects.ASPECT_ISREQUIRED + ":true", Aspects.ASPECT_SELECTOPTIONS +
":ApplicationLog:ApplicationLog|CommunicationLog:CommunicationLog|" +
"ConfigurationLog:ConfigurationLog|ScriptLog:ScriptLog|SecurityLog:SecurityLog" }) String logName)
throws Exception {

// Create InfoTable to hold results
InfoTable logEntriesTable = new InfoTable();

// Add Field Definitions to InfoTable.
logEntriesTable.addField(new FieldDefinition(LoggingConstants.CONTENT, BaseTypes.STRING));
logEntriesTable.addField(new FieldDefinition(LoggingConstants.USER, BaseTypes.STRING));
logEntriesTable.addField(new FieldDefinition(LoggingConstants.THREAD, BaseTypes.STRING));
logEntriesTable.addField(new FieldDefinition(LoggingConstants.PLATFORM_ID, BaseTypes.STRING));
logEntriesTable.addField(new FieldDefinition(LoggingConstants.ORIGIN, BaseTypes.STRING));
logEntriesTable.addField(new FieldDefinition(LoggingConstants.INSTANCE, BaseTypes.STRING));

// TODO: Custom Log Retrieval Strategy implementation here. Add each log entry as row to logEntriesTable

return logEntriesTable;
3. Erstellen Sie ein Strategie-Ding in der Datei metadata.xml Ihrer Erweiterung.
<Things>
<Thing
enabled="true"
name="CustomLogRetrievalStrategyThing"
published="true"
thingTemplate="CustomLogRetrievalStrategy">
</Thing>
</Things>
4. Erstellen Sie ein Paket und erstellen Sie eine Erweiterung.
5. Importieren Sie die Erweiterung über ThingWorx Composer.
6. Erstellen Sie ein Ding aus der Dingvorlage CustomLogRetrievalStrategy.
7. Wechseln Sie zur Seite Konfiguration > LoggingSubsystem.
8. Wählen Sie ein in Schritt 6 erstelltes Ding als Protokollabruf-Strategie aus.
9. Gehen Sie zu Composer > Überwachung > ApplicationLog, und überprüfen Sie, ob die Protokolle aus der externen Quelle abgerufen werden.
War dies hilfreich?