Définition du modèle ThingWorx dans Composer > Système > Fichiers journaux > OpenTelemetry pour la journalisation de ThingWorx Platform > Stratégie de récupération de journaux personnalisée pour l'interrogation des journaux provenant de sources externes
Stratégie de récupération de journaux personnalisée pour l'interrogation des journaux provenant de sources externes
L'observabilité des journaux peut être obtenue grâce aux différentes applications tierces de fournisseurs de journalisation d'entreprise disponibles sur le marché. Ces applications disposent de plusieurs méthodes pour transmettre et récupérer des journaux.
Avec OpenTelemetry, les journaux sont transférés vers les applications des fournisseurs de journalisation.
L'objectif principal de cette stratégie de récupération de journaux est de récupérer les journaux d'une source tierce et de les afficher sur la page Composer > Surveillance > Journaux.
Dans le cadre de l'implémentation globale, ThingWorx fournit les éléments suivants :
Objet de stratégie par défaut DefaultLogRetrievalStrategyThing qui récupère les journaux à partir des journaux de fichiers ThingWorx et SumoLogic en fonction de la configuration
Extension SDK pour développer une stratégie de récupération de journaux personnalisée
DefaultLogRetrievalStrategyThing est un objet système. Seule sa configuration peut être mise à jour. Les utilisateurs ne sont pas censés utiliser ce modèle DefaultLogRetrievalStrategyThing pour implémenter des stratégies de récupération de journaux personnalisées.
La récupération des journaux est gérée par le service RetrieveLogs disponible avec DefaultLogRetrievalStrategyThing. La récupération des journaux repose sur,
Les journaux ne peuvent être récupérés à partir de SumoLogic que si la journalisation des fichiers est désactivée (DisableFileLogging est défini sur true) et qu'OpenTelemetry est activé (EnableOpenTelemetryForLogging est défini sur true).
Dans tous les autres cas, les journaux sont récupérés à partir des fichiers.
Dans le cas d'une implémentation personnalisée pour la récupération des journaux, le service RetrieveLogs peut être implémenté de deux manières :
Via Composer à l'aide du service JavaScript
a. Créez un objet dans Composer avec le modèle de base en tant que LogRetrievalStrategy.
b. Accédez à Services et remplacez le service RetriveLogs.
c. Spécifiez votre code JavaScript pour récupérer les journaux depuis un logiciel de journalisation tiers.
* 
En général, des fonctions de chargeur de contenu ou des fonctions similaires sont utilisées pour communiquer avec des tiers.
En créant une extension dans ThingWorx à l'aide du kit Extension SDK
a. Créez une extension dans Eclipse à l'aide de la dernière version du SDK (>= 9.6.0)
b. Créez un modèle d'objet (classe Java) avec le modèle de base en tant que LogRetrievalStrategy.
Votre classe doit étendre la classe Stratégie de récupération du journal.
c. Remplacez la méthode Java de récupération des journaux et implémentez votre code personnalisé pour récupérer les journaux à partir d'un logiciel de journalisation tiers.
d. (Facultatif) Mettez à jour le fichier metadata.xml de l'extension et créez un objet. Vous pouvez également créer un objet ultérieurement dans Composer après avoir importé l'extension.
e. Créez l'extension et importez-la dans ThingWorx.
Dans les deux cas, une fois que vous disposez d'un objet, vous devez le définir comme objet LogRetrievalStrategy dans le sous-système de journalisation.
Ce didacticiel n'aborde pas les bases de la création d'extensions ThingWorx. Il suppose que :
vous savez comment créer une extension ThingWorx ;
vous disposez du kit Extension SDK (version 9.6.0 ou ultérieure), qui inclut le modèle d'objet LogRetrievalStrategy ;
vous savez comment créer et importer une extension dans ThingWorx Platform.
Implémentation d'une stratégie de récupération de journaux personnalisée
1. Pour créer une stratégie de récupération de journaux personnalisée dans Java, créez un modèle d'objet de stratégie. Ce modèle d'objet sert de base de code pour un algorithme basé sur Java. La définition de classe pour le modèle d'objet est la suivante :
@ThingworxBaseTemplateDefinition(name = "LogRetrievalStrategy")
public class CustomLogRetrievalStrategy extends LogRetrievalStrategy{
2. Implémentation et remplacement de la méthode RetrieveLogs
@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. Créez un objet de stratégie dans le fichier metadata.xml de votre extension.
<Things>
<Thing
enabled="true"
name="CustomLogRetrievalStrategyThing"
published="true"
thingTemplate="CustomLogRetrievalStrategy">
</Thing>
</Things>
4. Packagez et créez une extension.
5. Importez l'extension via ThingWorx Composer.
6. Créez un objet à partir du modèle d'objet CustomLogRetrievalStrategy.
7. Accédez à la page LoggingSubsystem > Configuration.
8. Sélectionnez un objet créé à l'étape 6 en tant que Stratégie de récupération du journal.
9. Accédez à Composer > Surveillance > ApplicationLog et vérifiez si les journaux sont récupérés à partir de la source externe.
Est-ce que cela a été utile ?