Üretimdeki kullanıcı eylemlerini günlüğe kaydetmek için en iyi yöntemler


22

Üretim ortamımda, bir kullanıcının ne zaman olduğu gibi birçok farklı şey kaydetmeyi planlıyordum:

  • Giriş Yap, Giriş Yap
  • Profili değiştir
  • Hesap ayarlarını düzenle
  • Şifreyi değiştir ... etc

Bu bir üretim ortamı üzerinde yapılması gereken iyi bir uygulama mı? Ayrıca tüm bunları kaydetmek için iyi bir yoldur. Şu anda oturum açmak için aşağıdaki kod bloğunu kullanıyorum:

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();
            }
        }

Bu üretim için uygun olacak mı? Başvurum çok yeni olduğundan milyonlarca kullanıcıyı hemen veya hiçbir şey beklemiyorum, bir web sitesindeki eylemleri takip etmek için en iyi uygulamaları ve hatta en iyi uygulamaları yapmak için en iyi uygulamaları arıyorum.


1
Muhtemelen Databasebir metin dosyası üzerinde bir önerebilirim ...

@DaveZych: günlüğe kaydetme amacına bağlıdır. Hata izleme / izleme bu amacın herhangi bir parçasıysa, veritabanı devre dışıdır. Bkz programmers.stackexchange.com/questions/92186/...
Marjan Venema

Temel bir uygulaması yaptım a User Activity Logger that hooks up various events, burada görebilirsiniz: stackoverflow.com/questions/30326673/… . Keyfini çıkarın!
Jeremy Thompson

Yanıtlar:


30

Bu, soruya doğrudan bir cevap değil, daha fazla bir genişleme.

Yeni bir uygulama başlattığınızda , kullanıcının yaptığı her şeyi kaydetmenizi öneririm : giriş yapın, çıkış yapın, çiziklerini a ** çizin, her şey. Web tabanlıysa, ısı haritalarını kullanmayı düşünün, böylece farelerinin ne yaptığını öğrenin.

Üzerinde iken BravoX projesi biz piksel-piksel fare hareketleri kullanıcıların bu tuhaf şeyi kullanabilir anlamaya kaydedildi oluyor sonlarında 70'te Xerox'ta bir WYSIWYG editörü olarak adlandırılan. Öğle yemeğinde kullanıcı oturumlarının oynatılmasını izlerdik. Son derece öğreticiydi. Charlie Browning adını verdiğimiz bir kullanım şekli keşfettik - kullanıcı bir metin seçip italik hale getirecekti ... sonra geri alırlardı ... sonra tekrar tekrar ileri geri giderlerdi. Anlaşılan bu şeyleri duygusal bir düzeyde anlamaya çalışıyorlardı. Biz de (Greg Kusnik, eğer kod hizmet veriyorsa, kodu yaptı) tam olarak bu davranışı desteklemek için bazı spesifik optimizasyonlar koyduk.

Kayıt olmadan bunu yapmayı asla düşünmezdik.


1
Sadece bu yoruma merkezlenmiş bir kitap yazabilirsiniz!
bishop,

Bu özel günlüğe kaydetme türü gerçek zamanlı kullanıcı deneyimiyle ilgiliydi, bu yüzden yazar olmazdım. Ben Bay Hardcopy yaptım. Yazdır'a bastığınızda , belgenin iç temsilini aldım, onu bir sayfa açıklama diline dönüştürdüm, sonra Ethernet denen bu tuhaf şey üzerinden , salonun hemen altındaki dünyanın ilk lazer yazıcılarına gönderdim. En çok etkileşimde olduğum gruplar, ABD Senatosu Tipografi Bölümü ve IMF'nin en iyi ve en zorlu beta test alanlarımızdan 2'sinin baskı grubu idi. Bu adamlardan düzen, yazı tipi, vb. Hakkında çok şey öğrendim . İyi zamanlar.
Peter Rowell

9

Yerinde olsam ve bir metin dosyasına yazmaya devam edersem, log4net kullanır ve belirli bir "UserActions.log" dosyasına giriş yapardım. Bu şekilde normal kayıtlarınızı karıştırmazsınız. Log4net'i (veya başka bir kayıt çerçevesini) kullanarak, tekerleği yeniden icat etmekten ve haddeleme dosya aparatlarından yararlanmaktan, kaçınmak / hata / hata ayıklama / bilgi kodlarından, toplu iş dosyası yazmaktan vb. Faydalanmaktan kaçınabilirsiniz. Herhangi bir üretim seviyesi uygulaması.

Gerçekte, tüm bu bilgileri bir veritabanında saklamak muhtemelen daha iyidir. Bir veritabanı kullanmak onu sıralamanıza, toplamanıza ve üzerinde daha kolay istatistikler yapmanıza izin verir


3
Kekinizi yiyip yiyebilirsiniz: log4net için bir DatabaseAppender var: logging.apache.org/log4net/release/config-examples.html . Ancak performans konusunda endişe duyuyorsanız, verileri daha hızlı raporlama için hazırlayan (bir rapor veritabanı olabilir), dosyalara giriş yapabilir ve bunları ayrı bir hizmette ayrıştırabilirsiniz.
Umutsuzluğa Karşı grev 9:12

9

Günlük dosyaları 1. sistem hatalarını ayıklama hakkında bilgi almak için kullanılır. 2. Yaramazlık için kullanıcı faaliyetlerini araştırmak veya 3. izleyemediğiniz zaman insanların sistemi nasıl kullandıklarını anlamak için. Bunu akılda tutarak:

  • Uygulama başlangıcında ortam günlüğü (örneğin ortam değişkenleri, diğer ayarlar vb.). Bu hata ayıklama sorunları için yararlıdır.
  • Her istek için kullanıcıyı ve eylemi (URL’nin farklı kısmı) günlüğe kaydedin.
  • Şifreler için EXCEPT her istek için tüm parametreleri giriniz . Günlükleri her parametre etrafına sınırlayıcıları koymak istiyorum phone{(999)999-9999} email{aaa@aaa.com}. Parolalar hiçbir zaman veritabanı dışında hiçbir yere tek bir şekilde yazılmamalı , her kullanıcı için benzersiz tuz ve birden fazla karma turu ile kriptografik olarak güvenli karma işlevi (bkz. Dipnot)
  • Giriş yaparken, kullanıcının ip adresini, kullanıcı kimliğini, adını, başarısız oturum açma sayısını, belki tarayıcıyı, belki çerez oturumu kimliğini, ancak şifreyi girmemelisiniz.
  • Giriş sayfasında ve şifre değiştirme sayfasında şifreyi kaydetmemeyi unutmayın , ya da bu işlevselliğe sahipseniz gizli soruyu kaydetmemeli veya cevaplamamalısınız. Başka hiçbir şifre veya şifreleme anahtarı kaydedilmemelidir. Bu parametreler için günlüğe altı yıldız gibi bir şey yazmak iyi bir uygulamadır, böylece bu verileri bastırmayı hatırladığınızı görebilirsiniz.
  • Her talebe hizmet etmek için gereken toplam süreyi kaydetmeyi seviyorum: Done: 49ms
  • Oturum durumuna değişiklikleri günlüğe kaydetmeyi severim. Bunlar nadir olmalı.
  • Diğerlerinin de dediği gibi, dosyalara giriş yapmak için veritabanlarına giriş yapmaktan emin olmadıkları için büyük giriş kütüphaneleri vardır.
  • Günlükleri güvenli bir şekilde saklayın. Parolalar olmasa bile, Kişisel Olarak Tanımlanabilir Bilgiler (bkz. Güvenli Liman ) hakkında günlük verilerini gizli tutan devlet, federal ve uluslararası yasalar vardır .
  • Yedekleri al. Her gece tam sürücü yedeklemelerine geçmelerine izin verirseniz, yeni bir sunucuya yükseltmeden önce onları başka bir yere yedeklediğinizden emin olun (bana bunu nasıl öğrendiğimi sormayın).

Diğer ipuçları

Dipnot: Birisini oturum açmak için, verilen parolayı aynı karma algoritma ile sağlayın ve bu kullanıcının orijinal karma değerinden gelen tuz. Sağlanan parolanın karması, veritabanında saklanan parola karması ile eşleşirse, o zaman oturum açmışlardır. Bunun çalışması için, şifreniz için ayarlanan karakteri tanımlamanız, Unicode değiştirme karakterine ve setinizin dışındaki diğer karakterlere izin vermemelisiniz.


2

Bir veritabanı kullanıp kullanmadığınızı belirtmezsiniz, ancak siz ve o veritabanı SQL Server ise, AutoAudit adlı bir şey ekleyebilir ve verilerinizle tüm etkileşimleri otomatik olarak kaydedebilirsiniz. Sadece denetlenmesini istediğiniz nesneleri belirttiğinizden emin olun.

Ama yine de, bir kabus gibi sonuçlanacağından izlememi manuel olarak kodlamaya çalışmıyorum.

Ayrıca, günlüğe kaydetme için, kendi başınıza dönmeyin , Enterprise Library Logging veya Log4Net veya benzerlerini kullanın.


2

Sadece genel bir tavsiye. Sorunuzla doğrudan ilgili olmayabilir.

Günlükleri ne için kullanacağına bağlı. Üretimde hatalara neden olan işlemleri tespit etmek için çoğunlukla günlükler kullanılır. Kullanıcı eylemlerini izlemek için onları saklıyorsanız, o zaman bu kütüğün bir parçası değildir. Ürünün sunucu tarafı özelliği bu olmalı. Bu şeyler daha sonra kesinlikle çalışmak için veritabanına gitmek gerekiyor. Ancak sunucu tarafı "Bazı metinler boşken hata oluştu" gibi kayıtlar özelliğin bir parçası değildir. Bunların dosya sistemine girmesi gerekiyor. Aşağıdaki içeriklere sahip olmaları gerekir: - user_id, error_number, error_text, dosya_adı, işlev_adı, thread_id, system_date_time ve diğer içerikler.

Şimdi sadece dosyalardaki kayıtlardan bahsediyorum.

1) Asenkronize olmalarını sağlayın. G / Ç işlemi maliyetlidir.

2) Fonksiyondan çok sınıf olarak tasarlayın. Gelecekteki değişiklikler kolay olacak.

3) Mümkünse onları tekil tutun. Singleton çok dişli olarak zordur, bu yüzden uygun şekilde tasarlayın.

4) Ayrıca, logger ve loggee arasındaki etkileşimi basit tutmak için daha iyidir. Çoğu zaman message_number öğesini asıl message_text'den gönderir ve logger'ın sayıdan mesajı almasına izin verir. Bu, daha sonra genel günlük biçimlerinde değişiklik yapmak istiyorsak yardımcı olacaktır.

Normalde logger ve ayrıca log yapmamız gerekenler tasarımın bir parçası olmalıdır. İlgili tüm bilgilerin doğru bir şekilde kaydedildiğinden emin olmak için tasarımda değişikliklerin olduğu durumlar gördüm.


1

Log4Net'i deneyin. Dosya veya veritabanına giriş yapmanızı sağlar. İşte Öğretici !

Log4Net'i tüm projelerimizde kullanıyoruz.


0

Günlük dosyası kullanmak birkaç sorun sunar. İlk olarak, birden fazla işlem dosyaya erişmeye çalıştığında hata alabilirsiniz. Sisteminiz çalışırken dosyayı açmaya veya silmeye çalışırken de sorun yaşayabilirsiniz. Bunun yolu bir veritabanı kullanmaktır.

Yani, adım 1 bir veritabanı tablosu oluşturmaktır. Aşağıdaki alanları öneririm:
* userID
* eylem (örn. Oturum açma, silme foo)
* Bazı açıklayıcı metin (burada boş bırak)
* timestamp

Adım 2, kullanıcı kimliği, işlem ve açıklayıcı metin için giriş ile saklı bir prosedür oluşturun. Zaman damgasını oluşturmak için geçerli saati kullanın.

Adım 3, Uygun bir paylaşılan kütüphaneye bir kayıt yöntemi yazın, böylece her yere dahil edilmesi ve bu yöntemi gerektiği gibi çağırma uygulamasına kolayca başlayın. Kayıtlı olanı değiştirmek için bir kayıt seviyesi bayrak mantığına sahip olmak isteyebilirsiniz.

Adım 4, zaman zaman tablodan eski mesajları silmek için bir bakım rutini oluşturun. X'ten daha eskiyse, her hafta düzenli DB bakımının bir parçası olarak çalıştırma (dizin yeniden oluşturma, vb.) Olabilir.

Bunu bir kez yaptıktan sonra, diğer projelerde yer alan kodu kullanabilmelisiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.