{"id":30203045,"url":"https://github.com/vimkim/cubrid-broker-log-binder","last_synced_at":"2025-09-03T08:34:31.836Z","repository":{"id":245063649,"uuid":"814430625","full_name":"vimkim/cubrid-broker-log-binder","owner":"vimkim","description":"A simple program that receives the cubrid broker log as an input and binds the parameters to the pstmtSQL","archived":false,"fork":false,"pushed_at":"2025-01-20T19:11:40.000Z","size":500,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-20T20:22:59.415Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vimkim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-13T02:19:14.000Z","updated_at":"2025-01-20T19:11:43.000Z","dependencies_parsed_at":"2025-01-20T20:32:07.620Z","dependency_job_id":null,"html_url":"https://github.com/vimkim/cubrid-broker-log-binder","commit_stats":null,"previous_names":["vimkim/cubrid-broker-log-binder"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vimkim/cubrid-broker-log-binder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimkim%2Fcubrid-broker-log-binder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimkim%2Fcubrid-broker-log-binder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimkim%2Fcubrid-broker-log-binder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimkim%2Fcubrid-broker-log-binder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vimkim","download_url":"https://codeload.github.com/vimkim/cubrid-broker-log-binder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimkim%2Fcubrid-broker-log-binder/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270228723,"owners_count":24548895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-13T11:14:02.686Z","updated_at":"2025-08-13T11:14:40.686Z","avatar_url":"https://github.com/vimkim.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n## DEPRECATION WARNING\n\u003e **DEPRECATION NOTICE**  \n\u003e 이 프로젝트는 더이상 유지보수되지 않습니다.  \n\u003e **더 빠르고, 강력하며, Rust로 새로 작성된 [cubrid-logtopbind-rs](https://github.com/vimkim/cubrid-logtopbind-rs)를 사용해 주세요.**  \n\u003e 이 새로운 버전은 내장 SQLite 지원으로 훨씬 다양한 분석을 손쉽게 수행할 수 있으며, 대용량 로그 처리에서도 높은 성능을 보장합니다.\n\n---\n\n## 왜 `cubrid-logtopbind-rs` 로 이주해야 하나요?\n\n1. **Rust로 작성**  \n   - Rust는 **네이티브 바이너리**를 생성합니다. 이는 실행 파일이 바로 운영체제에서 동작할 수 있음을 의미하며, **추가 런타임 환경(JRE)**이 필요하지 않습니다.  \n     - Java는 JVM(Java Virtual Machine) 위에서 실행되기 때문에, 반드시 JRE가 사전에 설치되어 있어야 합니다. 이는 배포 과정에서 추가적인 설치 작업이 필요하며, 환경 설정 문제로 인해 호환성 이슈가 발생할 수 있습니다.  \n     - Rust 바이너리는 이런 제약에서 자유로우며, 빌드된 실행 파일을 어디서나 바로 실행할 수 있습니다.\n   - **더 적은 메모리 사용**  \n     - JVM은 Garbage Collector와 같은 메모리 관리 시스템을 포함하고 있어 추가적인 메모리 오버헤드가 발생합니다. 반면, Rust는 **컴파일 시점에서 메모리 안정성을 보장**하며, 런타임에 별도의 관리 비용이 들지 않습니다.\n   - **성능 최적화**  \n     - Rust는 C/C++에 버금가는 최적화된 네이티브 성능을 제공합니다. JVM이 Java 바이트코드를 네이티브로 변환하여 실행하는 과정과 비교하면, Rust는 이미 **최적화된 네이티브 코드로 컴파일**되기 때문에 추가적인 성능 저하가 없습니다.\n   - **환경 독립적**  \n     - Java 애플리케이션은 종종 JRE 버전 차이(예: Java 8, Java 11)로 인해 호환성 문제가 발생하지만, Rust 바이너리는 **환경에 종속되지 않고 완벽히 독립적**입니다. 따라서 특정 OS나 라이브러리 요구 사항 없이 실행할 수 있습니다.\n   - **간편한 배포**  \n     - Rust 프로그램은 추가 의존성 없이 **단일 실행 파일**로 제공됩니다. Java의 경우, `.jar` 파일과 함께 JVM 환경을 준비해야 하며, 복잡한 배포 스크립트를 요구하는 경우가 많습니다.\n\n   - 이러한 특성 덕분에, Rust 기반의 `cubrid-logtopbind-rs`는 **설치가 간편하고, 성능이 뛰어나며, 어디서든 실행 가능한** 최고의 대안이 됩니다.\n\n2. **내장 SQLite 데이터베이스**  \n   - 로그 분석 결과가 SQLite DB에 자동으로 저장됩니다.  \n   - 단순한 텍스트 출력뿐만 아니라, `sqlite3` 혹은 내장 툴(`sqlite-rs`)을 통해 **쿼리를 직접 날려** 원하는 모든 분석을 자유롭게 할 수 있습니다.\n\n3. **변수 바인딩 \u0026 SQL 포매팅**  \n   - 기존 Java 버전보다 더 정밀하게 바인딩 정보를 추출하고, SQL 문장을 보기 좋게 포매팅합니다.  \n   - Rust 생태계의 다양한 라이브러리(예: `regex`, `sqlformat`, `serde_json` 등)를 활용해 에러 처리가 견고합니다.\n\n4. **명령어·사용법이 간단**  \n   - `cargo build --release`로 빌드 후, `./target/release/logtopbind path/to/broker.log` 형태로 바로 실행 가능합니다.  \n   - SQLite 파일(`queries.db`)이 자동 생성되며, 이를 통해 후속 분석 및 보고서 작성이 더욱 간편해집니다.\n\n5. **높은 확장성**  \n   - Rust로 작성된 만큼, 필요한 기능을 직접 추가·변경하기 용이합니다.  \n   - 내부 구조가 모듈화되어 있어, 파싱 로직이나 포매터 등을 교체하거나 확장하는 작업이 수월합니다.\n\n---\n\n## 간단 예시\n\n다음은 `broker.log` 파일을 변환해 SQLite DB로 만드는 예시입니다:\n\n```bash\n# 1. 소스 다운로드 및 빌드 (바이너리를 바로 wget으로 다운로드하여 사용하실 수도 있습니다.)\ngit clone https://github.com/vimkim/cubrid-logtopbind-rs.git\ncd cubrid-logtopbind-rs\ncargo build --release\n\n# 2. 로그 파일을 SQLite DB에 변환\n./target/release/logtopbind broker.log\n# 실행 후, queries.db 라는 파일이 생성됩니다.\n\n# 3. logtopprint 유틸리티로 특정 쿼리만 확인\n./target/release/logtopprint --query-no 3\n# 또는\n./target/release/logtopprint -q 3\n```\n\n생성된 `queries.db`를 통해, 원하는 SQL 데이터를 마음껏 조회할 수 있습니다:\n\n```bash\nsqlite3 queries.db\n# 혹은\n./target/release/sqlite-rs queries.db\n```\n\n데이터 스키마 예시는 다음과 같습니다:\n\n```sql\nCREATE TABLE IF NOT EXISTS logs (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    query_no TEXT NOT NULL,\n    filename TEXT NOT NULL,\n    original_query TEXT NOT NULL,\n    replaced_query TEXT,\n    bind_vars JSON NOT NULL\n);\n```\n\n위 테이블의 `replaced_query` 열을 조회하면 바인딩 변수가 반영된 최종 SQL을 한 눈에 파악할 수 있습니다.\n\n---\n\n## 결론\n\n기존 Java 버전(`BrokerLogBinder`, `PrintNthQuery` 등)은 더 이상 유지보수되지 않습니다. 대규모 로그 처리 성능, 분석 편의성, 커뮤니티 확장성 모두에서 **Rust 기반의 `cubrid-logtopbind-rs`**가 훨씬 뛰어난 대안입니다.  \n\n새로운 레포지토리로 넘어오셔서, 기존보다 **빠르고 정확하며 강력해진** CUBRID 브로커 로그 분석을 직접 체험해 보세요!  \n\n---\n\n# Cubrid Broker Log Utilities\n\n## DEPRECATION WARNING\n## DEPRECATION WARNING\n## DEPRECATION WARNING\n\n큐브리드 브로커 로그를 더 쉽게 보고 분석할 수 있게 해주는 유틸리티 패키지입니다.\n\n- Broker Log Binder\n- Nth Query Printer\n- Formatters\n\n위와 같이 구성되어 있습니다.\n\n다음과 같은 기능을 지원합니다:\n\n- [x] 변수 바인딩\n- [x] 주석 제거\n- [x] 인자 번호에 해당하는 쿼리를 출력\n- [x] SQL 포매팅\n\n![image](https://github.com/vimkim/cubrid-broker-log-binder/assets/18080546/99395e8a-12ff-47bb-9f21-369798c61f10)\n\n위 이미지와 같이 bind 변수 1을 ?의 자리에 자동으로 넣어주고 포매팅합니다.\n\n## Summary\n\n사용법 요약:\n\n```sh\n# remove single-line comments\n./remove-sigleline-comments/remove-singleline-comments \u003c log_top.q \u003e log_top_wo_comments.q\n\n# The above operation is equivalent to using the following sed commands:\n# $ sed 's/--[^\\t]*\\t/\\t/g' log_top.q | sed 's/\\/\\/[^\\t]*\\t/\\t/g' \u003e log_top_wo_comments.q\n\n# remove multi-line comments and bind parameters\njavac BrokerLogBinder.java \u0026\u0026 java BrokerLogBinder --rm-comments log_top_wo_comments.q \u003e output.sql\n\n# Compile and run PrintNthQuery to extract the 3rd SQL query from output.sql\n# Usage: javac PrintNthQuery.java \u0026\u0026 java PrintNthQuery output.sql 3\njavac PrintNthQuery.java \u0026\u0026 java PrintNthQuery output.sql 3\n\n# Note:\n# Using formatters like 'sleek' or 'sqlformat' directly on output.sql, which contains multiple SQL statements,\n# can be resource-intensive and time-consuming.\n# It is recommended to use the PrintNthQuery utility to extract and format a specific SQL statement.\n# This approach minimizes memory usage and processing time.\n\n# Example:\n# Extract and format the 3rd SQL query from output.sql using the PrintNthQuery utility and sleek formatter\njavac PrintNthQuery.java \u0026\u0026 java PrintNthQuery output.sql 3 | ./sleek-binary\n\n```\n\n---\n\n### Input\n\nlog_top.q 파일\n\n크기 50MB, 20만줄 이상의 대용량 파일도 5초 안에 결과를 얻으실 수 있습니다.\n\n---\n\n### Output\n\n```sql\nSELECT\n    DISTINCT A.comp_cd,\n    A.id_row,\n    A.empno,\n    B.empno_nm,\n    B.lev_ind,\n    A.dept_cd,\n    TO_CHAR(A.ate_day, 'YYYY-MM-DD') AS ateDay,\n    WEEKDAY(A.ate_day) AS ateDayNo,\n    A.ate_cd,\n    D.ate_nm,\n    TO_CHAR(Z.req_rest_sdt, 'YYYY-MM-DD') AS rest_sdt,\n    TO_CHAR(Z.req_rest_edt, 'YYYY-MM-DD') AS rest_edt,\n    (\n        CASE\n            WHEN HOUR(Z.req_rest_sdt) \u003c 10 THEN '0' || TO_CHAR(HOUR(Z.req_rest_sdt))\n            ELSE TO_CHAR(HOUR(Z.req_rest_sdt))\n        END\n    ) AS rest_shour,\n...\n```\n\n---\n\n## BrokerLogBinder\n\n```sh\njava BrokerLogBinder [--rm-comments] \u003cinput.log\u003e\n```\n\nRequirements: JRE 8 or above\n\n### Options\n\n```text\n\n--rm-comments\n    removes csql comments while processing the input.log.\n\n```\n\n### 1. Prepare a cubrid broker log file as an input file\n\nexample.log:\n\n```txt\n03/21 18:51:36.467 (0) CLIENT IP 127.0.0.1\n03/21 18:51:36.473 (0) connect db cgkdb user public url jdbc:cubrid:localhost:53300:cgkdb:public::?\n\n03/21 18:51:36.476 (1) prepare 0 select * from foo where id = ?\n03/21 18:51:36.477 (1) prepare srv_h_id 1\n03/21 18:51:36.491 (1) execute srv_h_id 1 select * from foo where id = ?\n03/21 18:51:36.491 (1) bind 1 : INT 1\n03/21 18:51:36.529 (1) execute 0 tuple 1 time 0.055\n03/21 18:51:36.529 (0) auto_commit\n03/21 18:51:36.529 (0) auto_commit 0\n03/21 18:51:36.529 (0) *** elapsed time 0.052\n```\n\n### 2. Observe the binding results\n\n```sh\njava BrokerLogBinder --rm-comments example.log \u003e output.sql\n```\n\noutput.sql:\n\n```txt\nselect * from foo where id = 1\n```\n\n---\n\n## PrintNthQuery\n\n```sh\njava PrintNthQuery \u003cfilename-generated-by-BrokerLogBinder\u003e \u003cquery number\u003e\n```\n\nBrokerLogBinder를 통해 생성된 파일의 이름과, 쿼리 번호를 인자로 주면, 해당 쿼리를 출력합니다. \n\n---\n\n## SQL Formatter\n\n- sleek (written in rust): https://github.com/nrempel/sleek\n- sql-format (from npm): https://github.com/sql-formatter-org/sql-formatter\n- CUBRID fsqlf: https://github.com/CUBRID/fsqlf\n\nUse whichever you prefer. I personally recommend the first one combined with PrintNthQuery.\n\nYou have three experimental options.\n\n### Sleek\n\n```sh\ncat output.sql | ./sleek-binary \u003e formatted.sql\n```\n\n### sql-format\n\n```sh\n./sql-formatter-executable output.sql \u003e formatted.sql\n```\n\nformatted.sql:\n\n```txt\nselect\n  *\nfrom\n  foo\nwhere\n  id = 1;\n```\n\n### CUBRID fsqlf\n\nUse a CUBRID csql-flavored formatter from \u003chttps://github.com/CUBRID/fsqlf\u003e.\n\n---\n\n## How to build\n\n```sh\njavac BrokerLogBinder.java\n```\n\n---\n\n### Reference\n\n- Related Jira issue: \u003chttp://jira.cubrid.com/browse/RND-2175\u003e\n\n- Original source: [cubrid manager source code](https://github.com/CUBRID/cubrid-manager/blob/develop/com.cubrid.common.ui/src/com/cubrid/common/ui/spi/util/CommonUITool.java#L1247)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvimkim%2Fcubrid-broker-log-binder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvimkim%2Fcubrid-broker-log-binder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvimkim%2Fcubrid-broker-log-binder/lists"}