ThingWorx 관찰성 > ThingWorx Platform에서 로깅을 위한 OpenTelemetry 지원 > 외부 로그에 대한 사용자 정의 로그 검색 전략
외부 로그에 대한 사용자 정의 로그 검색 전략
개요
ThingWorx Platform에서 로그 관찰성은 다양한 타사 로깅 응용 프로그램을 통해 지원됩니다. 이러한 응용 프로그램은 로그를 푸시하고 검색하는 여러 방법을 제공합니다. 사용자 정의 로그 검색 전략을 사용하여 타사 로깅 응용 프로그램의 로그를 표시할 수 있습니다. OpenTelemetry는 로그를 이러한 응용 프로그램에 푸시하고 ThingWorx Platform은 해당 로그를 검색하여 표시합니다. 이러한 로그는 Composer > 모니터링 > 로그에서 확인할 수 있습니다.
ThingWorx Platform은 다음을 제공합니다.
DefaultLogRetrievalStrategyThing - 구성에 따라 ThingWorx 파일 로그 또는 Sumo Logic에서 로그를 검색합니다.
* 
DefaultLogRetrievalStrategyThing은 시스템 객체입니다. 해당 구성을 업데이트할 수는 있지만 사용자 정의 로그 검색 전략의 템플릿으로 사용할 수는 없습니다.
Extension SDK - 사용자 정의 로그 검색 전략을 개발할 수 있습니다.
RetrieveLogs 서비스
DefaultLogRetrievalStrategyThing에서 제공되는 RetrieveLogs 서비스는 로그 검색을 처리합니다.
로그 검색은 다음에 의해 결정됩니다.
파일 로깅이 비활성화(DisableFileLoggingtrue로 설정됨)되고, OpenTelemetry가 활성화(EnableOpenTelemetryForLoggingtrue로 설정됨)된 경우 Sumo Logic에서 로그가 검색됩니다.
다른 모든 경우에는 ThingWorx 파일 로그에서 로그가 검색됩니다.
RetrieveLogs 서비스는 다음 방법 중 하나로 구현할 수 있습니다.
JavaScript 서비스를 사용하여 Composer를 통해
a. LogRetrievalStrategy 기본 템플릿을 사용하여 Composer에서 사물을 만듭니다.
b. 서비스를 클릭하고 RetriveLogs 서비스를 재정의합니다.
c. 외부 로깅 공급자 응용 프로그램에서 로그를 검색하려면 JavaScript 코드를 입력합니다.
타사 시스템과 통신하려면 콘텐츠 로더 또는 유사한 함수를 사용합니다.
Extension SDK를 사용하여 확장을 만들어
a. 최신 SDK 버전을 사용하여 Eclipse에서 확장을 만듭니다.
b. LogRetrievalStrategy 기본 템플릿으로 사물 템플릿(Java 클래스)을 만듭니다.
해당 클래스는 LogRetrievalStrategy 클래스를 확장해야 합니다.
c. 로그 검색 Java 메소드를 재정의하고 사용자 정의 코드를 구현하여 외부 로깅 공급자 응용 프로그램에서 로그를 검색합니다.
d. 확장의 metadata.xml 파일을 업데이트하고 사물을 만들 수 있습니다. 또는 확장을 가져온 후 Composer에서 나중에 사물을 만들 수 있습니다.
e. 확장을 빌드하고 확장을 ThingWorx Composer로 가져옵니다.
두 경우 모두 사물을 생성한 후 로깅 하위 시스템에서 LogRetrievalStrategy 사물로 설정합니다.
사전 요구 사항
시작하기 전에 다음을 확인하십시오.
ThingWorx Platform 확장을 빌드하는 방법을 이해하고 있습니다.
Extension SDK(버전 9.6.0 이상)가 있습니다(LogRetrievalStrategy 사물 템플릿 포함).
ThingWorx Extension을 빌드하고 ThingWorx Platform으로 가져오는 방법을 알고 있습니다.
사용자 정의 로그 검색 전략 구현
Java에서 사용자 정의 로그 검색 전략을 만들려면 다음을 수행하십시오.
1. 전략 사물 템플릿을 만듭니다. 사물 템플릿은 Java 기반 알고리즘의 코드 베이스로 작동합니다. 사물 템플릿에 대한 클래스 정의는 다음과 같습니다.
@ThingworxBaseTemplateDefinition(name = "LogRetrievalStrategy")
public class CustomLogRetrievalStrategy extends LogRetrievalStrategy{
2. 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. 확장의 metadata.xml 파일에 전략 사물을 만듭니다.
<Things>
<Thing
enabled="true"
name="CustomLogRetrievalStrategyThing"
published="true"
thingTemplate="CustomLogRetrievalStrategy">
</Thing>
</Things>
4. 확장을 패키지하고 빌드합니다. 자세한 내용은 경로 B: 솔루션을 확장으로 패키징 및 배포를 참조하십시오.
5. ThingWorx Composer에 확장을 가져옵니다.
6. CustomLogRetrievalStrategy 사물 템플릿에서 사물을 만듭니다.
7. LoggingSubsystem > 구성을 클릭합니다.
8. 6단계에서 만든 사물을 로그 검색 전략으로 선택합니다.
9. Composer > 모니터링 > ApplicationLog를 클릭하여 로그가 외부 소스에서 검색되는지 여부를 확인합니다.
관련 항목
도움이 되셨나요?