@tdelaney ve @ Dolda2000'in cevapları sayesinde, neyi takip ettim. Hem Linux hem de Windows üzerinde çalışmalı ve aynı zamanda logrotate'ın copytruncate
veya create
seçeneklerini de kullanmalıdır (sırasıyla kopyalayın, sonra da kesilmiş boyutu 0'a getirin ve sonra dosyayı yeniden oluşturun).
file_name = 'my_log_file'
seek_end = True
while True: # handle moved/truncated files by allowing to reopen
with open(file_name) as f:
if seek_end: # reopened files must not seek end
f.seek(0, 2)
while True: # line reading loop
line = f.readline()
if not line:
try:
if f.tell() > os.path.getsize(file_name):
# rotation occurred (copytruncate/create)
f.close()
seek_end = False
break
except FileNotFoundError:
# rotation occurred but new file still not created
pass # wait 1 second and retry
time.sleep(1)
do_stuff_with(line)
bir sınırlama copytruncate
seçeneğini kullanarak zaman uyku ve rotasyon, son satırları "kayıp" olacak önce uyandırma gerçekleşir ise hatları (dosyasına eklenir eğer hala olacağıdır Şimdi "eski" günlük dosyasında, ancak bu dosyayı okumak için "takip" için iyi bir yol göremiyorum). Bu sınırlama, f
tanımlayıcısının yeniden adlandırılan dosyaya işaret edeceğinden ve bu nedenle tanımlayıcı kapatılmadan ve yeniden açılmadan önce son satırların okunacağından "taşıma ve oluşturma" create
seçeneği ile ilgili değildir.
Muhtemelen bir kopya, ama kesinlikle ilgili: http://stackoverflow.com/q/25413115/1639625 –
Bunu yapan bir tarif var burada (http://code.activestate.com/recipes/577968- log-kuyruk-f izleyici-log /). Yine de kendim için denemedim. – dano