PowerShell(파워쉘) 파일 라인 수 출력 (Feat. 파일 변화 모니터링, Length & Tail)
PowerShell File Line Count Output (Feat. Monitoring File Changes, Length & Tail)
파워쉘에서 라인 수를 출력하고 리눅스의 tail 기능과 파일 변화를 모니터링하는 방법을 알아보겠습니다.
저는 이 방법을 응용해 로그파일 변화를 모니터링하기 위한 방법 중 하나로 사용하고 있습니다.
모니터링 대상 파일의 로그 총 라인수를 구하고 라인 수에 변화가 생기면 다음 로그를 다른 파일에 저장하는 방식입니다.
다른 파일에 저장된 로그파일 내에서 내가 원하는 내용을 쉽게 찾을 수 있게 됩니다.
❗ 로그가 생길 때마다타임스탬프가 로그 내용과 한 줄에 찍히는 방식에는 시간을 활용해 변화를 체크하는 방법이 더 좋을 수 있습니다.
1. 파일 총 라인 수 구하기
Get-Content "파일 경로"를 통해 파일을 읽고 길이(Length)를 구하는 방식입니다.
# 1번
$LOG_DIR = "C:\tistory"
$LOG_FILENAME = "logFile.txt"
$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_FILENAME").Length
Write-Output "CURRENT LINE: $CURRENT_LINE"
# 1번 .
로그 파일이 위치한 경로와 파일명을 넣어주고 실행해 보겠습니다.
실제 로그파일을 열어보면 라인 수가 6으로 되어있습니다.
2. 현재 라인 수 저장
로그파일의 라인 변화를 알기 위해 이전에 구한 라인 수를 파일에 저장해야 합니다.
# 2번
$PRE_LINE_FILE = "current_log_line.log"
$PRE_LINE_FILE_EXIST = Test-Path -Path "$LOG_DIR\$PRE_LINE_FILE"
if(!$PRE_LINE_FILE_EXIST){
Write-Output $CURRENT_LINE >"$LOG_DIR\$PRE_LINE_FILE"
}
# 2번 .
저장할 파일명을 설정하고 생성할 파일이 이미 존재 중인지 체크(Test-Path)한 뒤 저장합니다.
최초 실행 시엔 현재 라인 수를 처음 알기 때문에 라인 변화를 확인하는 게 아닌 라인 수를 저장해야 하기 때문입니다.
실행하면 로그파일이 생성되며, 라인 수가 저장되어 있습니다.
그럼 이제 라인 수 변화를 비교하여 6번째 라인 이후에 생성된 로그를 다른 파일에 저장해 보겠습니다.
3. 추가된 로그 저장
# 3번
else{
$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_FILENAME").Length
$PRE_LINE = Get-Content "$LOG_DIR\$PRE_LINE_FILE"
Write-Output $CURRENT_LINE >"$LOG_DIR\$PRE_LINE_FILE"
###### CURRENT_LINE != PRE_LINE
if($CURRENT_LINE -ne $PRE_LINE){
$READ_START_LINE = [int]$CURRENT_LINE - [int]$PRE_LINE
$DATETIME = Get-Date -Uformat "%Y%m%d_%H%M%S"
$MONITORING_FILE = "log_monitoring_$DATETIME.log"
Get-Content "$LOG_DIR\$LOG_FILENAME" -Tail $READ_START_LINE >"$LOG_DIR\$MONITORING_FILE"
}
}
# 3번 .
로그파일의 현재 라인을 구하고 이전 라인을 저장해둔 파일을 읽어 두 라인 수를 비교합니다.
if 라인 수가 달라졌다면(-ne) 현재 라인 수 - 이전 라인 수를 통해 읽어 들여야 할 라인 위치($READ_START_LINE)를 구합니다.
Get-Content "로그파일"을 읽고 -Tail 옵션으로 추가된 로그를 모니터링 파일($MONITORING_FILE)에 저장합니다.
꿀팁❗ 모니터링파일이 덮어씌워질 수 있으므로 생성된 시각을 파일명에 넣어줍니다.
실행해 보겠습니다.
짠🎉 추가된 로그가 다른 모니터링 파일에 추가된 모습입니다.
작업 스케줄러에 등록해 반복적으로 실행시키는 행위를 통해 로그 파일이 변화가 생길 때마다 별도의 파일로 떨어뜨려 저장시킬 수 있습니다.
아래는 전체 소스입니다.
전체 소스
# 1번
$LOG_DIR = "C:\tistory"
$LOG_FILENAME = "logFile.txt"
$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_FILENAME").Length
Write-Output "CURRENT LINE: $CURRENT_LINE"
# 1번 .
# 2번
$PRE_LINE_FILE = "current_log_line.log"
$PRE_LINE_FILE_EXIST = Test-Path -Path "$LOG_DIR\$PRE_LINE_FILE"
if(!$PRE_LINE_FILE_EXIST){
Write-Output $CURRENT_LINE >"$LOG_DIR\$PRE_LINE_FILE"
}
# 2번 .
# 3번
else{
$CURRENT_LINE = (Get-Content "$LOG_DIR\$LOG_FILENAME").Length
$PRE_LINE = Get-Content "$LOG_DIR\$PRE_LINE_FILE"
Write-Output $CURRENT_LINE >"$LOG_DIR\$PRE_LINE_FILE"
###### CURRENT_LINE != PRE_LINE
if($CURRENT_LINE -ne $PRE_LINE){
$READ_START_LINE = [int]$CURRENT_LINE - [int]$PRE_LINE
$DATETIME = Get-Date -Uformat "%Y%m%d_%H%M%S"
$MONITORING_FILE = "log_monitoring_$DATETIME.log"
Get-Content "$LOG_DIR\$LOG_FILENAME" -Tail $READ_START_LINE >"$LOG_DIR\$MONITORING_FILE"
}
}
# 3번 .
PowerShell(파워쉘) Tail 명령어가 안될 때 해결방법 (0) | 2023.07.06 |
---|---|
PowerShell(파워쉘) 파일 내용 한 줄씩 읽기 (Feat. head & tail) (1) | 2023.07.04 |
PowerShell(파워쉘) 날짜 포맷 변경 및 날짜 계산하기 (0) | 2023.06.29 |
PowerShell(파워쉘) 파일 내 특정문자 내용 변경하기 (Replace) (0) | 2023.06.28 |
PowerShell(파워쉘)명령어 파일내 문자열 찾기 (값 추출) (0) | 2023.06.23 |