오픈소스 라이브러리 로깅 기능 추가하기

Chungeun Choi·2023년 10월 12일
0

오픈소스

목록 보기
5/7
post-thumbnail

이번 게시글은 제가 ‘python-mysql-replication’에서 개발한 로깅 기능에 대해서 소개하는 글을 작성하려고 합니다.

개발 개요


기존의 저희 라이브러리는 따로 logging 하는 기능이 구현되어 있지 않았습니다. 제 생각으로는 라이브러리인 프로젝트 성격 상 logging 기능이 필요 없다 생각하고 있었습니다만 binlog event를 읽어 들여오는 BinlogStreaReader 클래스는 객체를 생성할 때에 엄청 많은 파라미터들을 입력할 수 있었기 때문에 실행하고 난 뒤에는 어떠한 파라미터로 실행이 되었는지 확인할 방법이 아쉽게도 없었습니다.

또한 멘토님 역시 그러한 기능이 필요로 하시다는 점을 개발 항목에 따로 게시를 해주셨었습니다.



아래와 같은 사항을 고려하며 로깅 기능을 개발하였습니다.

  • logging configuration 지정 없이 import 되는 프로젝트의 설정을 따라가기
  • 중복되는 내역은 배제할 수 있도록 설정하기
  • frozenset 객체 안에 담긴 값들을 사용자가 읽기 쉽게 표현하기

첫 번째 항목은 저희 프로젝트가 라이브러리임에 따라 따로 configuration 설정을 하게 되면 사용자 입장에서 해당 로깅기능을 사용할 때 여러 가지 설정에 대한 버거움이 있을 것이라 판단하였습니다. (아래는 예시 이미지 입니다)

두 번째 항목은 파라미터 값을 추가하여 객체 내 속성 값에 저장하게 되는데 같은 값을 가진 속성 값이 존재합니다. 이에 따라 로깅 함수 내부에 ignore 기능을 추가하여 중복되는 속성 값을 제외시키도록 개발하였습니다.

  • 중복 된 속성 값 allowed_events에 정의 되어진 값이 그대로 packet 객체를 생성 될때 allowed_events_in_packet 전달됨에 따라 같은 값을 가진 속성 값이 생기게 됩니다,
    INFO:root:allowed_events: [DeleteRowsEvent, MariadbAnnotateRowsEvent, MariadbBinLogCheckPointEvent, MariadbGtidEvent, UpdateRowsEvent, RotateEvent, WriteRowsEvent]
    INFO:root:allowed_events_in_packet: [UpdateRowsEvent, RotateEvent, WriteRowsEvent, DeleteRowsEvent, MariadbAnnotateRowsEvent, MariadbBinLogCheckPointEvent, MariadbGtidEvent, TableMapEvent]

3번째 항목은 frozenset 객체가 담긴 속성 값을 표현할 때인데요. 값을 그대로 보여주게 되면 생각보다 사용자 입장에서 좋지 않은 형태로 출력되어서 해당 부분을 읽기 좋게 출력할 수 있도록 개발하였습니다.

  • frozenset 값 그대로 출력
    INFO:root:allowed_events_in_packet: frozenset({<class 'pymysqlreplication.row_event.TableMapEvent'>, <class 'pymysqlreplication.row_event.UpdateRowsEvent'>, <class 'pymysqlreplication.event.RotateEvent'>, <class 'pymysqlreplication.row_event.WriteRowsEvent'>, <class 'pymysqlreplication.row_event.DeleteRowsEvent'>, <class 'pymysqlreplication.event.MariadbAnnotateRowsEvent'>, <class 'pymysqlreplication.event.MariadbBinLogCheckPointEvent'>, <class 'pymysqlreplication.event.MariadbGtidEvent'>})
  • 사용자가 읽기 좋게 변환하여 출력
    ```bash
    INFO:root:allowed_events_in_packet: [UpdateRowsEvent, RotateEvent, WriteRowsEvent, DeleteRowsEvent, MariadbAnnotateRowsEvent, MariadbBinLogCheckPointEvent, MariadbGtidEvent, TableMapEvent]
    ```

마치며


모든 개발에서 가장 중요한 것은 사용자의 편의성을 위한 고민입니다. 이번 로깅 기능 추가에서도 저는 사용자가 편리하게 사용할 수 있도록 다양한 고려를 하였습니다. 라이브러리를 개발하는 과정에서 간과하기 쉬운 로깅 기능이지만, 실제 사용 시에 많은 정보와 편의성을 제공해주기 때문에 중요한 기능 중 하나라고 생각합니다.

또한, 중복되는 데이터의 제거, 더 나은 데이터 표현 방식 등 세세한 부분에 대한 고려를 통해 사용자가 로그를 더욱 직관적이고 이해하기 쉽게 볼 수 있게끔 노력하였습니다. 이러한 작은 부분들이 모여 사용자에게 큰 만족감을 제공한다고 생각합니다.

profile
소프트웨어 엔지니어 최충은입니다

0개의 댓글