mehmetduran.com - Paylaşmak Güzeldir...
Asp.net ve Global.asax ile Ziyaretçi İstatistikleri
Bu yazımda site istatisklerini ve ziyaretçilerin bilgilerini nasıl tutabileceğimizi anlatmaya çalışacağım. Bu olayı asp.net'te ki global.asax dosyası yardımı ile yapacağız. Yaptığımız uygulama da her sayfa ziyaretini yakalayıp ziyaretçi hakkında bilgileri tutacağız. Her sayfa ziyareti için bilgiler tutmamız bize büyük bir alan gerektirir ve bunun için veritabanı kullanmak pek mantıklı olmaz. Bunu yerine bu bilgileri txt dosyalarında tutarak gereksiz veritabanı kullanımından kurtulabiliriz. Ancak ziyaretçi sayısı fazla olan bir sitenin istatiklerini tutuyorsak verileri saklayacağımız txt dosyası da verimli olmayabilir. Bunun için verileri tutacağımız dosyaları belirli aralıklarla değiştirmeli veya temizlemeliyiz. Kendi hostumun istatiklerini tutan sistem ve diğer birçok sistem bu yöntemi kullanıyor. Şuan kendi hostumun istatiklerini tutan txt uzantılı log dosyasına baktığımda boyutu yaklaşık 15 mb. Dediğim gibi bu verileri tutacağımız dosyayı sık sık değiştirmeliyiz. Peki bu istatiskleri asp.net ile nasıl tutacağımıza bakacak olursak:

Bu bilgileri her sayfa isteğini yakalayıp, bu sayfa isteğini yapan ziyaretçinin ip, ziyaret tarihi gibi bilgilerini tutacağız. Bu verileri ise global.asax dosyamızda yakalayacağız. Vereceğim örnekte verileri access veritabanında tuttum. Ancak bu bilgileri txt uzantılı log dosyalarında tutmak en mantıklısı. Global.asax'ta ki kodlarımıza bakacak olursak:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string sorgu = "insert into sayac (adres,sayfa,ip,kaynak,zaman) values(@adres,@sayfa,@ip,@kaynak,@zaman)";
        OleDbConnection baglanti = new OleDbConnection("provider=microsoft.jet.oledb.4.0; data source=" + Server.MapPath("~/sayac.mdb"));
        OleDbCommand komut = new OleDbCommand(sorgu, baglanti);
        komut.Parameters.AddWithValue("@adres", Request.ServerVariables["URL"].ToString());
        komut.Parameters.AddWithValue("@sayfa", Request.ServerVariables["Query_String"].ToString());
        komut.Parameters.AddWithValue("@ip", Request.ServerVariables["Remote_Addr"].ToString());
        komut.Parameters.AddWithValue("@kaynak", Request.ServerVariables["Http_User_Agent"].ToString());
        komut.Parameters.AddWithValue("@zaman", DateTime.Now.ToString());
        baglanti.Open();
        komut.ExecuteNonQuery();
        baglanti.Close();
    }

Görüldüğü gibi örneğimizde ziyaretçinin yaptığı her isteği yakalayıp, istek yaptığı adresi, querystring bilgisini, ip'sini, browser bilgilerini ve tarihi yakalayıp veritabanımıza kaydediyoruz. Böylece sitemiz hakkında kendi istatiklerimizi tutabiliriz. Tabi bu verileri veritabanı yerine txt dosyalarda tutmak en mantıklı yol olacaktır ve bu dosyları da belli aralıklarla güncelemek gerekecektir.
İyi Çalışmalar!
Mehmet Duran 11 Eylül Perşembe 2008 30 32427 3,9
Bookmark and Share
Bu Yazıyı Değerlendirin.
Konuyla İlgili Olabilecek Diğer Yazılar MySql Veri Türleri ve Select Komutu Örnekleri Jquery ve Ajax ile Kullanıcı Kontrollerini Kullanma - 2 Bloğumun Google Pagerank Değeri 3 Oldu Asp.net ile Xml Belgeleri Okuma ajax.mehmetduran.com Yayında!
Yorumlar
Yorum Yaz
RSS Yorum Takibi
EmrE TURAN 28 Eylül Pazar 2008 15:53 #1
Neden veritabanı yerine txt lerde tutulmasını öneriyorsunuz ?
Mehmet Duran 28 Eylül Pazar 2008 17:46 #2
Çünkü her sayfa ziyaretinde veriler elde ediliyor. Eğer ziyaretçi sayısı fazla olursa veritabanı kullanmak verimli olmaz. Veritabanının verimi düşer. Metin belgesi kullanmak en mantıklı iş. Çünkü araştırdım ve istatistikleri tutan sistemler genellikle metin dosyası kullanıyor.
Hüseyin KAMAR 21 Kasım Cuma 2008 15:22 #3
Hocam bu verileri sayfamızda yani default sayfamızda nasıl göstereceğiz.
Mehmet Duran 21 Kasım Cuma 2008 17:55 #4
Eğer verileri veritabanında tutuyorsanız veritabanından değerleri okuyup alacaksınız yada text dosyalarında tutuyorsanız text dosyalarını okuyarak değerleri alacaksınız.
İhsan Bulut 05 Şubat Perşembe 2009 16:21 #5
Üstad Burada toplam ziyaretci istatistigini ip numaralarını tekil şekilde alsak elde edebilirmiyiz? aynı ip numarasının bir süre sonra başkasında olma olasılığı da var ama. toplam ziyaretci istatistiğini nasıl elde edecez? bu arada mailime cevap verdigin icin saol. dediğin yoldan halletim problemimi. :)
Mehmet Duran 05 Şubat Perşembe 2009 16:27 #6
Burada elde ettiğimiz IP dediğin gibi bir kaç kişi tarafından farklı zamanlarda alınabilir. Ama bu IP adresini kullancaksak buna mecburuz. Toplam ziyaretçi sayısnı bulurken de IP adresine bakarak farklı olanların (distinct komutu ile) sayısını elde edebiliriz. Birçok istatitstik servisinin de böyle yaptığını düşünüyorum. Ancak dediğin gibi IP adresi farklı kişilerde aynı olabilir. Bunun için değişmeyen ve elde edebileceğimiz değerleri kullanmalıyız. Bunları da araştırarak elde edebiliriz.
ihsan bulut 05 Şubat Perşembe 2009 16:38 #7
peki üstad sadece kullanıcı sayısını tutacagımızı varsayarsak her sayfa load edildiginde bir kullanıcı icin sayfanın yeniden bilgileri veritabanına eklemesini nasıl engelleyebiliriz? ornegin baska sayfaya geciş yaptım ben ve bunu veritabanının aşırı şişmemesi icin kayıt etmek istemiyorum. bu verdigin kodları session startta kullansak cözülürmü? yada nasıl?
Mehmet Duran 05 Şubat Perşembe 2009 16:41 #8
Dediğin gibi bu kontrolü Session_Start eventı ile yapabilirsin. Bunun dışında ek bir kontrol ile kullanıcının IP`sini kontrol ederek daha önce giriş yapıp yapmadğını bulup ona göre kayıt edersin. Bu yöntem ek bir kontrol gerektiriyor ve yine IP üzerinden işlem yapıyor. Tercih sana kalmış.
Mahsun 31 Mart Salı 2009 11:28 #9
verdiğin bilgiler için Teşekkürler. Ancak Hocam bir sorum olcak biz bu global.asax dosyayı nasıl sayfanın içine adepta edeceğiz...
Mehmet Duran 31 Mart Salı 2009 21:20 #10
Merhaba. Global.asax dosyasını sayfa içine koyma gibi durum yok. Bu dosyayı projemize ekliyoruz. Bunu da sayfa ekler gibi yapabiliyoruz.
osman durmuş 03 Temmuz Cuma 2009 08:39 #11
mrb hocam arkadaşlık sistemi yazıyorumda online üye için üyeler tablosunda onlinemi diye bi sütun var ve default olarak false.üye girişi yapınca session["kullanıcı"]=üye_id oluşuyo.benim yapmak istediğim session start olunca bu id yi sql cümlesine sokarak onlinemi true yapmak session end de false yapmak.yani online olup olmadığını belirlemek istiyorum ama global.asax ta sql cümleleri yazılmıor.bu anlattığım olayı nasıl yapabilirim
Mehmet Duran 03 Temmuz Cuma 2009 11:02 #12
Merhaba. Global.asax`ta veritabanı sorgulaması ve veritabanı işlemi yapabilirsin. Yukarıda vermiş olduğum kodlarda veritabanı işlemi yapıyorum. Yapmak için hangi namespace`i kullanacaksan onu import etmelisin. Bunun için en başa <%@ Import Namespace = System.Data %> gibi bir ekleme yapmalısın.
osman durmuş 03 Temmuz Cuma 2009 23:45 #13
hocam üye girişi yapınca session["id"]=üyenosu diye session oluşuyor global asaxta session start ta bu oluşan int id = Convert.ToInt32(Application["id"]); diye alıyorum ve sql cümlesine sokuyorum onlinemi sütununu true yapan update sorgusunu yazıyorum ama olmuyor hatada vermior olmuyorda yanlış bişimi yapıorum.üye girişinde oluşan sessionu session startta nasıl alırız benim yaptığım gibi olmuyor sanırım
Mehmet Duran 04 Temmuz Cumartesi 2009 00:02 #14
Merhaba. SessionStart web uygulamasına istekte bulunulduğunda ve tarayıcı bu web uygulamasını açtığında çalışır. Bu yüzden üye girişi ile sessionstart arasında bir ilgi yok. Çalışmama nedeni büyük ihtimalle bu. Sorguyu üye giriş yapınca çalıştır. Yani giriş yaptığında direk olarak online sütununun değerini değiştir. SessionEnd veya başka end eventları ile de offline olarak ayarlama yaparsın.
osman durmuş 04 Temmuz Cumartesi 2009 01:45 #15
çok teşekkür ederim hocam dediğiniz gibi yaptım sorun çözüldü ilginize teşekkürler
sefa 01 Eylül Salı 2009 13:43 #16
bende global.asax ile istatistik yaptım herşey doğru çalışıyor ama online ziyaretçi fazla gösteriyor acaba neden olabilir ki_? Online Ziyaretçi : 17 Bugün Toplam : 87 Bugün Tekil : 11 Dün Toplam : 36 Genel Toplam : 349 online 17 , tekil 11 _??????
Mehmet Duran 01 Eylül Salı 2009 22:39 #17
Bunun nedeni yazdığın kod ve bu kodların çalışma zamanı. Yazdığın kod hakkında daha fazla detay verirsen daha iyi yardımcı olurum. Online ziyaretçi sayısını SessionStart eventı ile artırmalı ve SessionEnd ile de azaltmalısın. Ancak tamamen veritabanı kontrolü ile de yapılabilir ancak bu çok performanslı olmayabilir. Daha iyi yardımcı olmama için kodlarından bahsetmen gerekir diye düşünüyorum.
sefa 02 Eylül Çarşamba 2009 11:00 #18
öncelikle ilgin için teşekkür ederim kodlarım aynen şöyle =>artırma protected void Session_Start(object sender, EventArgs e) { Application.Lock(); Application["OnlineUsers"] = Convert.ToInt32(Application["OnlineUsers"]) + 1; Application.UnLock(); } ve azaltma protected void Session_End(object sender, EventArgs e) { Application.Lock(); Application["OnlineUsers"] = Convert.ToInt32(Application["OnlineUsers"]) - 1; Application.UnLock(); }
sefa 02 Eylül Çarşamba 2009 11:14 #19
taslak.master.cs sayfamda ise şöyle gösteriyorum lbl_online.Text = Application["OnlineUsers"].ToString();//Online ziyaretçi yani kısacası herkesin yaptığı gibi ama neden problem oluyor anlamadım
Mehmet Duran 02 Eylül Çarşamba 2009 21:30 #20
Bu şekilde bir sorun olmaması gerekir. Ancak tekil dediğin değişken ne? Sanırım problem orda oluyor. Online sayısı bu şekilde olmalı.
sefa 02 Eylül Çarşamba 2009 21:43 #21
zaten bana kafayı yedirecek olan da bu , aynen böyle olması gerekirken böyle olmuyor acaba server ın session ayarlarında felan mı problem var ki_? diyecem o da olmaz anlamadım gitti tekil sayıya da gelince onu veritabanımda tutuyorum ip leri karşılaştırıyorum farklıysa artıyor onda problem yok ona eminim başka servislerle de kontrol ediyorum sorun online sayısında istersen vaktin olursa sana zahmet bi siteye bak httpp://www.nihatustam.com ilgine teşekkür ederim
Mehmet Duran 02 Eylül Çarşamba 2009 22:04 #22
Sorun şimdi anlaşıldı. Eğer tekil sayıyı IP ile kontrol ediyorsan Online sayısını da kontrol etmen gerekir. Online sayısında böyle bir kontrol yapmadığın için kullanıcı her session süresi dolduktan sonra tekrar online gibi olurken tekil sayı IP'den dolayı sabit kalacaktır. Ayrıca session süresi de serverdan dolayı senin verdiğin olmayabilir. Bence IP kontrolünü online sayısı için de yapmalısın.
Mehmet Duran 02 Eylül Çarşamba 2009 23:35 #23
Eğer veritabanı kullanıyorsan online ziyaretçi bilgilerini de veritabanından alabilirsin. Nasılsa IP'leri tutuyorsun. Bunun yanında bir de tarih tutup bu tarihe göre son 5 dakika ve belirlediğin süre içinde gelenleri online olarak göstrebilirsin. Böylece tekil ile olan farklılık gider. Ayrıca Session süresi gibi değerin önemi kalmaz.
sefa 03 Eylül Perşembe 2009 18:38 #24
öncelikle ilgine gerçekten çok teşekkür ederim dediğin şeyi bende düşündüm ama bu performans açısından galiba problem olur diye düşündüm ama yapacak başka bişe yok galiba bende dediğin gibi yapacağım teşekkür ederim
Oğuzhan 07 Kasım Cumartesi 2009 19:27 #25
Merhaba, ben verdiğiniz örnek uygulamayı çalıştırmaya çalışıyorum. verdiğiniz kodda sorun yok. ben biraz daha detaylı olacak şekilde geliştirdim. access kullanıyorum. ancak ben bazı sayfaları filtrelemek istiyorum. bunu yapmanın bi yolu var mı acaba? site ve sitenin içinde yönet klasörü var. yönet klasörü yöneticiler için acaba bu klasörü global den korumanın bi yolu var mı? yani yöneticinin bilgilerini tutmak yersiz olacak. makale basit ve güzel olmuş
Mehmet Duran 07 Kasım Cumartesi 2009 23:34 #26
Merhaba. Bunun için adresi kontrol ederek istemediğin adresleri süzmelisin. Örneğin burada paylaştığım kodlarda login.aspx ve admin.aspx sayfası dışında gelen tüm isteklerde sayfalara kendi mesajımı yazdırıyorum. Sen de aynı bu mantıkla kendi sorununu çözebilirsin.
halil 19 Temmuz Pazartesi 2010 15:44 #27
Öncelikle herkeze merhaba.Umarım bu makale için soru sormakta geç kalmamışımdır.Ben siteden çıkan kullanıcının kim olduğunu nasıl öğrenebilirim diye soracaktım.Yani ben kaç kişinin online olduğunu tutmak yerine online olan kullanıcıların isimleriniekranda göstermek istiyorum makaleden anladığım kadarı ile bunu yapmak kolay.Ama kimin çıktığını nerden anlarım bu konuda bana yardımcı olursanız sevinirim.Yardımlarınız için şimdiden teşekkürler.
Mehmet Duran 19 Temmuz Pazartesi 2010 16:57 #28
Sistemden çıkış yapanları direk olarak elde etmek biraz sıkıntılı. Normalde Session_End eventı ile bu işlemin olması gerekiyor. Ancak daha önceki çalışmalarımda bu yol ile istediğimi elde edememiştim. Bunun yerine kullanıcıların en son online olmas sürelerine göre işlem yaparsan da istediğini tam olmasa da kısmen yapabilirsin.
halil 19 Temmuz Pazartesi 2010 17:47 #29
Cevap için teşekkür ederim.inşallah sağlıklı bir yolunu bulurum ve unutmassam sitenizde paylaşırım.çalışmalalarınızda başarılar.
Serkan 16 Ekim Cumartesi 2010 01:00 #30
Ziyaretçi istatistiği için zamanında güzel bir script hazırlamıştım. Access veritabanı kullanmaktadır. Scriptin çalışan örneği http://www.birturku.com adresinde mevcuttur. İncelemek isteyen olursa http://www.aspindir.com/Goster/5999 adresinden indirebilirler.
İsim :
Site :
Yorum :

Buradan bu yazıya ait yorumları RSS olarak takip edebilirsiniz.

Bu servis ile yazılara eklenen yorumları RSS ile takip ederek konu ile ilgili başkaları tarafından yapılan yorumları veya konuyla ilgili sorduğunuz sorulara verilen cevapları görebilirsiniz.
Şans bir uğraşının eseridir.
Bölümler
Yazılar
Arşiv
Arama
Linkler
Site İçi Arama
Son Zamanlarda Ne Yapıyorum ?
İstatistikler - Araçlar - Reklam
İstatistikler
Sayaç
Mehmet Duran | mehmetduran.com | Copyright © 2009