상세 컨텐츠

본문 제목

PowerShell(파워쉘) 파일 라인 수 출력 (Feat. 파일 변화 모니터링, Length & Tail)

Windows/PowerShell&Command

by Hoonjo 2023. 7. 1. 22:11

본문

PowerShell(파워쉘) 파일 라인 수 출력 (Feat. 파일 변화 모니터링, Length & Tail)

PowerShell File Line Count Output (Feat. Monitoring File Changes, Length & Tail)

 

 

 

파워쉘에서 라인 수를 출력하고 리눅스의 tail 기능파일 변화를 모니터링하는 방법을 알아보겠습니다.

 

 

저는 이 방법을 응용해 로그파일 변화를 모니터링하기 위한 방법 중 하나로 사용하고 있습니다.

 

모니터링 대상 파일의 로그 총 라인수를 구하고 라인 수에 변화가 생기면 다음 로그를 다른 파일에 저장하는 방식입니다.

다른 파일에 저장된 로그파일 내에서 내가 원하는 내용을 쉽게 찾을 수 있게 됩니다.

 

❗ 로그가 생길 때마다타임스탬프가 로그 내용과 한 줄에 찍히는 방식에는 시간을 활용해 변화를 체크하는 방법이 더 좋을 수 있습니다.

 

 

 

 

1. 파일 총 라인 수 구하기

 

Get-Content "파일 경로"를 통해 파일을 읽고 길이(Length)를 구하는 방식입니다.

핵심.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이 출력됩니다.
로그파일 라인 수

실제 로그파일을 열어보면 라인 수가 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번 .

 

 

 

 

관련글 더보기