2012-10-29 70 views
3

我正在使用python的日誌記錄模塊。Python日誌記錄到相同的文件,不同的用戶

對於每次測試啓動時的單元測試(我們使用py.test),一些日誌信息會轉到某個文件。在集成服務器中,每次有人推送代碼(我們也使用git :)我們運行測試。

問題是,一旦創建了文件,用戶A在用戶B嘗試運行測試時,測試將失敗,因爲用戶B沒有權限在同一文件上進行寫入。

到目前爲止,我們已經手動更改了文件權限,但看起來像一個骯髒的解決方案。此外,我們也爲每個用戶創建一個日誌文件,但是又一次感覺不對。

我們在測試日誌代碼是

logging.basicConfig(level=logging.DEBUG, 
    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
    datefmt='%m-%d %H:%M', 
    filename='/tmp/py.test.log', 
    filemode='w') 
log.setLevel(logging.DEBUG) 
log.addHandler(logging.StreamHandler()) 

有沒有辦法來避免這個問題?也許使用FILEMODE =「A」可以做到這一點,但讓我們假設我想要一個新的文件,每次(說實話這是一個真正的問題,我仍然希望把事情做對更多的好奇心)

謝謝:)

+0

如何將用戶名添加到文件名中,以便每個用戶都有自己的獨立副本? –

+0

@MarcB正如我在問題中所說的:「同樣我們爲每個用戶創建一個日誌文件,但是又一次感覺不對。」我只想知道我們是否可以爲每個人使用相同的日誌。 –

+0

每次測試增加日誌文件名稱? –

回答

3

它聽起來像日誌記錄過程試圖寫在另一個用戶擁有的現有文件之上。以下是允許組loggroup的組訪問到目錄logdir的過程。

  1. 使包含目錄可寫組。

    $ chgrp loggroup logdir 
    $ chmod g+w logdir 
    
  2. 設置setgid的位上logdir。這使得logdir中的新文件始終歸該組所有。否則,新文件由創建者的組擁有。

    $ chmod g+s logdir 
    
  3. 確保所有登錄用戶都屬於loggroup

    $ usermod -a -G loggroup myuser 
    
  4. 確保所有寫作過程有正確的umask,使他們能夠做出新創建的文件組可寫。現在

    $ umask 0002 
    
  5. loggroup組的所有成員都可以在logdir創建文件並覆蓋對方的文件。

+0

感謝這個想法,但正如我在問題中所說:「到目前爲止,我們已經手動更改了文件權限,但看起來像一個骯髒的解決方案。我們還爲每個用戶創建一個日誌文件,但是又一次感覺不對「所以是的,我們已經做了文件權限的更改,我只是想知道是否可以直接從代碼中執行某些操作(並且我不是指從python執行這些命令)。感謝你的回答。 –

0

你可以使用git散列作爲文件名的一部分。那麼如果日誌中有奇怪的消息,你就知道哪個版本導致了它。

另一種可能性是從一個不同的目錄或甚至在一個chroot中運行測試。

更改權限或刪除文件也可能正常工作,但如果測試是由兩個或更多用戶同時運行的,您仍然會遇到混亂的日誌文件。

你也可以做,如果你不關心的內容,或者登錄到數據庫或不記錄任何一個記錄器...真是正確的/最佳答案取決於具體情況

+0

這是一個很好的觀點,如果兩個用戶在同一時間運行測試,文件看起來很奇怪,至少可以說。 –

-2
import os 
os.chmod("/some/location/file.type", 0777) 

您可以爲創建的文件我想做到這一點。其中0777是八進制的權限。你可以改變它到任何你想要的。

+0

這不起作用,因爲日誌記錄模塊在程序完成之前似乎沒有真正寫入文件,所以任何chmod調用都將導致找不到文件。如果文件尚未創建,則創建文件 –

+0

.. –

相關問題