본문 바로가기
Xcode/IOS

IOS) OSLog를 통한 통합 로그 시스템 (feat : Logger , os_log)

by 후르륵짭짭 2023. 6. 6.
728x90
반응형

어느 보드게임에서 만난 사자

안녕하세요. 후르륵짭짭입니다.

벌써 한해의 절반이 지나갔네요,,, 시간이 너무 빠른 느낌입니다.

진짜 한 것도 없는데, 너무 시간이 빠르게 흘러가서 걱정이네요.

그래서 아직 올해가 끝나기 6개월이나 남았으니 발 빠르게 움직여서 후회 없이 올해를 보내고 싶습니다.

 

사내에서 작업 하다 보니 QA 팀에서 앱을 테스팅 하는데 에러가 발생하면 특정 아이폰에서 지속적으로 발생하는 에러가 있습니다.

내가 하면 안되고 남이 하면 재현 되는 에러들,,, 이런 것들을 잡기 위해서는 로그가 필요한데, 

일반적인 Print를 사용해서는 알기가 어렵습니다.

 

** Logging ** 

이미지를 클릭하면 애플 공식 문서로 이동 합니다.

애플에서는 통합 로깅 API를 제공하고 있습니다.

API에 대해 설명하기 전에 애플에서는 Console App에 대해 먼저 설명하도록 하겠습니다.

이런 앱이 존재하는데, 위의 것을 클릭하면 아래와 같이 로그가 나옵니다.

위와 같이 나오고 유형 / 시간 / 프로세스 / 메시지 이렇게 구분되어 로그가 찍히게 됩니다.

유형 스티커로 휘발성 오류(노랑색) 인지 아니면
주요 오류(빨강색)인지 구분해줍니다.
시간 로그가 찍힌 시점입니다.
프로세스 로그가 찍힌 프로세스 입니다. 
메시지 로그의 내용 입니다.

이렇게 로그를 Console App을 통해서 확인 할 수 있습니다.

 

** 사용 방법 **

 - IOS14 - 

만약 사용하고 있는 앱이 (iOS 14.0+),(iPadOS 14.0+) 등등 이상이라면 Logger를 사용하면 됩니다.

import OSLog

let osLog = OSLog(subsystem: "com.testApp", category: "TEST")
let log = Logger(osLog)

이렇게 로그를 찍기 위한 객체를 만들어 줍니다.

OSLog는 subsystem (하위 시스템) , category (카테고리)를 지정할 수 있는 객체입니다.

위에 처럼 Logger에 OSLog에 넣어준다면 Console App에서 쉽게 검색이 가능해 집니다.

log를 보면 정말 많은 API를 제공하고 있는데, 다 볼 필요는 없고 여기서 아래 4가지만 주로 보면 될 듯 합니다.

debug console App에 찍히지 않고 Xcode console에만 찍히는 용도
log level : 로그의 특징을 지정 가능 합니다 (debug, default, error 등)
message : 로그를 적는 겁니다.
critical 유형에 빨강색 스티커가 붙습니다.
warning 유형에 노랑색 스티커가 붙습니다.

위의 내용을 토대로 아래와 같이 작성한다면 

이렇게 Xcode에서는 아래와 같이 나오지만 

Console App에서는 아래와 같이 나옵니다.

위의 내용을 보면 Debug로 되어 있는 내용은 Xcode Console에 나오지 않습니다.

또한 여기서 참고할 내용으로 특정 값을 String으로 변경 해주는 \() 에 privacy를 통해 해당 값을 공개할지 말지 선택할 수 있습니다.

위에 Console App 사진을 보면 <private>라고 되어 있는데, privacy를 private로 설정 했기 때문입니다.

Default는 공개 입니다.

 

- 기본적인 방식 - 

기본적인 방식은 os_log 방식이 있습니다.

os_log도 Logger와 큰 차이는 없습니다.

debug일 경우에는 Xcode console에서만 보이고 그 외에는 console App에도 보입니다.

다만 차이가 있다면 하위 시스템을 지정할 수 있는 OSLog를 사용하면 로그를 사용하는 방식이 달라집니다.

기존 방식은 위에 이미지와 같이 로그 레벨과 로그 메시지로만 구성이 되어 있었다면

os_log(로그 레벨 , 로그 메시지)

하위 시스템을 지정하는 OSLog를 사용할 때는 해당 방식이 아래 이미지 처럼 변경 되어야 합니다.

즉 C에서 사용하던 출력용 포맷 인수 형태(%d , %s 등)로 넣어줘야한다는 겁니다.

os_log(로그레벨 , 시스템 로그 , 로그메시지 , 포맷 인수 값)

 

하지만 이러한 방식도 아래와 같이 하면 해결이 가능 합니다.

 

지금 까지 OSLog를 알아봤는데, 이걸 어떻게 공통의 API를 만드는지가 더 중요합니다.

구글에 검색하면 다양한 방식으로 구조화한 것이 있으니 참고하면 좋을 듯 싶습니다.

 

** 참고 사이트 ** 

- OSLog -

https://zeddios.tistory.com/979

 

os_log

안녕하세요 :) Zedd입니다. 백준 문제를 풀고 있는데, '내가 시간초과가 나는건 Swift의 print문이 느려서야' (아무 근거 없음) -> 'print문 말고 다른걸 쓰자' -> 'os_log..? 이게 뭐지..? 이름을 보니 빨라보

zeddios.tistory.com

https://velog.io/@ryan-son/Swift-%ED%86%B5%ED%95%A9-%EB%A1%9C%EA%B9%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9C%BC%EB%A1%9C-%EB%A1%9C%EA%B9%85-%ED%95%B4%EB%B3%B4%EC%9E%90-OSLog

 

[Swift] 통합 로깅 시스템으로 로깅 해보자!: OSLog

Unified Logging System에 대해 들어보신 적이 있나요? 여러분들은 메시지 로깅을 어떤 방식으로 하시나요? 애플이 권장하는 로깅 방식인 os_log에 대해 알아볼까요?

velog.io

https://leeari95.tistory.com/62

 

[Swift] OSLog란? 그리고 StaticString은 뭘까?

안녕하세요. 아리입니다. 🐥 어느날 프로젝트를 하고 있는데, 리뷰어 엘림에게 이런 피드백을 받았습니다. 개발자에게만 어떤 에러가 발생했을 때 알려주기 위해 print문을 사용했었는데, 따로

leeari95.tistory.com

https://sunidev.tistory.com/m/77

 

[iOS/Swift] OSLog (with. extension)

항상 새 프로젝트를 시작할 때 로깅 라이브러리를 적용하고 있는데, Lumberjack을 사용하다가 김종권님 블로그에서 OSLog라는 로깅 프레임워크를 알게 되었어요. 📌 이번 글은 OSLog 개념과 적용부터

sunidev.tistory.com

 

- 주석 처리 - 

https://jintaewoo.tistory.com/50

 

[Swift] Documentation Comments

문서화를 위해 주석을 잘 작성하는 법에 대해 알아보았습니다. 애플의 주석은 마크다운의 문법과 비슷해서 누구든 쉽게 사용할 수 있습니다. 기본 주석 규칙 한 줄 주석에는 3개의 슬래시(///)를

jintaewoo.tistory.com

 

- 젠킨스로 CI 배포 방법 - 

https://blog.hwahae.co.kr/all/tech/5706

 

iOS 플랫폼의 Jenkins CI 환경 구축하기 – 화해 블로그 | 기술 블로그

Jenkins CI 화해 개발팀 iOS 플랫폼은 전에 사용하던 Travis CI가 있었음에도 불구하고 왜 Jenkins CI를 자체 구축하게 되었는지와 어떻게 구축하고 활용하고 있는지에 대해 공유해보고자 합니다.

blog-wp.hwahae.co.kr

 

- 깃 서브 모듈 사용 방법 -

https://stackoverflow.com/questions/29882960/changing-an-existing-submodules-branch

 

Changing an existing submodule's branch

When I initially added my submodule, I specified a particular branch, as seen in the .gitmodule file: [submodule "externals/grpc/grpc"] path = externals/grpc/grpc url = git@github.com:me/g...

stackoverflow.com

 

728x90
반응형

댓글