2015-02-08 48 views
10

Tôi đã tạo một ứng dụng web PHP + MYSQL và tôi đang cố triển khai hệ thống ghi nhật ký để lưu trữ và theo dõi một số hành động của từng người dùng.Nhật ký cơ sở dữ liệu và nhật ký tệp

Mục đích của việc này là như sau: theo dõi hoạt động của phiên của từng người dùng bằng cách ghi nhật ký hành động + thời gian +, sau đó xem trang nào anh truy cập sau này bằng cách ghi thời gian + pagename; cho mỗi người dùng sẽ có một tệp ở định dạng: nhật ký {userid} _ {month} .log

Mỗi nhật ký sẽ chỉ được chủ sở hữu trang web xem, thông qua bảng điều khiển quản trị tùy chỉnh và dữ liệu sẽ chỉ được sử dụng cho mục đích bảo mật (như để hiển thị cho người dùng nếu anh ta đăng nhập từ một IP khác hoặc nếu ai đó đã đăng nhập từ một IP khác và xem khu vực nào của trang web mà người dùng truy cập trong phiên đăng nhập của anh ấy).

Hiện tại, tôi có bảng MYSQL MyISAM nơi lưu trữ userid, IP, thời gian, hành động và ứng dụng vẫn chưa được khởi chạy nhưng chúng tôi dự định có rất nhiều người dùng (trên 100k) và sử dụng cơ sở dữ liệu cho các giải pháp cảm thấy như tự tử.

Vì vậy, bạn đề xuất điều gì? Làm thế nào nên đăng nhập được thực hiện? Sử dụng các tập tin, sử dụng một bảng trong cơ sở dữ liệu hiện tại, sử dụng một cơ sở dữ liệu riêng biệt? Có bất kỳ khung công tác ghi nhật ký tệp nào có sẵn cho PHP không?

Làm thế nào để đọc tệp được thực hiện sau đó? Đọc kết quả theo hàng?

Cảm ơn bạn

+1

Bạn thực sự nên xem xét điều này: https://github.com/Seldaek/monolog –

Trả lời

18

Bạn có nhiều lựa chọn, vì vậy tôi sẽ nói từ kinh nghiệm của tôi chạy một khởi động với khoảng 500k người dùng, 100k hoạt động mỗi tháng, mà có vẻ là trong phạm vi của bạn.

Chúng tôi đã ghi lại tác vụ người dùng trong cơ sở dữ liệu MySQL.

  1. Truy vấn dữ liệu của bạn là rất dễ dàng và nhanh chóng (với điều kiện chỉ số tốt)
  2. Chúng tôi chạy trên Azure, và đã có một MySQL chuyên dụng (với nô lệ, vv) để lưu trữ tất cả các dữ liệu người dùng, bao gồm cả các bản ghi. Không gian không phải là một vấn đề.
  3. Việc đăng nhập vào MySQL có thể chậm, tùy thuộc vào mọi thứ bạn đang đăng nhập, vì vậy chúng tôi chỉ cần đăng nhập vào Redis và có ứng dụng Python đọc nó từ Redis và chèn vào MySQL ở chế độ nền. Điều này làm cho việc đăng nhập về cơ bản không ảnh hưởng đến thời gian tải.

Chúng tôi quyết định để đăng nhập vào MySQL cho hành động người dùng vì:

  1. Chúng tôi muốn chạy các truy vấn trên bất cứ điều gì bất cứ lúc nào mà không cần nhiều nỗ lực. Định dạng có cấu trúc của nhật ký hành động của người dùng khiến việc này trở nên vô cùng dễ dàng.
  2. Nó cũng cho phép bạn hiển thị các nhật ký nhất định cho người dùng, nếu bạn cần.
  3. Khi chúng tôi giới thiệu huy hiệu, chúng tôi không cần phải phân tích cú pháp nhật ký văn bản thành huy hiệu giải thưởng cho những người đã thực hiện một số hành động X cụ thể. Chúng tôi chỉ viết một truy vấn chống lại các nhật ký hành động của người dùng và các huy hiệu đã được trao. Vì vậy, việc thêm các tính năng dựa trên hành động cũng dễ dàng.

Chúng tôi đã sử dụng ghi nhật ký tệp cho một vài nhật ký ứng dụng - hoặc những thứ chúng tôi không truy vấn hàng ngày - chẳng hạn như ứng dụng Python ghi vào cơ sở dữ liệu, truy cập máy chủ Web và nhật ký lỗi, v.v.

Chúng tôi đã sử dụng Logstash để xử lý các nhật ký đó. Nó có thể chỉ đơn giản là móc vào một tệp nhật ký và truyền nó tới máy chủ Logstash của bạn. Logstash cũng có thể truy vấn nhật ký của bạn, điều này khá thú vị.

nâng cao sử dụng

Chúng tôi sử dụng Slack cho truyền thông nhóm và tích hợp các ứng dụng cơ sở dữ liệu bằng văn bản Python với nó, điều này cho phép chúng tôi gửi các lỗi quan trọng đối với một kênh (thông qua API của họ), nơi một người nào đó có thể hành động một sửa chữa ngay lập tức .

Đóng

Đề nghị của tôi sẽ không qua nghĩ rằng nó bây giờ, đăng nhập để MySQL, truy vấn và xem số liệu thống kê. Thực hiện cập nhật, rửa sạch và lặp lại. Bạn muốn giữ chu kỳ giữa triển khai và cập nhật nhanh chóng, vì vậy việc đưa ra quyết định từ truy vấn SQL nhanh chóng giúp bạn dễ dàng.

Về cơ bản những gì bạn muốn tránh là đăng nhập vào máy chủ, tìm nhật ký và grep theo cách của bạn để tìm nội dung nào đó, ở trên đạt được điều đó.

Đây là những gì chúng tôi đã làm, nó vẫn chạy như vậy và chúng tôi không có kế hoạch thay đổi nó sớm. Chúng tôi đã không có bất kỳ vấn đề mà chúng tôi không thể tìm thấy bất cứ điều gì mà chúng tôi cần. Nếu có một lượng lớn người dùng và chúng tôi mở rộng đến 1 triệu người dùng hoạt động hàng tháng, thì chúng tôi có thể thay đổi nó.

Xin lưu ý: bất cứ cách nào bạn quyết định để đăng nhập, nếu bạn đang lưu dữ liệu POST, hãy chắc chắn không bao giờ làm điều đó cho thông tin thẻ tín dụng, trừ khi bạn đã tuân thủ. Hoặc sử dụng thư viện JavaScript của Stripe.

+0

Tôi muốn biết thêm về bảng nhật ký của bạn trông như thế nào. Nhóm của tôi đã thảo luận hôm nay về cách chúng tôi muốn đăng nhập các hành động trong ứng dụng của mình. Đề xuất là một bảng nhật ký, với các hành động và hai ID tùy ý để liên kết tới 1 hoặc 2 bảng. Điều này có vẻ là một ý tưởng tồi từ quan điểm toàn vẹn dữ liệu. Tôi đã đề xuất các bảng riêng cho các nhật ký cụ thể, với một cột (xấu xí) (varchar 255 hoặc một cái gì đó ngớ ngẩn) chỉ với một đoạn từ ứng dụng hoặc một cái gì đó chi tiết hơn với id hành động, trước và sau một số loại. – daraul

+1

Đã một vài năm kể từ lần khởi động này, phần sau đây là từ bộ nhớ. Chúng tôi đã có một bảng về cơ bản đã ghi lại mọi cuộc gọi, bao gồm 'controller',' action', 'param' (id trong yêu cầu),' user_agent', 'query_string',' user_id' (nếu đăng nhập, else 'guest'), 'ip',' dấu thời gian'. Mục tiêu của chúng tôi là không lưu nhật ký ứng dụng chung nhưng hành động của người dùng. Đăng nhập người đã làm những gì là đủ. Nếu chúng ta muốn thấy tất cả những ai đã truy cập dự án 156 thì đơn giản 'SELECT * FROM user_action_logs WHERE controller = 'project' AND action = 'view' AND param = 156' đã cho chúng ta điều đó. Trường hợp sử dụng của bạn có thể khác. –

2

Nếu bạn chắc chắn rằng đọc nhật ký chủ yếu sẽ tập trung vào một người dùng tại một thời điểm, bạn nên xem xét partioning bảng đăng nhập của bạn: http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html sử dụng user_id của bạn như là chìa khóa phân vùng.

Số lượng phân vùng tối đa là 1024, bạn sẽ có một phân vùng lưu trữ 1/1000 trong số 100 nghìn người dùng của mình, đó là điều gì đó hợp lý.

2

Có bất kỳ khung ghi nhật ký tệp nào có sẵn cho PHP không?

Có này đó có sẵn trên packagist là: https://packagist.org/packages/psr/log

Lưu ý rằng nó không phải là một khung đăng nhập tập tin nhưng một API cho một logger dựa trên tiêu chuẩn PSR-3 từ FIG. Vì vậy, nếu bạn thích, đó là giao diện logger "chuẩn" cho PHP. Bạn có thể xây dựng một trình ghi nhật ký thực hiện giao diện này hoặc tìm kiếm xung quanh trên packagist cho các trình ghi nhật ký khác thực hiện giao diện đó (hoặc tệp hoặc dựa trên MySQL). Có một vài logger khác trên packagist (tách trà, lâm nghiệp) nhưng nó sẽ là thích hợp hơn để sử dụng một trong đó dính vào tiêu chuẩn PSR.

+2

Dưới đây là hai gói nhật ký tuân thủ PSR-3: https://packagist.org/packages/monolog/monolog https://packagist.org/packages/gplanchat/php-log – delatbabel

1

Chúng tôi đăng nhập bằng công cụ tuyệt vời Graylog.

Tỷ lệ cao như bạn muốn, có công cụ tuyệt vời về hiển thị dữ liệu, cực kỳ nhanh ngay cả đối với truy vấn phức tạp và tập dữ liệu khổng lồ, và tìm kiếm cơ bản (elasticsearch).Sau này có thể là một lợi thế khi bạn nhận được nhiều khả năng mở rộng các bản ghi của mình mà không có các lược đồ mysql phức tạp có thể cung cấp cho bạn.

Graylog, elasticsearch và mongodb (được sử dụng để lưu cấu hình của graylog và webinterface) dễ dàng triển khai thông qua các công cụ như con rối, đầu bếp và các loại tương tự.

Thực tế việc đăng nhập vào graylog thật dễ dàng với monolog php-lib đã đề cập.

Nguyền rủa những bất lợi lớn ở đây là bạn phải học một loạt các công cụ và phần mềm mới. Nhưng nó là giá trị nó theo ý kiến ​​của tôi.

0

Sử dụng SysLog;) Thiết lập trên máy chủ khác và có thể đăng nhập tất cả các quy trình của bạn một cách riêng biệt (chẳng hạn như mạng, máy chủ, sql, apache và php của bạn). Có thể hữu ích cho bạn và giảm thời gian gỡ lỗi. :)

1

Điểm mấu chốt của vấn đề là dữ liệu bạn đang viết sẽ không bị thay đổi. Theo kinh nghiệm của tôi trong trường hợp này, tôi sẽ sử dụng một trong hai:

  • MySQL with a blackhole công cụ lưu trữ. Đặt nó lên ngay và nhanh chóng phồng rộp!
  • Riak Cluster (giải pháp NoSQL) - mặc dù đây có thể là một đường cong học tập cho bạn nhưng đó có thể là một cách bạn có thể cần phải thực hiện.
+0

Không có gì cả .. nếu bạn đọc liên kết, nó sẽ giải thích chi tiết hơn. Sơ đồ này đặc biệt tiện dụng (https://dev.mysql.com/doc/refman/5.0/en/images/blackhole-1.png). Điều gì xảy ra là các câu lệnh được ghi vào nhật ký không phải là một cơ sở dữ liệu. Bạn sử dụng một cá thể MySQL riêng biệt để đi cùng và kéo những câu lệnh đó vào cơ sở dữ liệu trong thời gian vui vẻ của riêng nó. Điều này có nghĩa là việc viết diễn ra nhanh và lưu trữ diễn ra độc lập (không đồng bộ). – diversemix

+0

Cảm ơn, không bao giờ nghe nói về cách tiếp cận đó. –

Các vấn đề liên quan