티스토리 뷰

공부

os_log

Zedd0202 2020. 3. 22. 16:54
반응형

 

안녕하세요 :) Zedd입니다.

백준 문제를 풀고 있는데, 


'내가 시간초과가 나는건 Swift의 print문이 느려서야' (아무 근거 없음)

-> 'print문 말고 다른걸 쓰자'

-> 'os_log..? 이게 뭐지..? 이름을 보니 빨라보이는군...'

-> 물론 이걸로 풀지는 못함.


 

이 흐름으로 os_log의 존재를 처음 알게되었습니다. 😳

큼큼...암튼 os_log에 대해서 공부해보려고 합니다.

 

먼저, 이 로깅에 대해서 찾다보면,

"unified logging system"이라는 말이 많이 보는데, 이거 먼저 알아볼게요!

unified logging system은 번역하자면, "통합 로깅 시스템"인데요! 

모든 level의 시스템에서 메시징을 캡쳐할 수 있는 효율적인 단일 고성능 API를 제공한다고 합니다!

이 unified logging system은 로그 데이터 저장을 메모리와 디스크의 데이터 저장소에 모읍니다.(centralizes) 

참고로, 이 unified logging system은 iOS 10.0 이상, macOS 10.12 이상, tvOS 10.0 이상 및 watchOS 3.0 이상에서 사용 가능하며 

ASL (Apple System Logger) 및 Syslog API를 대체합니다

unified logging system에 메세지를 보내려면, os_log 함수를 호출하면 된다고 합니다!

그럼 해봅시다..!!

 

os_log 함수를 쓰려면 "os" 프레임워크를 import해줘야합니다. 

그리고

일단 대충 이렇게 해줘봅니다. 그러고 실행하면

콘솔창에 현재 시간이랑, 프로젝트 이름,([:]안에 있는건 모르겠음)

그리고 제가 쓴 메세지가 나오네요!

 

"모든 level의 시스템에서 메시징을 캡쳐할 수 있는 효율적인 단일 고성능 API를 제공한다고 합니다!"

라고 그랬잖아요..! 요 level들을 살펴봅시다. level들에는

Default - 처음에는 메모리 버퍼에 저장. 메모리 버퍼가 가득 차면, 압축되어 데이터 저장소로 이동. 저장소 할당량을 초과할 때 까지 이 위치에 남아있으며, 이 시점에서 가장 오래된 메시지가 제거. 이 레벨을 사용하여 failure를 일으킬 수 있는 사항에 대한 정보를 캡쳐하세요.

Info - 처음에는 메모리 버퍼에 저장. configuration을 변경하지 않으면 데이터 저장소로 이동되지 않으며, 메모리 버퍼가 가득차면 제거. 그러나 faults나 error가 발생하면 데이터 저장소에서 캡쳐. info-level 메세지가 데이터 저장소에 추가되면 저장소 할당량을 초과할 때 까지 해당 메시지가 유지. 이 시점에서 가장 오래된 메시지가 제거. 이 레벨을 사용하여 오류 문제 해결에 도움이 될 수 있지만 필수적인 것은 아닌 것을 캡쳐하세요.

Debug - configuration변경을 통해 디버그 로깅이 활성화된 경우에만 메모리에서 캡쳐. configuration의 지속성 설정에 따라 제거됨. 이 level에서 기록된 메세지에는 개발 중 or 특정 문제를 해결하는 동안의 유용한 정보가 포함됨. 디버그 로깅은 개발 SW가 아닌 개발 환경에서 사용하기 위한 것. 

Error - 항상 데이터 저장소에 저장됨. 저장소 할당량을 초과 할 때 까지 위치에 남아있으며, 이 시점에서 가장 오래된 메시지가 제거됨. error level 메세지는 process-level 오류를 보고하기 위한 것. activity object가 존재하고 이 level에서 로깅한다면, 전체 프로세스 체인에 대한 정보가 캡쳐됨.

Fault - 항상 데이터 저장소에 저장됨. 저장소 할당량을 초과 할 때 까지 이 위치에 남아있으며 이 시점에서 가장 오래된 메세지가 제거됨. 이 메세지는 시스템 레벨 또는 다중 프로세스 오류만 캡쳐하기 위한 것. activity object가 존재하고 이 level에서 로깅한다면, 전체 프로세스 체인에 대한 정보가 캡쳐됨.

이 있습니다. 그냥 문서에 나와있는 설명 쓰긴 했는데..

제가 지금 잘 몰라서 그럴수도 있지만 뭐 어디 저장된다는거는 딱히 중요하다느 생각이..안드네요

큼큼

사용방법은,

이렇게 타입을 넘기면 됩니다.

console창에는 아까랑 똑같이 나올텐데, 이걸 유용하게 보는 방법이 있죠. 쿠쿠

console앱을 열어줍니다.

그리고 제가 지금 테스트 하고 있는 시뮬레이터 or 디바이스를 선택해주면 로그들을 엄청 많이 볼 수 있는데요, 검색을 해줍시다.

짜잔 

지금은 default로 type을 넘겼죠? error로 넘겨볼게요.

유형에 노란색점이 생겼죠? 그리고 오른쪽 아래에 "오류"라고 나오네요,

fault로 타입을 바꿔보겠습니다. 

자 이번엔 빨간색이네요! 

더 유용하게? 쓰려면 필터링을 더 자세하게 하면 됩니다. 

메세지 유형이 결함 && 메세지에 안녕이 들어있는거만 볼 수 있습니다

저렇게 필터를 추가하는 방법은 그냥 검색에 아무거나 쓰고 엔터를 누르면...생깁니다. 

 

자 지금은 level로 필터링을 했죠? 우리가 출력한 log를 클릭해보면

저렇게 하위시스템과 카테고리가 --로 나오는 것을 볼 수 있어요. 

이 하위시스템과 카테고리도 지정 할 수 있습니다! OSLog를 통해서요.

이렇게 하고 실행해보면

[UI] 이게 추가된게 보이시죠!?

콘솔앱에서 봅시다. 

저렇게 하위시스템과 카테고리가 추가된게 보이시죠?

역시나 필터링 조건으로 넣을 수 있습니다.

이렇게요!

출처 https://www.lordcodes.com/articles/clear-and-searchable-logging-in-swift-with-oslog

이렇게 OSLog extension안에 사용하고 싶은 카테고리를 static으로 정의해놓으면

이런식으로 사용할 수 있겠죠!?

 

console앱을 사용해서 막 로깅하고 이런거 잘 몰랐어서..!!! 안했는데

앞으로 console앱을 애용해야겠어요 :D

그리고 OSLog는 Apple이 권장하는 로깅 방식이래요!

그러니 print나 NSLog보다는 OSLog를 사용하도록 합시다 XD

 

참고 :

https://developer.apple.com/documentation/os/os_log

 

os_log - os | Apple Developer Documentation

Sends a message at a specific logging level, such as default, info, debug, error, or fault, to the logging system.

developer.apple.com

https://www.lordcodes.com/articles/clear-and-searchable-logging-in-swift-with-oslog

 

Clear and searchable logging in Swift with OSLog

Logging is a useful tool for diagnosing issues and working out what an app is doing. We will explore Apple’s currently recommended way of logging via OSLog, covering how to use it and managing its differences when compared to other logging approaches.

www.lordcodes.com

https://www.avanderlee.com/debugging/oslog-unified-logging/

 

OSLog and Unified logging as recommended by Apple - SwiftLee

Using Apple's recommended unified logging system using OSLog can be done in just a few steps. Learn how to use it in combination with the Console app.

www.avanderlee.com

 

반응형