แนวทางปฏิบัติที่ดีที่สุดสำหรับการบันทึกการทำงานของผู้ใช้ในการผลิต


22

ฉันวางแผนที่จะบันทึกสิ่งต่าง ๆ มากมายในสภาพแวดล้อมการผลิตของฉันสิ่งต่าง ๆ เช่นเมื่อผู้ใช้:

  • เข้าสู่ระบบออกจากระบบ
  • เปลี่ยนโปรไฟล์
  • แก้ไขการตั้งค่าบัญชี
  • เปลี่ยนรหัสผ่าน ... ฯลฯ

นี่เป็นวิธีปฏิบัติที่ดีที่จะทำกับสภาพแวดล้อมการผลิตหรือไม่? ยังเป็นวิธีที่ดีในการเข้าสู่ระบบทั้งหมดนี้คืออะไร ฉันกำลังใช้บล็อครหัสต่อไปนี้เพื่อเข้าสู่ระบบ:

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

สิ่งนี้จะโอเคสำหรับการผลิตหรือไม่? แอปพลิเคชันของฉันใหม่มากดังนั้นฉันไม่คาดหวังว่าจะมีผู้ใช้หลายล้านคนทันทีหรือสิ่งใดก็ตามกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดในการติดตามการดำเนินการบนเว็บไซต์หรือหากเป็นแนวปฏิบัติที่ดีที่สุด


1
ผมก็อาจจะแนะนำDatabaseมากกว่าแฟ้มข้อความ ...

@DaveZych: ขึ้นอยู่กับวัตถุประสงค์ของการบันทึก หากการติดตาม / ติดตามข้อผิดพลาดเป็นส่วนหนึ่งของวัตถุประสงค์ดังกล่าวฐานข้อมูลจะไม่ทำงาน ดูprogrammers.stackexchange.com/questions/92186/…
Marjan Venema

ผมดำเนินการขั้นพื้นฐานของa User Activity Logger that hooks up various eventsคุณสามารถดูได้ที่นี่: stackoverflow.com/questions/30326673/... สนุก!
Jeremy Thompson

คำตอบ:


30

นี่ไม่ใช่คำตอบที่ตรงกับคำถามมากขึ้นของการขยายตัว

เมื่อคุณเปิดแอพใหม่ฉันแนะนำให้ทำการบันทึกทุกอย่างที่ผู้ใช้ทำ: ล็อกอินเข้าสู่ระบบออกรอยขีดข่วน ** ทุกอย่าง หากเป็นเว็บให้พิจารณาใช้แผนที่ความร้อนเพื่อให้คุณรู้ว่าเมาส์ทำอะไรอยู่

เมื่อฉันอยู่ในโครงการ BravoXที่ Xerox ในช่วงปลายยุค 70 เราบันทึกการเคลื่อนไหวของเมาส์แบบพิกเซลต่อพิกเซลเพื่อหาว่าผู้ใช้อาจใช้สิ่งแปลกประหลาดนี้เรียกว่าตัวแก้ไขแบบ WYSIWYG ได้อย่างไร เราจะดูการเล่นเซสชันของผู้ใช้ในช่วงอาหารกลางวัน มันให้คำแนะนำอย่างมาก เราค้นพบรูปแบบการใช้งานที่เราเรียกว่า Charlie Browning - ผู้ใช้จะเลือกข้อความบางส่วนและทำให้เป็นตัวเอียง ... จากนั้นพวกเขาก็จะเลิกทำ ... จากนั้นพวกเขาก็จะทำซ้ำ ... จากนั้นพวกเขาจะทำซ้ำ ... ไปมา ปรากฎว่าพวกเขากำลังพยายามที่จะเข้าใจสิ่งนี้ในระดับอารมณ์ ดังนั้นเรา (Greg Kusnik ทำรหัสถ้าให้บริการหน่วยความจำ) ใส่ในการเพิ่มประสิทธิภาพบางอย่างเพื่อสนับสนุนพฤติกรรมนี้

หากไม่มีการอัดเสียงเราคงไม่เคยคิดที่จะทำสิ่งนี้


1
คุณสามารถเขียนหนังสือที่มีศูนย์กลางที่ความคิดเห็นนี้เพียงอย่างเดียว!
อธิการ

การบันทึกเฉพาะประเภทนี้เกี่ยวกับประสบการณ์การใช้งานแบบเรียลไทม์ดังนั้นฉันจะไม่เป็นผู้เขียน ฉันเป็นนาย Hardcopy เมื่อคุณกดพิมพ์ฉันใช้การเป็นตัวแทนของเอกสารแปลงเป็นภาษาคำอธิบายหน้าแล้วส่งมันไปยังสิ่งที่แปลกประหลาดที่เรียกว่าอีเธอร์เน็ตไปยังเครื่องพิมพ์เลเซอร์เครื่องแรกของโลก กลุ่มที่ฉันมีปฏิสัมพันธ์มากที่สุดคือแผนกวิชาการพิมพ์ของวุฒิสภาสหรัฐอเมริกาและกลุ่มการพิมพ์ของ IMF ซึ่งเป็นไซต์ทดสอบเบต้าที่ดีที่สุดและมีความต้องการมากที่สุดของเรา ฉันเรียนรู้มากมายเกี่ยวกับเลย์เอาต์แบบอักษรและอื่น ๆ จากคนเหล่านั้น ช่วงเวลาที่ดี.
Peter Rowell

9

ถ้าฉันเป็นคุณและฉันก็ติดกับการเขียนไฟล์ข้อความฉันจะใช้log4netและเข้าสู่ไฟล์ "UserActions.log" ที่เฉพาะเจาะจง วิธีนี้ไม่ทำให้การบันทึกปกติของคุณยุ่งเหยิง โดยใช้ log4net (หรือกรอบงานการบันทึกอื่น ๆ ) คุณสามารถหลีกเลี่ยงการสร้างตัวหมุนไฟล์ตัวต่อไฟล์คำเตือน / ข้อผิดพลาด / แก้จุดบกพร่อง / ข้อมูลการเขียนไฟล์แบทช์และอื่น ๆ มันเป็นความคิดที่ดีที่จะสร้างการล็อกอินที่ดี แอปพลิเคชันระดับการผลิตใด ๆ

แม้ว่าในความเป็นจริงมันอาจจะดีกว่าที่จะเก็บข้อมูลทั้งหมดนี้ในฐานข้อมูล การใช้ฐานข้อมูลจะช่วยให้คุณเรียงลำดับรวมและทำสถิติได้ง่ายขึ้น


3
คุณสามารถมีเค้กและกินมันมี DatabaseAppender สำหรับ log4net: logging.apache.org/log4net/release/config-examples.html แต่ถ้าคุณกังวลเกี่ยวกับประสิทธิภาพคุณสามารถเข้าสู่ระบบไฟล์และแยกวิเคราะห์ในบริการที่แยกต่างหากเตรียมข้อมูลเพื่อการรายงานที่รวดเร็วขึ้น (ซึ่งอาจเป็นฐานข้อมูลรายงาน)
หน้าตาบูดบึ้งของ Despair

9

มีการใช้ไฟล์บันทึก 1. เพื่อรับข้อมูลสำหรับการแก้ไขข้อผิดพลาดของระบบ 2. เพื่อการวิจัยกิจกรรมของผู้ใช้เพื่อความเสียหายหรือ 3. เพื่อทำความเข้าใจว่าผู้คนใช้ระบบอย่างไรเมื่อคุณไม่สามารถดูพวกเขาได้ โดยที่ในใจ:

  • สภาพแวดล้อมการบันทึก (เช่น vars สภาพแวดล้อม, การตั้งค่าอื่น ๆ ) เมื่อเริ่มต้นแอปพลิเคชัน สิ่งนี้มีประโยชน์สำหรับการแก้ไขข้อบกพร่อง
  • บันทึกผู้ใช้และการกระทำ (ส่วนต่าง ๆ ของ URL) สำหรับแต่ละคำขอ
  • บันทึกพารามิเตอร์ทั้งหมดสำหรับแต่ละคำขอยกเว้นรหัสผ่าน phone{(999)999-9999} email{aaa@aaa.com}ผมชอบที่จะใส่ตัวคั่นแต่ละรอบพารามิเตอร์ในบันทึกเช่น ไม่ควรเขียนรหัสผ่านที่ใดก็ได้ยกเว้นไปยังฐานข้อมูลในวิธีหนึ่งฟังก์ชันแฮชที่เข้ารหัสลับด้วยเกลือที่เป็นเอกลักษณ์สำหรับผู้ใช้แต่ละคนและหลายรอบของการแฮช (ดูเชิงอรรถ)
  • เมื่อเข้าสู่ระบบคุณควรเข้าสู่ระบบที่อยู่ IP ของผู้ใช้ ID ผู้ใช้ชื่อจำนวนการเข้าสู่ระบบที่ล้มเหลวบางทีเบราว์เซอร์อาจเป็นรหัสคุกกี้เซสชัน แต่ไม่เคยมีรหัสผ่าน
  • อย่าลืมบันทึกรหัสผ่านในหน้าเข้าสู่ระบบและหน้าเปลี่ยนรหัสผ่านและคุณไม่ควรบันทึกคำถามหรือคำตอบเฉพาะหากคุณมีฟังก์ชันการทำงานนั้น รหัสผ่านหรือคีย์การเข้ารหัสอื่น ๆ จะต้องไม่ถูกบันทึกไว้ เป็นวิธีปฏิบัติที่ดีในการเขียนบางอย่างเช่นดาวหกดวงลงในบันทึกสำหรับพารามิเตอร์เหล่านี้เพื่อให้คุณสามารถเห็นว่าคุณจำได้ว่าจะระงับข้อมูลนี้
  • ฉันต้องการบันทึกเวลารวมที่ใช้ในการให้บริการตามคำขอแต่ละครั้ง: Done: 49ms
  • ฉันต้องการบันทึกการเปลี่ยนแปลงของสถานะเซสชัน สิ่งเหล่านี้ควรหายาก
  • อย่างที่คนอื่น ๆ พูดกันว่ามีไลบรารีการบันทึกที่ยอดเยี่ยมอยู่ที่นั่นสำหรับการเข้าสู่ไฟล์ไม่แน่ใจเกี่ยวกับการเข้าสู่ระบบฐานข้อมูล
  • จัดเก็บบันทึกอย่างปลอดภัย แม้จะไม่มีรหัสผ่านก็มีกฎหมายของรัฐสหพันธรัฐและระหว่างประเทศเกี่ยวกับข้อมูลส่วนบุคคลที่สามารถระบุตัวตนได้ (ดูที่Safe Harbor ) ซึ่งทำให้ข้อมูลบันทึกเป็นความลับ
  • ใช้การสำรองข้อมูล หากคุณปล่อยให้พวกเขาสำรองข้อมูลเต็มไดรฟ์ทุกคืนอย่าลืมสำรองไว้ที่อื่นก่อนที่จะอัปเกรดเป็นเซิร์ฟเวอร์ใหม่ (อย่าถามฉันว่าฉันเรียนรู้สิ่งนี้อย่างไร)

เคล็ดลับอื่น ๆ

เชิงอรรถ:ในการเข้าสู่ระบบใครบางคน, แฮรหัสผ่านที่ให้มาด้วยอัลกอริทึมการแฮชเดียวกันและเกลือจากแฮชดั้งเดิมสำหรับผู้ใช้นั้น หากแฮชของรหัสผ่านที่ให้มาตรงกับแฮรหัสผ่านที่เก็บไว้ในฐานข้อมูลจากนั้นพวกเขาจะเข้าสู่ระบบเพื่อให้ทำงานได้คุณต้องกำหนดชุดอักขระสำหรับรหัสผ่านของคุณไม่อนุญาตให้ใช้อักขระการแทนที่ Unicode และอักขระอื่น ๆ


2

คุณไม่ได้ระบุว่าคุณใช้ฐานข้อมูลอยู่หรือไม่ แต่ถ้าคุณเป็นและฐานข้อมูลนั้นคือ SQL Server คุณสามารถเพิ่มสิ่งที่เรียกว่าAutoAuditและบันทึกการโต้ตอบทั้งหมดกับข้อมูลของคุณโดยอัตโนมัติ เพียงให้แน่ใจว่าได้ระบุเฉพาะวัตถุที่คุณต้องการตรวจสอบ

แต่อย่างไรก็ตามฉันจะไม่พยายามเขียนโค้ดติดตามด้วยตนเองเพราะมันจะกลายเป็นฝันร้ายในการบำรุงรักษา

นอกจากนี้สำหรับการบันทึกอย่าม้วนข้อมูลของคุณเองใช้Enterprise Library LoggingหรือLog4Netหรือที่คล้ายกัน


2

เพียงคำแนะนำทั่วไป อาจไม่เกี่ยวข้องโดยตรงกับคำถามของคุณ

ขึ้นอยู่กับว่าคุณจะใช้บันทึกเพื่ออะไร บันทึกส่วนใหญ่จะใช้ในการผลิตเพื่อตรวจสอบการดำเนินงานที่ทำให้เกิดข้อผิดพลาด หากคุณเก็บไว้เพื่อติดตามการกระทำของผู้ใช้นั่นไม่ใช่ส่วนหนึ่งของบันทึก นั่นจะต้องเป็นคุณสมบัติฝั่งเซิร์ฟเวอร์ของผลิตภัณฑ์ สิ่งเหล่านี้จำเป็นต้องไปสู่ฐานข้อมูลเพื่อการศึกษาในภายหลัง แต่ฝั่งเซิร์ฟเวอร์บันทึกเช่น "เกิดข้อผิดพลาดเนื่องจากข้อความบางข้อความว่างเปล่า" ไม่ใช่ส่วนหนึ่งของคุณสมบัติ สิ่งเหล่านี้ต้องไปในระบบไฟล์ พวกเขาจะต้องมีเนื้อหาดังต่อไปนี้: - user_id, error_number, error_text, file_name, function_name, thread_id, system_date_time และบริบทอื่น ๆ

ตอนนี้ฉันพูดถึงบันทึกในไฟล์เท่านั้น

1) ให้พวกเขาไม่ตรงกัน การดำเนินการ I / O มีค่าใช้จ่ายสูง

2) ออกแบบให้เป็นคลาสมากกว่าฟังก์ชั่น การเปลี่ยนแปลงในอนาคตจะง่าย

3) ให้พวกเขาเป็นโสดถ้าเป็นไปได้ ซิงเกิลตันนั้นยากในแบบมัลติเธรดดังนั้นออกแบบให้เหมาะสม

4) ยังดีกว่าเพื่อให้การโต้ตอบระหว่างคนตัดไม้และคนเก็บข้อมูลง่าย เวลาส่วนใหญ่ส่ง message_number กว่า message_text จริงและให้คนตัดไม้ได้รับข้อความจากหมายเลข ซึ่งจะช่วยในภายหลังหากเราต้องการเปลี่ยนแปลงในรูปแบบบันทึกทั่วไป

ปกติคนตัดไม้และสิ่งที่เราต้องเข้าสู่ระบบควรเป็นส่วนหนึ่งของการออกแบบ ฉันได้เห็นกรณีที่มีการเปลี่ยนแปลงการออกแบบเพียงเพื่อให้แน่ใจว่าข้อมูลที่เกี่ยวข้องทั้งหมดได้รับการบันทึกอย่างถูกต้อง


1

ลอง Log4Net ช่วยให้คุณสามารถเข้าสู่ระบบไฟล์หรือฐานข้อมูล นี่คือการสอน !

เราใช้ Log4Net ในทุกโครงการของเรา


0

การใช้ไฟล์บันทึกนำเสนอปัญหาสองสามข้อ ประการแรกคุณอาจได้รับข้อผิดพลาดเมื่อมีหลายกระบวนการพยายามเข้าถึงไฟล์ คุณยังสามารถพบปัญหาเมื่อพยายามวนหรือล้างไฟล์ในขณะที่ระบบกำลังทำงาน วิธีที่จะใช้ฐานข้อมูล

ดังนั้นขั้นตอนที่ 1 คือการสร้างตารางฐานข้อมูล ฉันขอแนะนำฟิลด์ต่อไปนี้:
* userID
* การกระทำ (เช่นการเข้าสู่ระบบลบ foo)
* ข้อความอธิบายบางอย่าง (อนุญาตโมฆะที่นี่)
* การประทับเวลา

ขั้นตอนที่ 2 สร้างโพรซีเดอร์ที่เก็บไว้พร้อมกับอินพุตสำหรับ ID ผู้ใช้การดำเนินการและข้อความอธิบาย เพียงใช้เวลาปัจจุบันเพื่อสร้างการประทับเวลา

ขั้นตอนที่ 3 เขียนวิธีการบันทึกในไลบรารีที่ใช้ร่วมกันที่สะดวกเพื่อให้ง่ายต่อการรวมทุกที่และเข้าสู่การฝึกการเรียกวิธีนั้นตามต้องการ คุณอาจต้องการให้ตรรกะการตั้งค่าระดับการบันทึกเช่นกันเพื่อเปลี่ยนแปลงสิ่งที่บันทึกไว้

ขั้นตอนที่ 4 สร้างรูทีนการบำรุงรักษาเพื่อล้างข้อความเก่าจากตารางการบันทึกเป็นครั้งคราว อาจถูกลบเมื่อเก่ากว่า X รันในแต่ละสัปดาห์หรือมากกว่านั้นเพื่อเป็นส่วนหนึ่งของการบำรุงรักษาฐานข้อมูลปกติ (การสร้างดัชนีใหม่ ฯลฯ )

เมื่อคุณสร้างขึ้นครั้งเดียวคุณควรจะสามารถใช้รหัสที่เกี่ยวข้องในโครงการอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.