timezone 이 다른 로그를 분석할 때는 시간 변환이 필요합니다.
예를 들면 서버가 timezone 이 미국으로 설정된 서버에서 로그를 보고 해당 서버의 한국 시간을 변환하려면 복잡한 시차 적용이 필요해서 어떤 시간에 해당 로그가 발생했는지 쉽게 확인이 힘듭니다.
이럴 경우 timezone 변환을 자동으로 해주는 기능이 있다면 매우 편리할 것입니다.
1) 코드 생성
ChatGPT 프롬프트로 다음을 사용하였습니다.
log 의 경우 time 이 포함된 스트링은 여러가지 pattern 이 존재할 수 있습니다.
예를 들면 '%Y-%m-%d %H:%M:%S %Z', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M' 등의 여러 형태가 존재할 수 있습니다. 이 경우 함수에 date format 이 어떤 것인지 하나하나 입력하기 보다는 자동으로 인식하면 편리할 것입니다.
그래서 아래와 같이 자동으로 인식하도록 한 것입니다.
python 으로 아래와 같이 time 을 표시하는 문자열이 존재하는 경우 timezone 을 변환하는 함수를 만들어주세요.
함수에는 log_text, source_timezone, dest_timezone 파라미터를 입력 받습니다.
log_text 는 아래 문자열과 같은 로그 text 를 입력받고
source_timezone, dest_timezone 은 US/Pacific, Asia/Seoul 과 같은 time zone 을 입력받습니다.
return 은 time zone 이 변환된 로그 text 를 리턴합니다.
log_text 중 time 이 포함된 문자열은 다음과 같은 문자열이 올 수 있습니다.
DATE_PATTERNS = [
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [A-Z]{3}', '%Y-%m-%d %H:%M:%S %Z'),
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', '%Y-%m-%d %H:%M:%S'),
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}', '%Y-%m-%d %H:%M'),
(r'\d{2}/\d{2}/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [APap][Mm]', '%m/%d/%Y %I:%M:%S %p'),
(r'\d{2}/\d{2}/\d{4} \d{1,2}:\d{1,2} [APap][Mm]', '%m/%d/%Y %I:%M %p'),
(r'\d{4}-\d{1,2}-\d{1,2} [APap][Mm] \d{1,2}:\d{1,2}:\d{1,2}', '%Y-%m-%d %p %I:%M:%S'),
(r'\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2} [APap][Mm]', '%Y-%m-%d %I:%M:%S %p'),
(r'\d{2}/[A-Za-z]{3}/\d{4}:\d{2}:\d{2}:\d{2} [-+]\d{4}', '%d/%b/%Y:%H:%M:%S %z')
]
192.168.2.82 - - [27/Mar/2025:00:04:06 -0700] "GET /test HTTP/1.1" 200 - "-" "axios/0.21.4" 73ms "962fff801aa10f24" "a9a7a0fd8e5dd842" "962fff801aa10f24"
생성된 코드는 다음과 같습니다.
아래 코드는 다음과 같이 다운받을 수 있습니다.
git clone git@github.com:jbpark/jbDeskExample.git
cd jbDeskExample/jbDesk/ch1.3
convert_log_timezone.py
import re
from datetime import datetime
import pytz
DATE_PATTERNS = [
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [A-Z]{3}', '%Y-%m-%d %H:%M:%S %Z'),
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', '%Y-%m-%d %H:%M:%S'),
(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}', '%Y-%m-%d %H:%M'),
(r'\d{2}/\d{2}/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [APap][Mm]', '%m/%d/%Y %I:%M:%S %p'),
(r'\d{2}/\d{2}/\d{4} \d{1,2}:\d{1,2} [APap][Mm]', '%m/%d/%Y %I:%M %p'),
(r'\d{4}-\d{1,2}-\d{1,2} [APap][Mm] \d{1,2}:\d{1,2}:\d{1,2}', '%Y-%m-%d %p %I:%M:%S'),
(r'\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2} [APap][Mm]', '%Y-%m-%d %I:%M:%S %p'),
(r'\d{2}/[A-Za-z]{3}/\d{4}:\d{2}:\d{2}:\d{2} [-+]\d{4}', '%d/%b/%Y:%H:%M:%S %z')
]
def convert_log_timezone(log_text: str, source_timezone: str, dest_timezone: str) -> str:
for pattern, date_format in DATE_PATTERNS:
match = re.search(pattern, log_text)
if match:
datetime_str = match.group()
try:
dt = datetime.strptime(datetime_str, date_format)
if '%z' not in date_format and '%Z' not in date_format:
source_tz = pytz.timezone(source_timezone)
dt = source_tz.localize(dt)
dt = dt.astimezone(pytz.timezone(dest_timezone))
new_datetime_str = dt.strftime(date_format)
log_text = log_text.replace(datetime_str, new_datetime_str)
except ValueError:
continue
return log_text
# 예제 실행
log_text = '192.168.2.82 - - [27/Mar/2025:00:04:06 -0700] "GET /test HTTP/1.1" 200 - "-" "axios/0.21.4" 73ms "962fff801aa10f24" "a9a7a0fd8e5dd842" "962fff801aa10f24"'
converted_log = convert_log_timezone(log_text, 'US/Pacific', 'Asia/Seoul')
print(converted_log)
2) 코드 실행
위 코드를 실행한 결과입니다.
192.168.2.82 - - [27/Mar/2025:16:04:06 +0900] "GET /test HTTP/1.1" 200 - "-" "axios/0.21.4" 73ms "962fff801aa10f24" "a9a7a0fd8e5dd842" "962fff801aa10f24"
로그에서 변경된 부분은 다음과 같습니다.
미국 시간(US/Pacific) : 27/Mar/2025:00:04:06 -0700
한국 시간(Asia/Seoul) : 27/Mar/2025:16:04:06 +0900
US/Pacific 은 UTC-07:00 이고 Asia/Seoul 은 UTC+09:00 입니다.
한국 시간( Asia/Seoul )이 미국 시간(US/Pacific) 보다 16시간 빠릅니다.
변환이 정확하게 된 것을 확인 할 수 있습니다.
3) JbDesk 에 코드 통합
기존 "줄단위", "표기법" 메뉴에 "TimeZone" 메뉴를 추가하고 위 기능을 통합해보겠습니다.
사용한 ChatGPT 프롬프트는 다음과 같습니다.
다음 기능을 수행하는 python 코드를 pyqt5 를 사용하여 작성해주세요.
작성 후 에러도 테스트해주세요.
1. window 타이틀은 JbDesk 로 표시
2. window 메뉴에 "줄단위", "표기법"을 추가합니다.
"줄단위" 하위에는 "줄 공백 제거" 를 추가합니다.
"표기법" 하위에는 "camelCase", "snake_case", "PascalCase", "SCREAMING_SNAKE_CASE", "kebab-case", "Train-Case", "dot.notation" 를 추가합니다.
"TimeZone" 하위에 "로그 TimeZone 변환"을 추가합니다.
3. Window 내부에는
첫째 라인에 선택한 Tool 기능 텍스트를 표시하고
둘째 라인에는 "입력" 이라는 GroupBox 와 내부에 TextEdit 를 표시
세번째 라인에는 "변환"이라는 버튼을 표시합니다.
"변환" 버튼은 "변환"이라는 글자크기 만큼 버튼을 표시합니다.
다섯째 라인에는 "출력" 이라는 GroupBox 와 내부에 TextEdit 를 표시
4.
"줄 공백 제거"를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 줄 공백을 제거하여 "출력" text 에 표시합니다.
"camelCase" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 camelCase로 변환하여 "출력" text 에 표시합니다.
"snake_case" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 snake_case로 변환하여 "출력" text 에 표시합니다.
"PascalCase" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 PascalCase로 변환하여 "출력" text 에 표시합니다.
"SCREAMING_SNAKE_CASE" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 SCREAMING_SNAKE_CASE로 변환하여 "출력" text 에 표시합니다.
"Train-Case" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 Train-Case로 변환하여 "출력" text 에 표시합니다.
"dot.notation" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 dot.notation로 변환하여 "출력" text 에 표시합니다.
5.
"로그 TimeZone 변환"을 선택하면
첫째 라인에 선택한 Tool 기능 텍스트를 표시하고
둘째 라인에는 "입력" 이라는 GroupBox 와 내부에 TextEdit 를 표시
세번째 라인에는 "원본 TimeZone"이라는 Label에 "US/Pacific" , "Asia/Seoul" 선택하는 DropBox가 표시되고 우측에 "목표 TimeZone"이라는 Label에 "US/Pacific" , "Asia/Seoul" 선택하는 DropBox가 표시되고 우측에 "변환"이라는 버튼을 표시합니다.
"변환" 버튼은 "변환"이라는 글자크기 만큼 버튼을 표시합니다.
다섯째 라인에는 "출력" 이라는 GroupBox 와 내부에 TextEdit 를 표시하며
"변환" 버튼을 누르면 timezone 을 변환하여 "출력"에 표시합니다.
위 프롬프트가 생성한 코드에 기존 코드를 일부 병합하여 최종 코드를 생성하였습니다.
4) 통합 코드 실행
아래 이미지와 같이 입력된 text 의 timezone 이 변환됩니다.

'유틸리티 > JbDesk' 카테고리의 다른 글
| JbDesk 1.6편-코드 리팩터링 (1) | 2025.03.28 |
|---|---|
| JbDesk 1.5편-exe 만들기 (0) | 2025.03.28 |
| JbDesk 1.4편-tray 기능 추가 (0) | 2025.03.28 |
| JbDesk 1.2편-표기법 변환 (2) | 2025.03.27 |
| JbDesk 1.1편-짜잘한 유틸리티 모음(빈줄 제거) (0) | 2025.03.26 |

