2015-02-08 147 views
10

我創建一個PHP + MySQL的Web應用程序,我想現在落實測井系統的存儲和跟蹤每個用戶的一些操作文件記錄。數據庫日誌VS

這樣做的目的是:通過登錄的IP +時間+動作跟蹤每個用戶的會話的活動,後來看到他訪問以後登錄時間+頁面名稱的頁面;每個用戶都會有一個文件格式爲:log {userid} _ {month} .log

然後每個日誌只能由網站所有者通過自定義管理面板查看,數據將會僅用於安全目的(如向用戶顯示他是否從不同的IP登錄,或者其他人是否從不同的IP登錄並查看用戶在登錄會話期間訪問的網站的哪些區域)。

目前,我有一個MYSQL MyISAM表,我存儲用戶標識,IP,時間,行爲和應用程序仍然沒有啓動,但我們打算有非常多的用戶(超過10萬),並使用數據庫爲此解決方案就像自殺。

那麼你有什麼建議?日誌記錄應該如何完成?使用文件,使用當前數據庫中的表,使用單獨的數據庫?是否有任何文件記錄框架可用於PHP?

應該怎樣文件的讀取來,於是做了?按行讀取結果?

謝謝

+1

你應該看看這個: https://github.com/Seldaek/monolog – 2015-02-11 16:25:00

回答

18

你有很多選擇,所以我會從我的經驗運行的啓動有50萬左右的用戶,10萬活躍每個月,這似乎是在你的範圍內說話。

我們記錄在MySQL數據庫中的用戶操作。

  1. 查詢數據是非常容易和快速(提供了良好的指標)
  2. 我們跑Azure,並有專門的MySQL(奴隸等),用於存儲所有的用戶數據,包括原木。空間不是問題。
  3. 記錄到MySQL可能會很慢,這取決於你正在登錄的一切,所以我們只是把圓木Redis,並有一個Python應用程序從Redis的閱讀並插入到MySQL的背景。這使得日誌記錄對加載時間基本沒有影響。

我們決定登錄MySQL的用戶操作,因爲:

  1. 我們想毫不費力地運行查詢任何東西在任何時間。用戶操作日誌的結構化格式非常容易實現。
  2. 它還允許您向用戶顯示某些日誌,如果您需要的話。
  3. 當我們推出徽章,我們沒有必要解析文本日誌獎徽章那些誰執行的時間特定的動作X號。我們只是針對用戶操作日誌編寫了一個查詢,並頒發了徽章。因此,基於操作添加功能也很容易。

我們做了幾個應用程序日誌的使用文件記錄 - 或東西我們沒有每天都在查詢 - 如Python應用程序寫入數據庫,Web服務器訪問和錯誤日​​志,等等。

我們使用Logstash來處理這些日誌。它可以簡單地掛接到日誌文件並將其流式傳輸到Logstash服務器。 Logstash也可以查詢你的日誌,這很酷。

Advanced使用

我們修復立即使用Slack團隊通信和綜合了Python數據庫寫入應用它,這使我們能夠嚴重錯誤發送到一個通道(通過其API),其中有人可能會採取行動。

關閉

我的建議是不要在想現在,登錄到MySQL,查詢和看到的統計數據。進行更新,沖洗並重復。您希望快速部署和更新週期,因此通過快速SQL查詢做出決策可以讓您輕鬆完成任務。

基本上你想避免的是登錄到服務器,找到一個日誌和grep你的方式通過它找到的東西,上面實現了。

這就是我們所做的,它仍然像這樣運行,我們沒有計劃很快改變它。我們沒有發現任何我們需要的任何問題。如果有大規模的用戶爆發,我們擴大到每月活躍用戶1mil,那麼我們可能會改變它。

請注意:你決定記錄,如果要保存的POST數據無論怎樣,一定要永遠做信用卡信息,除非你是兼容的。或者使用Stripe的JavaScript庫。

+0

我想知道更多關於你的日誌表的樣子。我的團隊今天正在討論我們如何在應用程序中記錄操作。 一個建議是一個日誌表,帶有動作,兩個任意ID連接到1或2個表。從數據完整性的角度來看,這似乎是一個壞主意。 我爲特定的日誌建議了單獨的表格,其中只有一個(醜陋的)列(varchar 255或者一些愚蠢的東西),只有一個來自應用程序的段落,或者是一些更具體的動作ID,比如某種類型的前後。 – daraul 2017-08-21 23:17:00

+1

這個創業已經過去了幾年,以下是來自內存。我們有一個基本上記錄了每個調用的表,其中包括'controller','action','param'(請求中的id),'user_agent','query_string','user_id'(如果登錄, ),'ip','timestamp'。我們的目標不是保存通用應用程序日誌,而是保存用戶操作。記錄誰做了足夠的事情。如果我們希望看到每個訪問過項目156的人都有一個簡單的'SELECT * FROM user_action_logs WHERE controller ='project'AND action ='view'AND param = 156'給了我們。你的用例可能會有所不同。 – 2017-08-22 07:02:17

2

是否有任何文件記錄框架可用於PHP?

有了這個,您可在packagist:https://packagist.org/packages/psr/log

注意,它不是一個文件,日誌框架,但基於從圖PSR-3標準爲記錄程序的API。所以,如果你喜歡,它是PHP的「標準」記錄器界面。您可以構建一個實現此接口的記錄器,或者在packagist上搜索實現該接口的其他記錄器(基於文件或MySQL)。 packagist(茶杯,林業)還有其他一些伐木工人,但最好使用符合PSR標準的伐木工人。

+2

這裏有兩個PSR-3標準日誌包: https://packagist.org/packages/monolog/monolog https://packagist.org/packages/gplanchat/php-log – delatbabel 2015-02-11 10:56:08

1

我們用偉大的工具Graylog做記錄。

它可以隨心所欲地擴展,在數據可視化方面擁有出色的工具,即使對於複雜的查詢和龐大的數據集,速度也非常快,底層搜索工具(elasticsearch)是無模式的。後者可能是一個優勢,因爲您可以在擴展日誌的情況下獲得更多可能性,而無需麻煩的mysql-schemas可以提供給您。

Graylog,elasticsearch和mongodb(用於保存graylog及其web界面的配置)可以通過puppet,chef等工具輕鬆部署。

事實上,已經提到的php-lib monolog很容易記錄到graylog。

詛咒這裏很大的缺點是你必須學習一些新的工具和軟件。但我認爲這是值得的。

0

使用SysLog;) 在另一臺服務器上設置它,它可以單獨記錄所有進程(如網絡,服務器,sql,apache和你的php)。 它可以爲你有用,減少調試的時間花費。 :)

1

問題的關鍵是您正在編寫的數據不會被改變。根據我在這種情況下的經驗,我會使用:

  • MySQL with a blackhole存儲引擎。把它設置得恰到好處,它的速度非常快!
  • Riak Cluster(NoSQL解決方案) - 儘管這可能是您的學習曲線,但它可能是您最終需要採取的一種方法。
+0

無不是所有..如果你閱讀鏈接,它會更詳細地解釋。這個圖特別方便(https://dev.mysql.com/doc/refman/5.0/en/images/blackhole-1.png)。會發生什麼情況是這些語句是寫入日誌而不是寫入數據庫的。你使用一個單獨的MySQL實例來將這些語句在它自己的快樂時間中引入到數據庫中。這一切都意味着寫入發生得很快,存儲獨立發生(異步)。 – diversemix 2015-02-17 08:49:18

+0

謝謝,從來沒有聽說過這種方法。 – 2015-02-17 13:01:18