[Swift] 센트리(Sentry)를 사용해보자!

2020. 4. 6. 15:33iOS/Swift

백엔드쪽에서는 많이 사용한다고 해요! 전 처음들어봤음 헤헤(사실 아는거 없음)

 

 

현재 내가 작성하는 동안은 문서는 swift에 대해선 별로 설명 안해주는거 같음..(5.0.0 베타로 업데이트 되어서 제가 못 찾은거임 ㅠ)

Application Monitoring and Error Tracking Software

여기서는 그냥 내가 이래저래 삽질한걸 적은 글..

 

센트리란?

센트리는 오류 로그, 오류 스택 트레이스를 모아서 보여주는 서비스로 오픈소스로 쉽게 설치 가능.

회사에서 사용하게 된 배경은 서버에서 로그를 쌓지 않고 있었고,

파이어베이스에서 익셉션 오류로 보여줄까 했지만 다른 크래시랑 겹칠경우 보기가 힘들다는 이유,

ga는 갯수가 제한적이다라는 이유로 채택하게 되었다. (솔직히 CS용)

센트리가 패브릭보단 약간 오류 추적에 특화되어있는 느낌?

센트리 설치하기!

우선 새 프로젝트를 생성해줍니다.

아이콘 무슨일

iOS가 popular하지 않구나...  아이콘 무슨일...

무튼 플랫폼 설정하고 언제 알림 받을지 설정하고 프로젝트 이름을 만든다!

 

그러면 다음 장에 친절하게 설치 방법을 알려준다!

세개 중 니맘대로 선택해서 설치해. swift or objc도 친절하게 알려줌!

저는 코코아팟으로 설치했습니다ㅎ_ㅎ + swift

그리고 문서에 dsn이랑 적혀있으니 그대로 복붙해서 붙여주시면 됩니다!

// Appdelegate.swift

import Sentry

func application(_ application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Create a Sentry client and start crash handler
    do {
        Client.shared = try Client(dsn: "Here Dsn!!!")
        try Client.shared?.startCrashHandler()
    } catch let error {
        print("\(error)")
    }

    return true
}

 

+) 2020.03.30

문서가 오래된게 아니라 제가 오래된거네요.

저는 4.5.0으로 했는데 문서가 5.0.0베타였습니다ㅜㅜ

그래서 좀 다를수 있어요.

그리고 문서에 dsn이랑 적혀있으니 그대로 복붙해서 붙여주시면 되요!

 

그리고 sentry-cli를 설치!

sentry-cli를 눌러 들어가면 

여기서 Source code를 받아서 저 경로에 넣어주면 돼요!

혹시 저 경로를 못찾으시겠다면 cmd+shift+G

거기에 저는 1.51.1을 지우고 넣어줬습니다..

(이 부분은 제가 제대로한게 맞는지 모르겠어요..)

Auth Token을 받으러 갑시당

 

여기서 Create New Token을 클릭

그러면 이미 체크된 박스가 몇개 있는 화면이 나타나는데 전 그냥 create token해줬어요ㅎ..

생성된 토큰이 있는 화면은 일단 끄지말고

if which sentry-cli >/dev/null; then
export SENTRY_ORG=AccountName
export SENTRY_PROJECT=ProjectName
export SENTRY_AUTH_TOKEN=YOUR_AUTH_TOKEN
ERROR=$(sentry-cli upload-dif "$DWARF_DSYM_FOLDER_PATH" 2>&1 >/dev/null)
if [ ! $? -eq 0 ]; then
echo "warning: sentry-cli - $ERROR"
fi
else
echo "warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases"
fi

위 코드를 Build Parse - New RunScript를 생성하여 거기에 붙여넣어줍시다

SENTRY_ORG, SENTRY_PROJECT는 미리 작성되어있기에 따로 건들이지 않으셔도 되고,

SENTRY_AUTH_TOKEN 에는 아까 생성한 AuthToken을 붙여넣어줍시다.

아 딱히 안 읽으셔도 되는데 sentry-cli 설치를 잊고 빌드했을때 cli가 설치되지 않았다는 오류가 나오면서 빌드가 되지 않았어요;

그리고 저는 Xcode가 10 이상이기에 Input Files에

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}

를 추가해줬습니다!

그러면 이렇게 프로젝트 설정은 끝!

빌드가 되는지 한번 확인 해주시고 하단의 확인을 눌러주시면 됩니다!

이벤트를 생성해보자

눈을 왜 그렇게 떠?

로봇이 크래시 내라고 말하는듯

뷰에 버튼 하나를 만들어서

import UIKit
import Sentry

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func errorSend(_ sender: UIButton) {
        Client.shared?.crash()
    }
}

이렇게 만들어주고 빌드해주고 버튼을 누르면 

이렇게 bad access가 뜨지만 Issues에는 뜨지 않아요.

왜냐면 빌드 중이니까,,, 그건 인정 ㄴㄴ하는듯

빌드를 멈추고 다시 버튼을 누르면

oh...

오옹,,,

 

이벤트를 커스텀해보자

이거는 대충 제가 한거만 보여드릴게요

자세한건 문서를 보시면서 하시면 될듯 합니다

let param: [String: String] = [
    "name": "min_e",
    "context": "I'm hungry."]

let message = param.map { $0.key + " = " + $0.value }.joined(separator: "\n")
let event = Event(level: .debug)
let exception = Exception(value: message, type: "exception")
event.exceptions = [exception]
let frame = Frame()
frame.fileName = #file
frame.function = #function
frame.lineNumber = #line
let stacktace = Stacktrace(frames: [frame], registers: ["name": "Min"])
event.stacktrace = stacktace
Client.shared?.send(event: event)

이런 식으로 버튼에 그냥 아무거나 넣어줬어요

크래시가 아닌 이상 빌드하면서 눌러도 리스트에 뜨긴 뜨는데 좀 실시간이라기보단 조금 시간 차가 있어요

와우 이렇게 제가 조합한 것들이 막 오네요!

여기는 저도 뭘 조금 더 알아봐야 할 거같네요👀

registers에 뭐가 안나오는건 상단에 뭔 오류가 났는데 저도 잘 이해를 못함 ㅎ

되게 세세하게 알려줍니다

전체 캡쳐를 보여드리진 못하지만(어디까지가 민감정보인지 몰라서)

문서 보면서 해보면 좋을 거 같아요:)

 

그럼 즐코딩하세요:)