본문 바로가기
WIKI 기술 지식 베이스

iOS 로그 수집

원문 보기 위키 갱신

Datadog의 dd-sdk-ios 클라이언트 측 로깅 라이브러리를 사용해 iOS 애플리케이션에서 Datadog로 로그를 보내고 다음 기능을 활용할 수 있어요:

  • JSON 형식으로 기본 제공되는 형태로 Datadog에 로그 기록.
  • 기본 속성을 사용하고 보내는 모든 로그에 사용자 정의 속성 추가.
  • 실제 클라이언트 IP 주소와 User-Agent 기록.
  • 자동 벌크 게시로 최적화된 네트워크 사용량 활용.

dd-sdk-ios 라이브러리는 iOS 11 이상의 모든 버전을 지원해요.

출처: 문서

본문

설정

  1. 패키지 매니저에 따라 라이브러리를 의존성으로 선언하세요. Swift Package Manager를 권장해요.

{% tab title="Swift Package Manager (SPM)" %} Apple Swift Package Manager로 통합하려면 Package.swift에 다음을 의존성으로 추가하세요:

.package(url: "https://github.com/Datadog/dd-sdk-ios.git", .upToNextMajor(from: "2.0.0"))

프로젝트에서 다음 라이브러리를 연결하세요:

DatadogCore
DatadogLogs

{% /tab %}

{% tab title="CocoaPods" %} CocoaPods를 사용해 dd-sdk-ios를 설치할 수 있어요:

pod 'DatadogCore'
pod 'DatadogLogs'

{% /tab %}

{% tab title="Carthage" %} Carthage를 사용해 dd-sdk-ios를 설치할 수 있어요:

github "DataDog/dd-sdk-ios"

Xcode에서 다음 프레임워크를 연결하세요:

DatadogInternal.xcframework
DatadogCore.xcframework
DatadogLogs.xcframework

{% /tab %} 애플리케이션 컨텍스트와 Datadog 클라이언트 토큰으로 라이브러리를 초기화하세요. 보안상의 이유로 클라이언트 토큰을 사용해야 해요. Datadog API 키는 iOS 애플리케이션 IPA 바이트 코드에서 클라이언트 측에 노출되므로 dd-sdk-ios 라이브러리 구성에 사용할 수 없어요. 클라이언트 토큰 설정에 대한 자세한 내용은 클라이언트 토큰 문서를 참고하세요.

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: app.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: app.datadoghq.eu

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .eu1,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite eu1];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: us3.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .us3,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us3];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: us5.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .us5,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us5];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: app.ddog-gov.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .us1_fed,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us1_fed];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: us2.ddog-gov.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .us2_fed,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us2_fed];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: ap1.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .ap1,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite ap1];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: ap2.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .ap2,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite ap2];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

{% callout %}

다음 Datadog 사이트 사용자를 위한 중요 참고 사항: uk1.datadoghq.com

{% tab title="Swift" %}

import DatadogCore
import DatadogLogs

Datadog.initialize(
	with: Datadog.Configuration(
		clientToken: "<client token>",
		env: "<environment>",
		site: .uk1,
		service: "<service name>"
	),
	trackingConsent: trackingConsent
)

Logs.enable()

{% /tab %}

{% tab title="Objective-C" %}

@import DatadogLogs;

DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite uk1];

[DDDatadog initializeWithConfiguration:configuration
                       trackingConsent:trackingConsent];

DDLogsConfiguration *logsConfiguration = [[DDLogsConfiguration alloc] initWithCustomEndpoint:nil];
[DDLogs enableWith:logsConfiguration];

{% /tab %}

{% /callout %}

GDPR 규정을 준수하기 위해 SDK는 초기화 시 trackingConsent 값을 요구해요. trackingConsent는 다음 값 중 하나가 될 수 있어요:

  • .pending: SDK가 데이터를 수집·배칭하지만 Datadog로는 보내지 않아요. SDK는 새 추적 동의 값을 기다렸다가 배칭된 데이터를 어떻게 처리할지 결정해요.
  • .granted: SDK가 데이터를 수집해 Datadog로 보내요.
  • .notGranted: SDK가 어떤 데이터도 수집하지 않아요: 로그, 트레이스, RUM 이벤트가 Datadog로 보내지지 않아요.

SDK 초기화 후 추적 동의 값을 변경하려면 Datadog.set(trackingConsent:) API 호출을 사용하세요.

SDK는 새 값에 따라 동작을 바꿔요. 예를 들어 현재 추적 동의가 .pending이라면:

  • .granted로 변경하면 SDK가 현재 및 향후 모든 데이터를 Datadog로 보내요.
  • .notGranted로 변경하면 SDK가 현재 모든 데이터를 지우고 향후 데이터 수집을 중단해요.

데이터가 Datadog로 업로드되기 전에는 애플리케이션 샌드박스의 캐시 디렉터리(Library/Caches)에 일반 텍스트로 저장돼요. 이 캐시 디렉터리는 디바이스에 설치된 다른 어떤 앱도 읽을 수 없어요.

애플리케이션을 작성할 때 개발 로그를 활성화하면 제공된 레벨 이상의 우선순위를 가진 SDK의 모든 내부 메시지를 콘솔에 기록해요.

{% tab title="Swift" %}

Datadog.verbosityLevel = .debug

{% /tab %}

{% tab title="Objective-C" %}

DDDatadog.verbosityLevel = DDSDKVerbosityLevelDebug;

{% /tab %} Logger를 구성하세요: 참고: 로거는 반드시 Logs.enable() 호출 이후에 만들어야 해요. {% tab title="Swift" %}

let logger = Logger.create(
	with: Logger.Configuration(
		name: "<logger name>",
		networkInfoEnabled: true,
		remoteLogThreshold: .info,
		consoleLogFormat: .shortWith(prefix: "[iOS App] ")
	)
)

{% /tab %}

{% tab title="Objective-C" %}

DDLoggerConfiguration *configuration = [[DDLoggerConfiguration alloc] init];
configuration.networkInfoEnabled = YES;
configuration.remoteLogThreshold = [DDLogLevel info];
configuration.printLogsToConsole = YES;

DDLogger *logger = [DDLogger createWithConfiguration:configuration];

{% /tab %} 다음 메서드 중 하나로 사용자 정의 로그 항목을 Datadog로 직접 보내세요: {% tab title="Swift" %}

logger.debug("A debug message.")
logger.info("Some relevant information?")
logger.notice("Have you noticed?")
logger.warn("An important warning…")
logger.error("An error was met!")
logger.critical("Something critical happened!")

{% /tab %}

{% tab title="Objective-C" %}

[logger debug:@"A debug message."];
[logger info:@"Some relevant information?"];
[logger notice:@"Have you noticed?"];
[logger warn:@"An important warning…"];
[logger error:@"An error was met!"];
[logger critical:@"Something critical happened!"];

{% /tab %}

참고: 새로 생성된 RUM 뷰에 사용자 정의 iOS 로그를 추가하려면 viewDidAppear 메서드로 적용하세요. viewDidLoad처럼 viewDidAppear가 발생하기 전에 로그를 적용하면, 기술적으로 여전히 활성 뷰인 이전 RUM 뷰에 로그가 적용돼요. (선택 사항) 로그 메시지와 함께 attributes 맵을 제공해 생성되는 로그에 속성을 추가하세요. 맵의 각 항목이 속성으로 추가돼요. {% tab title="Swift" %}

logger.info("Clicked OK", attributes: ["context": "onboarding flow"])

{% /tab %}

{% tab title="Objective-C" %}

[logger info:@"Clicked OK" attributes:@{@"context": @"onboarding flow"}];

{% /tab %}

고급 로깅

초기화

Datadog로 로그를 보내도록 로거를 초기화할 때 Logger.Configuration의 다음 메서드를 사용할 수 있어요:

메서드 설명
Logger.Configuration.networkInfoEnabled 모든 로그에 network.client.* 속성을 추가해요. 기본으로 기록되는 데이터는 reachability (yes, no, maybe), available_interfaces (wifi, cellular 등), sim_carrier.name(예: AT&T - US), sim_carrier.technology (3G, LTE 등), sim_carrier.iso_country(예: US)이에요.
Logger.Configuration.service Datadog로 보내는 모든 로그에 붙는 service 표준 속성 값을 설정해요.
Logger.Configuration.consoleLogFormat 로그를 디버거 콘솔로 보내요.
Logger.Configuration.remoteSampleRate Datadog로 보내는 로그의 샘플링 비율을 설정해요.
Logger.Configuration.name Datadog로 보내는 모든 로그에 붙는 logger.name 속성 값을 설정해요.

글로벌 구성

다음 메서드에 따라 지정된 로거가 보내는 모든 로그에 태그·속성을 추가하거나 제거하세요.

글로벌 태그
태그 추가

addTag(withKey:value:) 메서드를 사용해 특정 로거가 보내는 모든 로그에 태그를 추가하세요:

{% tab title="Swift" %}

// This adds a tag "build_configuration:debug"
logger.addTag(withKey: "build_configuration", value: "debug")

{% /tab %}

{% tab title="Objective-C" %}

[logger addTagWithKey:@"build_configuration" value:@"debug"];

{% /tab %}

<TAG_VALUE>는 String이어야 해요.

태그 제거

removeTag(withKey:) 메서드를 사용해 특정 로거가 보내는 모든 로그에서 태그를 제거하세요:

{% tab title="Swift" %}

// This removes any tag starting with "build_configuration"
logger.removeTag(withKey: "build_configuration")

{% /tab %}

{% tab title="Objective-C" %}

[logger removeTagWithKey:@"build_configuration"];

{% /tab %}

자세한 내용은 태그 시작하기를 참고하세요.

글로벌 속성
속성 추가

기본적으로 로거가 보내는 모든 로그에 다음 속성이 추가돼요:

  • http.useragent와 여기서 추출한 device, OS 속성
  • network.client.ip와 여기서 추출한 지리적 속성(country, city)
  • logger.version, Datadog SDK 버전
  • logger.thread_name, (main, background)
  • version, Info.plist에서 추출한 클라이언트 앱 버전
  • environment, SDK를 초기화할 때 사용한 환경 이름

addAttribute(forKey:value:) 메서드를 사용해 특정 로거가 보내는 모든 로그에 사용자 정의 속성을 추가하세요:

{% tab title="Swift" %}

// This adds an attribute "device-model" with a string value for this logger instance.
logger.addAttribute(forKey: "device-model", value: UIDevice.current.model)

{% /tab %}

{% tab title="Objective-C" %}

[logger addAttributeForKey:@"device-model" value:UIDevice.currentDevice.model];

{% /tab %}

다음을 사용해 모든 Logs 인스턴스에 걸쳐 속성을 전역으로 추가할 수 있어요(예: 서비스 이름, 환경):

{% tab title="Swift" %}

// This adds an attribute "device-model" with a string value in all Logs instances.
Logs.addAttribute(forKey: "device-model", value: UIDevice.current.model)

{% /tab %}

{% tab title="Objective-C" %}

[Logs addAttributeForKey:@"device-model" value:UIDevice.currentDevice.model];

{% /tab %}

<ATTRIBUTE_VALUE>는 String, Date, 사용자 정의 Codable 데이터 모델 등 Encodable을 준수하는 무엇이든 될 수 있어요.

속성 제거

removeAttribute(forKey:) 메서드를 사용해 특정 로거가 보내는 모든 로그에서 사용자 정의 속성을 제거하세요:

{% tab title="Swift" %}

// This removes the attribute "device-model" from all further logs sent from this logger instance.
logger.removeAttribute(forKey: "device-model")

{% /tab %}

{% tab title="Objective-C" %}

[logger removeAttributeForKey:@"device-model"];

{% /tab %}

모든 Logs 인스턴스에서 글로벌 속성을 제거하려면:

{% tab title="Swift" %}

// This removes the attribute "device-model" from all further logs sent from all logger instances.
Logs.removeAttribute(forKey: "device-model")

{% /tab %}

{% tab title="Objective-C" %}

[Logs removeAttributeForKey:@"device-model"];

{% /tab %}

더 알아보기 (Learn more)