๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT-Engineering/Python

Python์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ํŒŒ์ผ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฝ”๋“œ ๊ตฌํ˜„

by ๐Ÿงž‍โ™‚๏ธ 2020. 7. 30.
๋ฐ˜์‘ํ˜•

ํŒŒ์ด์ฌ(Python)์œผ๋กœ ์‹ค์‹œ๊ฐ„(real-time) ๋กœ๊ทธ(log) ํŒŒ์ผ ๋ชจ๋‹ˆํ„ฐ๋ง(monitoring) ์ฝ”๋“œ ๊ตฌํ˜„

 

Python์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ„์†ํ•ด์„œ ๋กœ๊ทธ๋ฅผ ์ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋•Œ ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์€ ์ฐํžˆ๋Š” ๋กœ๊ทธ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. 

์˜ˆ๋ฅผ๋“ค์–ด ๊ณ ์„ฑ๋Šฅ HPC์—์„œ ์ž‘์—…์„ ๋Œ๋ฆฌ๊ณ  ํ•ด๋‹น PC์—์„œ logํŒŒ์ผ์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ ์žฅ๋น„์ธ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ํ•ด๋‹น logํŒŒ์ผ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋˜๊ฒ ๋‹ค.

๋จผ์ € ๋กœ๊ทธํŒŒ์ผ์„ ์ฐ๋Š” ์˜ˆ์‹œ์ฝ”๋“œ์ด๋‹ค.

logging.py
with open("log.txt", "w") as f:
    for i in range(100):
        text = "I love sark. %d\n" % i
        print(text, end='')
        f.write(text)
        f.flush()  # ์ถœ๋ ฅ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐฐ ๋•Œ๊นŒ์ง€ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ธฐ์— flush๊ฐ€ ํ•„์š”
        sleep(0.1)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 0.1์ดˆ๋งˆ๋‹ค 'I love sark. {๋ฒˆํ˜ธ}'์˜ ๋ฌธ์žฅ์„ 0๋ถ€ํ„ฐ 99๊นŒ์ง€ ์ฐ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ flush()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ์— ๊ฐ€๋“์ฐจ๊ธฐ ์ „์— ํŒŒ์ผ์— ์‹ค์ œ๋กœ ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งค ์ค„๋งˆ๋‹ค ๋ฐ”๋กœ๋ฐ”๋กœ ์จ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” flush()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋‹ค์Œ์€ ํ•ด๋‹น ๋กœ๊ทธํŒŒ์ผ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

monitoring.py
from time import sleep

delay_time = 0. # ์ง€์—ฐ ์‹œ๊ฐ„ ๊ธฐ๋ก
with open("log.txt","r") as f:
    while True:
        where = f.tell()
        line = f.readline().strip()
        if not line:
            sleep(0.1)
            delay_time += 0.1
            f.seek(where)
            if delay_time > 10.0: # 10์ดˆ ์ด์ƒ ์ง€์—ฐ๋˜๋ฉด ํŒŒ์ผ ์ถœ๋ ฅ์ด ๋๋‚œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ
                print("Delay has been exceeded.")
                break
            # print('๋Œ€๊ธฐ์ค‘')
        else:
            delay_time = 0. # reset delay time
            print(line) # already has newline   

์„ค๋ช… ์—†์ด๋Š” ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ํŒŒ์ด์ฌ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

file๊ฐ์ฒด์˜ tellํ•จ์ˆ˜

ํŒŒ์ผ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ฆฌํ„ด

file๊ฐ์ฒด์˜ seek(n)

ํŒŒ์ผ์˜ n๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋กœ ์ด๋™

 

 ๋ชจ๋‹ˆํ„ฐ๋ง์—๋Š” ์ง€์—ฐ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ๋ฐ, ์‹ค์ œ๋กœ line์ด ๋‹ค ์“ฐ์ด์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ if not line์กฐ๊ฑด๋ฌธ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๊ณ , ์ด ๋•Œ 0.1์ดˆ์”ฉ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝํžŒ ์œ„์น˜๋กœ ์ด๋™ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์ฝ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๊ณ„์† ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฌธ์žฅ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์œผ๋ฉด ์ข…๋ฃŒ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ์ข…๋ฃŒ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ํ”„๋กœ๊ทธ๋žจ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ ธ log๊ฐ€ ์ฐํžˆ์ง€ ์•Š๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์ค‘๊ฐ„์— ์ข…๋ฃŒ๋˜์–ด ๋” ์ด์ƒ log๊ฐ€ ์ฐํžˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ถœ๋ ฅ๋œ ํŒŒ์ผ์˜ ํ˜•ํƒœ๋งŒ ๊ฐ€์ง€๊ณ ๋Š” ์ด๋ฅผ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์ง€์—ฐ ์‹œ๊ฐ„ ํ•œ๊ณ„๋ฅผ ๋‘๋Š” ๊ฒƒ์ด๋‹ค. 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์˜ ํ•œ๊ณ„๋ฅผ 10์ดˆ๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค. 10์ดˆ ์ด์ƒ ์ƒˆ๋กœ์šด line์ด ๋“ค์–ด์˜ค์ง€ ์•Š์œผ๋ฉด loop๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๊ณ  ํ”„๋กœ๊ทธ๋žจ์€ ์ข…๋ฃŒ๋œ๋‹ค.

๋ณ„ ๊ฒƒ ์•„๋‹Œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์ œ๋ฒ• ํ—ท๊ฐˆ๋ ธ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ๋ถ„์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๋งˆ์นœ๋‹ค.

 

 

* ๊ด‘๊ณ  ํด๋ฆญ์€ ๋ธ”๋กœ๊ทธ ์œ ์ง€์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€