이번 게시글은 제가 ‘python-mysql-replication’에서 개발한 로깅 기능에 대해서 소개하는 글을 작성하려고 합니다.
기존의 저희 라이브러리는 따로 logging 하는 기능이 구현되어 있지 않았습니다. 제 생각으로는 라이브러리인 프로젝트 성격 상 logging 기능이 필요 없다 생각하고 있었습니다만 binlog event를 읽어 들여오는 BinlogStreaReader
클래스는 객체를 생성할 때에 엄청 많은 파라미터들을 입력할 수 있었기 때문에 실행하고 난 뒤에는 어떠한 파라미터로 실행이 되었는지 확인할 방법이 아쉽게도 없었습니다.
또한 멘토님 역시 그러한 기능이 필요로 하시다는 점을 개발 항목에 따로 게시를 해주셨었습니다.
아래와 같은 사항을 고려하며 로깅 기능을 개발하였습니다.
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
객체가 담긴 속성 값을 표현할 때인데요. 값을 그대로 보여주게 되면 생각보다 사용자 입장에서 좋지 않은 형태로 출력되어서 해당 부분을 읽기 좋게 출력할 수 있도록 개발하였습니다.
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]
```
모든 개발에서 가장 중요한 것은 사용자의 편의성을 위한 고민입니다. 이번 로깅 기능 추가에서도 저는 사용자가 편리하게 사용할 수 있도록 다양한 고려를 하였습니다. 라이브러리를 개발하는 과정에서 간과하기 쉬운 로깅 기능이지만, 실제 사용 시에 많은 정보와 편의성을 제공해주기 때문에 중요한 기능 중 하나라고 생각합니다.
또한, 중복되는 데이터의 제거, 더 나은 데이터 표현 방식 등 세세한 부분에 대한 고려를 통해 사용자가 로그를 더욱 직관적이고 이해하기 쉽게 볼 수 있게끔 노력하였습니다. 이러한 작은 부분들이 모여 사용자에게 큰 만족감을 제공한다고 생각합니다.