Günlük dosyası günlüğünü koru. Zend log php ile PHP girişi

  • 20.06.2020

Her gerçek Php. Zaman zaman başvuruları hatalar ve istisnalar, ekspres uyarıları, mesajları vardır. Bu bilgiyi kaydetmek için uyanık değilsek (kayıt), o zaman bir iyi anda, bu hataların ve istisnaların başvurunun hangi bölümünde ortaya çıktığını ve buna göre onları çözemeyeceğini anlamak imkansız olacaktır. Ek olarak, olayların kaydedilmesi, eylemlerin, kullanıcının sisteme girişinde olduğu gibi, örneğin, örneğin kullanıcının girişinde olduğu gibi, eylemlerin gerekli olduğu gibi durumlar vardır.

İÇİNDE PHP zaten kaydolma için gerekli araçlar var: Fonksiyon error_log () - Sistem günlüğüne bir mesaj göndermek için özellik set_error_handler (), Uyarıları ve hataları engellemek için. Bu fonksiyonlar, kullanıcı hata yönetimi için kullanılabilir, bir kod geliştiricisi, işleme mantığını ve hata filtrelemesini kendi kendine kontrol etme olasılığını verir.

Bununla birlikte, bu tür düşük seviye erişim, kodun sık çoğaltılmasına yol açar ve daha da önemlisi, böyle bir kod hatalara daha yatkındır. Bu nedenle, hazır bileşenler, "Savaş" koşullarında iyi test edilmiş ve kanıtlanmış programcının yardımına gelir.

Bu tür bileşenler ifade eder zend-log bileşeni nın-nin freamenki Zend.. Bileşen zend-log. Çok amaçlı bir günlük bileşeni, tüm ellerin bir tür ve ustası olarak kullanılabilir. Çeşitli günlük biçimlerini ve veritabanı çeşitlerini (dosyalar, veritabanları) destekler, ayrıca gelişmiş bir mesaj filtreleme sistemi ve çok daha fazlasına sahiptir. Ayrıca zend-log. Uyumlu S. PSR-3. Günlük standardı. Böyle kurduk:

Besteci ZendFramework / Zend-Log gerektirir

Aşağıdaki gibi kullanılır (örneğin, index.php dosyası proje rootunda kullanılır):

"Satıcı / AutoLoad.php" gerektirir;

Zend \\ log \\ logger kullanın;
Zend \\ Log \\ Writer \\ Stream kullanın;

$ Logger \u003d yeni logger;

// konsola hataları gönder
$ writer \u003d yeni yayın ("php: // oouput");

$ Logger -\u003e Addwriter ($ Yazar);
$ Logger -\u003e log (logger :: info, "bazı bilgiler");

Kodun sonucu daha yüksektir:

2017-09-26T10: 40: 34 + 03: 00 Bilgi (6): Bazı bilgiler

Son dize olay zamanını, önceliğini ve mesajı içerir. Görüntülenen mesajın formatı, yöntemi kullanarak gerekirse kesinlikle değiştirilecektir. setformatter (). Varsayılan olarak, günlük dizgisi aşağıdaki şablonla açıklanmaktadır:

% Zaman damgası %% PriorityName% (% öncelik%):% mesaj %% Ekstra%

  1. % zaman damgası% bir zaman damgasıdır
  2. % PriorityName% - Metin Etiketi Öncelik
  3. % Öncelik% - sayı etiketi önceliği
  4. % Message% - Mesaj
  5. % Ekstra% - Ek bilgi için isteğe bağlı değer

Mesaj biçimini değiştirmek istiyorsanız, bu aşağıdaki gibi yapılır:

$ Formatter \u003d Yeni Zend \\ Log \\ Formatter \\ Basit ("% mesaj%". Php_eol);
$ Yazar -\u003e SetFormatter ($ formatter);

Bileşen zend-log. Ayrıca hataları ve PHP tercümanının istisnalarını kaydetmek için de kullanılabilir. Bunu yapmak için, logger sınıfında, hala iki statik yöntem vardır: Logger :: RegiserRorHandler ($ logger) - hataları engellemek ve Logger :: RegityExceptionHandler ($ logger) - İstisnaları engellemek için.

Zend \\ log \\ logger kullanın;
Zend \\ Log \\ Writer kullanın;

$ Logger \u003d yeni logger;
$ Writer \u003d yeni yazar \\ stream (__ dir__. "/Test.log");
$ Logger-\u003e Addwriter ($ Yazar);

// kayıt hataları
Logger :: RegisterErrorHandler ($ logger);

// İstisnalar günlüğe kaydetme
Logger :: RegityExceptionHandler ($ logger);

Daha önce de belirtildiği gibi, zend-log. Bize günlüğe kaydetme için mesaj filtreleme olasılığı sağlar, yani. Bir günlüğe bir mesaj kaydetmeden önce, kriterlerimizi tatmin edip etmediğini ve eğer evet olup olmadığını izleyebiliriz.

İşte bir örnek:

$ Filtre \u003d Yeni Zend \\ Log \\ Filter \\ Öncelik (Logger :: Crit);

// yazar addfilter yöntemi
$ Writer-\u003e Addfilter ($ filtre);

Bu örnekte, yalnızca önceliği daha az veya kritik olana eşit olan mesajları oturum açacağız ( Logger :: crit.).

Sınıfta tanımlanan önceliklerin tam bir listesi Zend \\ log \\ logger:

Const Ecz \u003d 0; // kaza: Sistem kullanım için uygun değil
Const Alart \u003d 1; // Anksiyete: Acil olarak harekete geçmesi gerekiyor
Const eleştirisi \u003d 2; // Kritik durum
const err \u003d 3; // Hata
Const uyarısı \u003d 4; // Bir uyarı
Const Notu \u003d 5; // dikkat
Const Info \u003d 6; // bilgi
Const Debug \u003d 7; // debag, hata ayıklama

Ayrıca, düzenli ifadelere, geçici etiketlere, vb. Dayalı mesajları da filtreleyebiliriz. Böylece, pHP'de oturum açma. - Geliştirirken önemli ve bazen gerekli bir şeydir. internet uygulamaları.

İnternette sitenize muhasebe katılımına hizmet veren çok sayıda hizmet var. Bu hizmetler hem ücretli hem de ücretsiz için sağlanmıştır. Örneğin, LiveInternet'i getirebilirsiniz. Bu hizmet internette oldukça geniştir ve hemen hemen her site hizmetlerini kullanır. Sahibi, sitesini ziyaret etme konusunda ayrıntılı istatistiklere sahiptir.

Hiçbir anlaşmazlık yok! Bu hizmetler saha katılımını dikkate alarak vazgeçilmezdir ve kullanıcı davranışının daha fazla çalışması. Ancak bu makalede, sunucuda bir günlük dosya günlük dosyası yapmayı söylemek istiyorum.

Günlük dosyası ziyaretleri

Bu günlük dosyası, ziyaretçilerinizin ziyaretçilerinizden ziyade ziyaretlerini ve görünümlerini hesaba katar. Bir günlük dosyası oluşturmak için, PHP'de yazılmış bir komut dosyası kullanın. Komut dosyası, siteyi anlamak ve kurmak oldukça basittir.

Günlük dosyası oluşturmak için PHP komut dosyası

Komut dosyası sitenin tam zamanını kaydeder, ziyaretçinin tarayıcısını tanımlar ve en önemlisi - ziyaretçinin nereden geldiğini belirler. Site sayfası her görüntülendiğinde bir giriş günlüğü dosyası oluşur. Yani, sitenin sahibi, belirli bir tarayıcı kullanarak belirli bir IP ve STA için özel olarak site sayfası ziyaretçisini özel olarak görünen günlük dosyasında görebilir.

Günlük dosyasında veri kayıt komut dosyasını listeleme

Komut Dosyasının Kurulumu

Komut dosyasını şablona veya harici user.php dosyasına kaydedin. Komut dosyasını sayfaya eklemek için aşağıdaki kodu kullanın.

Sitedeki tüm soruların çoğu "Yardım, çalışmıyor, başlamıyor ..." başlıyor. Tüm cevaplar bilgi istemleri ve tavsiyelerine düşürülür, ancak neden daha önce oluşmadığımı, hataları ne arayacağımı veya günlüklerin kullanımı hakkında bilmiyorum. Bu nedenle, boşluğu doldururuz ve herkesin bu makaleyle tanışmasını tavsiye ederim.

Günlüğü. (kütük) - (Eng. günlüğü.belki dosyalardan önce tanıştınız * .log.) Kural olarak, kronolojik bir siparişin bir olay listesi, olay günlüğü, günlüğü, kayıt, protokolün bir listesi olduğu bir metin dosyası. Günlükler çeşitli programlar, hizmetler, işletim sistemleri tarafından oluşturulur. Her program için, günlüğünüzü (metin dosyası) oluşturabilirsiniz.

Bir site geliştirirken, günlük geliştiricisi oluşturulacak:
1. İşletim sistemi seviyesindeki günlükler:
- Bilgisayarım - Kontrol Paneli - İdari Araçlar - Olayları Görüntüle
- Bilgisayarım - Execute - "Eventvwr.msc"


Bu, Windows işletim sistemindeki tüm olaylar hakkındaki kayıtları içerir. Burada, sekmeleri dahil:
- Özel Görünümler / İdari Etkinlikler
- Windows günlükleri / sistem

Apache ile ilgili günlükleri (apache web sunucusu bir hizmet olarak çalışıyorsa) ve örneğin uzantılar (uzantılı) PHP'nin neden olduğu diğer hatalar bulabilirsiniz. Ve büyük ve büyük, tüm Windows hataları buraya girilir. Bir hizmet olarak Apache, Windows'un bir parçası olarak kabul edilir, bu nedenle Apache hizmetini başlatırsanız, herhangi bir hata oluşur, kod çözmeyi aramanız ve buradaki hata. Sonra, günlüklerdeki hataların şifresi çözülmesi, sorunun ne bilgisini anlamanıza izin vermezse, günlüğün ana bölümlerini Google'da kopyalayıp benzer sorunları arayın. Cevaplanmanız için hafifçe muhtemeldir. Herhangi bir oyunu başlattığınızda, program, servis, bir hata oluştuğunda, günlüklerde daha ayrıntılı bir hata açıklaması olan yeni bir giriş görünür. Bundan sıyırma, her zaman internette bir cevap bulabilirsiniz.

2. apache günlükleri:
Windows günlüklerine ek olarak, Apache'nin kendisi, Viewide dosyasında kendi girişini oluşturur. Apache Web sunucusunu dosyada kurarken ve yapılandırırken httpd.conf. Bir dize var: errorlog "c: /apache/error.log" nereden, "c: /apache/error.log" Yolu Apache Web Server dosyasına. Yolunuzu kurun veya yalnızca hatırlayın, Apache'yi başlattığınızda hata durumunda, bu dosyayı açmanız ve hataların nedenlerinin yansıtılacağı son kayıtları bulmanız gerekir. Bu web sunucusuna ek olarak Apache, her sanal ana bilgisayar için ayrı ayrı günlükler oluşturmanıza olanak sağlar. Dosyadaki sanal ana bilgisayar örneği conf / ekstra / httpd-vhosts.conf:


Documentroot "C: / Apache / Symfony / www / Web"
SunucuAdı Symfony
Serveralias www.symfony
Errorlog "c: /apache/symfony/error.log"
Customlog "c: /apache/symfony/access.log" ortak


Documentroot "C: / apache / phpmyadmin"
Servername phpmyadmin.
Serveralias www.phpmyadmin.
Errorlog "c: /apache/phpmyadmin/error.log"
Customlog "c: /apache/phpmyadmin/access.log" ortak

3. php günlükleri:
Dosyadaki PHP yapılandırmasını yapılandırırken php.ini.Günlük ekranı yapılandırmak için aşağıdaki satırları bulun:

error_reporting \u003d e_all & ~ e_notice & ~ e_strict // görüntüleme ve kayıt türleri görüntülenen hatalar
log_Errors \u003d Açık. // günlüğü aç
log_errors_max_len \u003d 1024. // Maksimum günlük dosyası boyutunu belirleyin (1024 bayt)
error_log \u003d php_errors.log. // Günlüklerin kaydedileceği dosyanın adını belirtin, bu dosyalar sanal ana bilgisayarınızın kökünde oluşturulur. Her ev sahibi için, dosyanız oluşturulur.

Tüm PHP hatalarının dosyaya yazılacağı gerçeğine ek olarak, ERROR_LOG işlevinin yardımı ile PHP komut dosyasının yürütülmesi sırasında günlükler de oluşturabilirsiniz. Aktif olarak Try ... Catch kodunu kullanıyorsanız, böyle bir durumda, komut dosyaları kritik hatalar durumunda bitmeyecektir ve tüm öngörülemeyen hatalar her zaman günlüklerde işaretlenecektir.

deneyin (
$ r \u003d 5/0;
) Yakala (YARDIMCI YARDIM) (
ERROR_LOG ($ EXC-\u003e GETMESSAGE ());
}

Bu kodun sonuçlarına göre, günlük dosyası php_errors.log. Bunun gibi bir çizgi eklenecek:

PHP Uyarı: C: \u200b\u200b\\ Apache \\ Test \\ www \\ index.php satırında sıfıra göre bölünme 5

Hepsi bu, sadece her yerde günlükleri kullanın ve koddaki hataları ve hatalı veri işleme nedenlerini hızlı bir şekilde bulacaksınız.

483

Surround sitelerde, hataların kullanıcının tarayıcıdaki en beklenmedik yerlerde ne zaman görüntülendiğini görmek gariptir. Neden göründüler - bu ayrı bir sohbet. Ama neden türetilmişler? Sonuçta, hataların metni Debag için bilgidir ve geliştiriciye yöneliktir ve müşteri için değil.

Ayrıca, genellikle kötü hackerların siteyi kırmalarına yardımcı olan bu hizmet bilgisidir. Klasik bir örnek olarak, hatadaki sorgu çıktısına sahip bir seçenek verebilirsiniz: "Nerede ID \u003d" için sorguda bir hata var ... Çok teşekkür ederim. SONRA SONRASI "NEREDE KİMLİĞİ" ... "Dize" 0 veya 1\u003e 0 "ve sorgu tüm tablo boyunca gerçekleştirilir. Kaldırma talebi varsa, o zaman ... anladığınız, eğlenceli \u003d). Bu nedenle, her zaman tırnak içinde değişkenler sonuçlandırırım. Her ihtimale karşı...

Ama ben taşındım. Bugün bu konuda değil. Bugün, tüm mesajları bellek için web yöneticisine kaydederek, müşterinin hata çıktısını nasıl önleyeceğiz.

Başlatalım, belki de PNP'deki hata türlerinin kısa bir görünümüyle.

Tablo 1. PHP4'teki hataların açıklamaları (Orijinal Liste)
Sayısal
değer vermek
Sabit Açıklama Yakalandı / hayır
1 E_Error. Ölümcül hatalar. Örneğin, belleğe erişirken bir hata. Komut dosyasının yürütülmesi kesintiye uğradı. değil
2 E_warning Uyarılar (ölümcül hatalar değil). Komut dosyasının yürütülmesi kesintiye uğramaz. evet
4 E_PARSE. Sözdizimi analizi sırasında hatalar. Parer üretildi. değil
8 E_notice Açıklamalar (uyarılardan daha az ciddi hatalar). Script'in normal çalışması sırasında daha ciddi bir hataya neden olabilecek durumu belirtin. evet
16 E_core_error PHR indirme sırasında hatalar. Analog E_Error, PNP çekirdeği tarafından üretilir. değil
32 E_core_warning PHR'nin indirilmesi sırasında uyarılar Analog E_WARning, PNP çekirdek tarafından üretilir. değil
64 E_compile_error. Kod derleme sırasında ölümcül hatalar. Analog E_Error, ZENDA motoru tarafından üretilir. değil
128 E_compile_warning Kodun derlenmesi sırasında uyarılar. Analog E_WARNING Zandov Motoru tarafından üretilir. değil
256 E_user_Error. Özel hata. evet
512 E_user_warning. Özel uyarı. evet
1024 E_user_notice Özel açıklama evet

Kesilebileceğimiz hatalarla ilgileniyoruz. Bunlar arasında: E_WARNING, E_NOTICE ve E_USER_ *. Kalan hata türleri, PNP çekirdeğinin kendisinin yüklenmesinin bitiminden önce veya sözdizimsel analiz aşamasında meydana geldikleri gerçeğinden dolayı ya da sözdizimsel analiz aşamasında meydana geldikleri gerçeğinden dolayı uygun değildir. , böylece sonuçları basitçe devre dışı bırakmak zorunda kalacaklar:

ini_set ("Display_Errors", 0);

Ancak, komut dosyalarımızın, temel sözdizimsel hataları olmadığı için yeterince hata ayıklandığını varsayıyorum, bu yüzden hiçbir şey kaybetmemeliyiz.

Varsayılan olarak, PNP'deki hata seviyesi E_ALL & ~ E_NOTICE (veya sayısal formda 2039), bu, yorumların kulaklarını atladığımız anlamına gelir, ancak diğer tüm hataları bilgilendiririz.

Bu nedenle, e_all üzerindeki hataların çıkış seviyesini değiştirin:

Error_reporting (e_all);

Şimdi işleyici hatalarını geçersiz kılar ve bunun yerine fonksiyonumuzu değiştirin, bu şimdi işleme hataları yapacak:

Set_error_handler ("user_log");

Bu özelliği daha fazla düşünün. O iletilir 5 parametre:

  • hata kodu
  • hata metni
  • bir hatanın oluştuğu dosyanın adı
  • dosyada satır.
  • değişken dizisi

Bu özelliği iade etmek zorunda değildir. Günlük hatasını daha sonra görüntüleyeceğimizden sonra, örneğin bir dosyaya, daha sonra onunla rahatça çalışacağımız için bir günlük kaydetmeniz gerekir.

\u003d (Log_file_maxze * 1024)) (// Log_rotate yüklendiyse, // sonra eski dosyaları bir aşağı kaydırın ve boş bir log // değilse, eski log_rotate yerine boş bir log // oluşturun. \u003d\u003d true) ($ i \u003d 1; // Eski günlükleri olsa da düşünüyoruz (IS_FILE (log_file_name. "." $ İ)) ($ i ++;) $ i--; // onların her biri dönüşler 1 numarayı arttırır ($ i\u003e 0) (yeniden adlandır (log_file_name. ".." $ i, log_file_name. ".". (1 + $ i--));) Yeniden adlandır (log_file_name, log_file_name. ". 1. 1 "); Düğmesine (log_file_name);) Elseif (IS_FILE (LOG_FILE_NAME)) (// Üst üste oturumları yazarsanız, // dosyasını silin ve bir yeniden boş bağlantı dosyası oluşturun (log_file_name); Touch (log_file_name);) / * Değilse böyle bir dosya olup olmadığını kontrol edin - eğer varsa, eğer varsa - buna yazabilir miyiz * / if (! T Günlük dosyası oluşturun ";)) elseif (! İS_writl (log_file_file_file)) (Döndür" log dosyasına yazabilirsiniz ";) // fonksiyona dikkat edin hangisi kütük yazıyoruz. error_log ($ err_str, 3, log_file_name); )?\u003e.

Tabii ki, depolamayı bu amaçlar için daha mantıklı kullanmak mümkün olacaktır - baz, ancak sonuçta, hatalardan sonra, çoğunlukla, baz ile çalışırken, bu yüzden güvenilmeyecekti.

Aslında, hepsi bu. Gerisi, özellikle Dosya () işlevlerini kullanıyorsanız, sizin için zor olmayacağını düşünüyorum; & Patlayın (); . Ve hala telafi ederseniz, [bu kod] kullanabilirsiniz.

"Neden bu durumda mantıksal olarak kullanılıyor gibi göründüğü, neden CSV kullanmadım?" Sorusunu tahmin etmek için cevap veriyorum: Hata mesajları, açıkça zorlaştıracak başka bir sayıda servis karakteri (aka virgül ve noktalı virgül) içerebilir. CSV'yi kullanmak için. Evet, ve oturumda Excel'e göz atmayacağım.

Bu konuda daha farklı düşünceler:

  • gZ günlüğü bir dosyaya sahip olmak ve arşive katlamak için modası geçmişse;
  • aynı, ancak paketle posta ile;
  • kritik Hatalar - Satış Posta durumunda (işlev için bir el kitabından bir örneğe bakın)

PHP'de oturum açma, web uygulamanızı / siteniz / PHP betiğinizi ve nasıl olduğunu söyleyeceğine dair.

Uygulamadan hata elde etmenin ana yöntemi 2 (3) vardır:

  1. Bu hataların doğrudan ekranda çıktısı
  2. Bu hataları özel bir günlük dosyasına kaydedin
  3. veya hemen her iki seçenek: ekranda bu hataların çıktısı ve bunları özel bir günlük dosyasına yazar

Kural olarak, geliştirildiğinde (yerel bir ortamda), tüm hatalar doğrudan ekranda gösterilir, böylece daha kolay ve daha hızlı yakalandılar ve düzeltilmişlerdir ve bir savaş ortamında (üretimde) hatalar Hiç gösterilmiştir (çünkü kullanıcı yararsız bilgidir) ve bunlarla ilgili tüm bilgiler, geliştiricinin düzenli olarak taradığı günlük dosyasına yazılır.

Hata Günlüğü Ayarları

  1. error_reporting - Bu ana parametredir. Günlük dosyasında hangi hata mesajlarının görüntüleneceğinden / sıkılaştırılacağından sorumludur. Kullanılabilecek yalnızca 2 seçenek olduğuna inanıyorum:
    • -1 (veya E_All) - her tür hata üzerinde bildirildi;
    • 0 - Herhangi bir hata türü bildirilmedi

    Sadece -1 (veya E_ALL) kullanmanızı öneririm.
    Çünkü Uygulamanın prensip olarak herhangi bir hataya sahip olmamalıdır. Bu seçenek, fonksiyonu arayarak php.ini'deki yapılandırma dosyası veya doğrudan PHP komut dosyasında ayarlanabilir. error_reporting:

    Error_reporting (-1); Error_reporting (e_all);

    Bu arada, bu, PHP dilinde bir fonksiyon biçiminde olan tek seçenektir. Diğer tüm seçenekler yalnızca php.ini yapılandırma dosyası düzenleme veya işlev çağrısını kullanarak ayarlanabilir. ini_set () Sırasıyla, bunun için gerekli parametre ve değer.

  2. display_Errors. - Bu parametre, gerçekte gerçekleştikten sonra ekrandaki derhal hatalardan sorumludur. Bu parametre 0 veya 1 veya AÇIK / KAPALI olabilir. Şunlar. Veya ekranda hataları gösterin veya gösterme.
  3. display_Startup_Errors. - Bu seçenek, PHP başlamasından sonra meydana gelen hataları görüntülemekten sorumludur. Örneğin, yapılandırma dosyasında bir sözdizimi hatası varsa, bu konuda bilgi gösterilecektir. Bu parametre 0 veya 1 veya AÇIK / KAPALI olabilir.
  4. log_Errors. - Bu Direktif, günlük dosyasındaki hata mesajlarını kaydetmekten sorumludur. Bu parametre 0 veya 1 veya AÇIK / KAPALI olabilir. Şunlar. Günlüğe kaydedin veya hataları kaydedin.
  5. error_log. - Bu ayar, tüm başvuru hatalarının gerçekleştiği dosyanın (günlük dosyasının) yolundan sorumludur.
  6. html_Errors. - Uygulama hatası görüntüleme biçiminden aynı seçenek sorumludur. 1 veya Açık olarak ayarlanırsa, hata HTML, yani HTML kullanılarak gösterilecektir. Hatanın menşeinin bir izi olacak ve her şey oldukça bilgilendirici ve renkle olacak. Bu ayarın değeri 0 veya KAPALI olarak belirtilirse, hatalar az sayıda satır olarak geleneksel bir metin olarak gösterilecektir.

1. Ekrandaki hataları görüntülemek için ayarlar




İni_set ("html_errors", 1);
İni_set ("log_Errors", 0);

2. Günlük dosyasında hatalar yazma ayarları

Error_reporting (-1); // ini_set ("error_reporting", -1);
ini_set ("Display_Errors", 0);
INI_SET ("Display_Startup_Errors", 0);
ini_set ("log_Errors", 1);

3. Eşzamanlı olarak hataları görüntülemek ve bunları günlük dosyasına yazma ayarları

Error_reporting (-1); // ini_set ("error_reporting", -1);
ini_set ("Display_Errors", 1);
İni_set ("Display_Startup_Errors", 1);
ini_set ("log_Errors", 1);
İni_set ("html_errors", 1);
ini_set ("error_log", "/var/log/php/error.log");

Ayrıca, bu seçenekler php.ini yapılandırma dosyasında veya sanal ana bilgisayarınızın dosyasında ayarlanabilir.