Java ve diğer dillerde oturum açmak için en iyi uygulamalar ve anti-kalıplar

Portakalkafa

Global Mod
Global Mod


  1. Java ve diğer dillerde oturum açmak için en iyi uygulamalar ve anti-kalıplar

Her (Java) geliştiricisinin er ya da geç uğraşması gereken konulardan biri de günlüğe kaydetmedir. Küçük örnek programlar, programlama dili öğrenmek veya kodda hızlı bir şekilde hata ayıklamak için bir System.out.println yeterli olabilir, bu yazılımın verimli çalışması için açık bir yasaktır. Bu noktada, bir uygulamanın çıktısının, uygulamayı test etmek, izlemek ve analiz etmek için kullanılabilmesi için belirli kalite kriterlerini karşılaması gerekir. Bu nedenle, çok sayıda günlük kaydı çerçevesi ve API vardır ve geliştiricilerin hangi stratejinin doğru strateji olduğuna karar vermesi genellikle kolay değildir.







Hendrik Ebbers (@hendrikEbbers), JCP Uzman Grubunun bir üyesi olan Java Şampiyonu ve birçok kez JavaOne’ın Rockstar Konuşmacısı olarak ödüllendirildi. Hendrik, Open Elements şirketi aracılığıyla şu anda Hedera Hashgraph’ın tasarlanmasına ve hizmetlerinin halka sunulmasına yardımcı oluyor. Hendrik, JUG Dortmund ve Cyberland’in kurucu ortağıdır ve dünya çapında Java üzerine dersler ve atölye çalışmaları yapmaktadır. “Mastering JavaFX 8 Controls” adlı kitabı Oracle Press tarafından 2014 yılında yayınlandı. Hendrik, JakartaEE veya Eclipse Adoptium gibi açık kaynaklı projelerde aktif olarak yer alıyor. Hendrik, AdoptOpenJDK TSC ve Eclipse Adoptium WG’nin bir üyesidir.







Bu nedenle, günlüğe kaydetme en iyi uygulamaları hakkında bir dizi makale yazmaya karar verdim. Bu yazıda günlük kaydının genel temelleri ile başlıyorum. Yakın gelecekte, yalnızca Java ekosistemindeki çeşitli günlük kaydı çerçevelerine genel bir bakış değil, aynı zamanda büyük yazılım mimarilerinde günlük kaydı konusuna nasıl yaklaşılacağına dair bir genel bakış da olacaktır. Günlüğe kaydetme konusu, “merkezi günlük kaydına” genel bir bakış ve daha iyi günlüğe kaydetme ve günlüğe kaydetme analizi sağlayan modern araçlarla tamamlanır.


Kaptanın günlüğü, yıldız tarihi yaklaşık 2022


Bazılarınızın başlıktan da tahmin edebileceği gibi, temel günlük kaydı belgelerinden kısaca bahsetmek istiyorum. Çünkü terim aslında navigasyon seyir defteri ile ilgilidir. Seyir defteri genellikle bir deniz yolculuğu sırasında meydana gelen olayları kaydetmeyi amaçlar. Ve bir uygulamaya erişimde tam olarak bunu yapıyoruz: uygulamanın ömrü boyunca belirli olaylar hakkında mesajlar yazıyoruz. Bunlar ister teknik olarak bir günlük dosyasına yazılmış olsun, ister yalnızca konsola çıktı alınmış olsun, onları denklemin dışında bırakın. Ancak, tüm bu mesajların günlüğe kaydedilecek olayın zamanı gibi meta veriler içermesi önemlidir.

Tıpkı navigasyonda olduğu gibi, bir uygulamada günlük kaydının kullanılmasının birçok harika nedeni vardır. Bakımlı bir günlükteki geçmiş, belirli olayların neden tetiklendiğini görmek için kullanılabilir. Bu, bir uygulamanın çalışma zamanı sırasında hataların nasıl oluştuğunu belirlemek için BT’de özellikle kullanışlıdır. Ancak kayıt sadece bu sorunlu durumlarda yararlı olamaz. Genel olarak kayıt olmanın yazılımın kullanımı ve işleyişi hakkında bilgi verdiği söylenebilir. Bu, gelecekteki entegrasyonlar için yazılımın geçmişinden öğrenmenizi sağlar. Örneğin, tüm kullanıcıların %97’sinin yazılımımızdaki “Beğen” düğmesine ancak onu uzun süre kullandıktan sonra bastığını kayıtta görüyorsanız, yazılımda daha belirgin bir şekilde yerleştirilmesi gerekip gerekmediğini düşünebilirsiniz.

Ancak, bir başvurunun kaydedilmesinden bahsedilen faydaların elde edilebilmesi için, başvurunun da anlamlı bir şekilde uygulamaya entegre edilmesi gerekir. Bunu daha somut terimlerle ifade etmek için, şimdi oturum açarken genel en iyi uygulamalara ve anti-kalıplara bakacağız.


Neyi, ne zaman ve nasıl kaydetmeliyim?


Uygulamamızda günlüğe kaydetmeyi gerçekte nasıl kullanmamız gerektiğini daha iyi anlamak için, bir günlükçü aracılığıyla ideal olarak neyin çıktısı alınması gerektiği konusunda dikkatlice düşünmek mantıklıdır. Burada aslında her zaman kaydedilmesi gereken üç farklı kategori görüyorum:

  • Uygulama içindeki önemli olaylar (örneğin, uygulamanın başlatılması veya döngüsel bir emrin yürütülmesi),
  • Dışarıdan bilgi (örn. bir REST arayüzü aracılığıyla veri aktarımı),
  • Uygulamanın beklenmedik veya yanlış davranışı (örn. bir dosyayı yanlış okurken).
Ancak bu kategorilerde bile kayıt konusunda aşırıya kaçmamalısınız. Burada bilgileri bir döngüde kaydetmemeye dikkat etmelisiniz. Kullanıcı girişi harici giriş olarak sayılsa bile, her tuş vuruşunu doğrudan günlüğe kaydetmemelisiniz. Aşağıdaki örnek, tam olarak bunun gerçekleştiği sorunlu bir günlük geçmişinden bir alıntıyı göstermektedir:


08:34:23 User mutates id field with new value 'J'
08:34:23 User mutates id field with new value 'JA'
08:34:23 User mutates id field with new value 'JAV'
08:34:23 User mutates id field with new value 'JAVA'



Bu tür girişlerle bir kayıt defteri dosyasından önemli bilgileri çıkarmanın ne kadar zor olduğunu tahmin edebilirsiniz.

Durum, çok fazla bilgi içeren günlük mesajlarıyla benzerdir. Bir kullanıcının doğum gününü bilsek bile, bu bilgiyi günlük mesajlarımıza dahil etmemiz gerekmez:

08:34:23 User 'Max' with birthday '01/01/1970'
mutates id field with new value 'JAVA'

Mesajdaki kullanıcı adı, bu mesajı diğer günlük girişleriyle ilişkilendirmek için daha sonraki analizler için kesinlikle ilgi çekici olabilirken, doğum tarihi oldukça can sıkıcıdır ve mesajların okunmasını insan gözü için yalnızca daha karmaşık hale getirir.

Günlük mesajları oluştururken akılda tutulması gereken üçüncü önemli nokta, veri gizliliğidir. Önceki raporlarda kayıt defterinde her zaman bir kimlik değişikliği görmüş olsak da, aşağıdaki mesaj hiçbir zaman bir günlük dosyasında görünmemelidir:

08:34:23 User 'Max' mutates password with new value '12#Agj!j7

Bu durumda, günlük kaydı, uygulamada gerçek bir güvenlik açığını temsil eder. Kullanıcı parolası gibi hassas veriler, günlük mesajlarında kesinlikle görünmemelidir.

Şu ana kadar öğrendiklerimize göre, aşağıdaki günlük mesajları mantıklı ve iyi görünüyor:

08:34:23 User 'Max' mutates id field with new value 'JAVA'
08:34:23 User 'Max' mutates password

Bu ipuçlarına ek olarak, bir uygulamanın kaynak kodunu, kaynak kodunu okumanın ve anlamanın artık bir anlam ifade etmeyeceği kadar kayıt defteri çağrılarıyla doldurmadığınızdan her zaman emin olmalısınız. Bir Java programından alınan aşağıdaki alıntı, günlüğe kaydetme çağrılarını aşırıya kaçarsanız ne olacağını gösterir:


LOG.log("We start the transaction");
manager.beginTransaction();
LOG.log("DB query will be executed");
LOG.log("DB query: select * from users");
long start = now();
users = manager.query("select * from users");
LOG.log("DB query executed");
LOG.log("DB query executed in " + (now() - start) + " ms");
LOG.log("Found " + users.size() + " entities");
manager.endTransaction();
LOG.log("Transaction done");


Kod ve tam işlevi burada pek görülmez. Kayıt aramaları eksikse, bunu bir bakışta yapabiliriz:


manager.beginTransaction();
users = manager.query("select * from users");
manager.endTransaction();


Ancak, elbette, tüm günlük kaydını göz ardı etmemelisiniz ve belki de burası, günlük kaydında çok fazla bilgi görmek isteyeceğiniz bir yerdir. Bu durumda, günlük aramalarının uygulama yapısına ve API’ye daha akıllıca entegre edilmesi gerekir. İlk örnekte gördüğümüz tüm bilgiler dosyanın içinde de olabilir. beginTransaction-, query– VE endTransaction-Metodlar kayıtlıdır. Bu şekilde, iş mantığı aramaları günlüğe kaydetmekten temizlenir ve yine de tüm bilgileri alırız.

Çeşitli nedenlerle doğrudan API’de günlüğe kaydetme mümkün değilse, günlük kaydıyla ilişkili karmaşıklığı lambdalarda veya yeniden kullanılabilir yöntemlerde nispeten kolay bir şekilde “gizlemek” de mümkündür. Aşağıdaki örnek, bir işlem içinde sorgu yapan ve istenen tüm bilgileri günlük mesajları olarak iletmeye devam eden genel bir işlevi göstermektedir.


final Function<String, T> queryInTransaction = query -> {
LOG.log("We start the transaction");
manager.beginTransaction();
LOG.log("DB query: " + query);
long start = now();
T result = manager.query(query);
LOG.log("DB query found " + result.size() + " entities in "
+ (now() - start) + " ms");
manager.endTransaction();
LOG.log("Transaction done");
return result;
}


Bu, iş mantığında çağrılarımızı maksimum günlük kaydıyla okunabilir bir biçimde arayabileceğimiz anlamına gelir:


LOG.log("Loading all users from database");
users = queryInTransaction("select * from users");


Günlük kaydı çerçeveleriyle çalışmış olan herhangi biri, yukarıdaki örneklerde yer alan önemli ve merkezi bir öğe olarak günlük tutma katmanını kesinlikle kaçıracaktır. Son olarak, buna daha yakından bakalım. Farklı kaydediciler her zaman aynı seviyeyi tanımlamasa da hepsi aynı işlevselliğe sahiptir: Tek boyutlu bir ölçekte, seviye mesajın tüm mesajlar bağlamında ne kadar önemli olduğunu gösterir.







Ölçek, kayıt düzeylerini gösterir.



Resimde örnek olarak gösterildiği gibi, günlük kaydımızda üç farklı seviye kullanabileceğimizi varsayalım (not: belirli günlük çerçevesine bağlı olarak çok daha fazlası vardır). seviye ERROR seviyeyi bitirirken uygulamanın tüm kötü davranışlarını günlüğe kaydetmek istiyoruz INFO başvurunuzun süreci ve durumu hakkında genel bilgi için. İle DEBUG-Seviye, yalnızca istisnai durumlarda önemli olan ayrıntılı bilgileri kaydederiz. Günlüğe kaydetmede farklı düzeyleri kullanan Java kaynak kodu şöyle görünebilir:


try {
LOG.info("Loading all users from database");
users = query("select * from users");
LOG.debug("Found " + users.size() + " users in db");
} catch (Exception e) {
LOG.error("Error while loading all users");
}


Uygulamanın çalışma zamanında, artık günlükçü seviyesini yapılandırmak ve böylece günlükte gerçekte hangi mesajların olması gerektiğini filtrelemek mümkündür. Tipik olarak, mesaj dosyada burada filtrelenir DEBUGdüzeyindedir ve bunları yalnızca hata analizi veya benzer senaryolar için günlüğe dahil eder. Avantajı, daha fazla bilgi almak için uygulamanın kaynak kodunu değiştirmeye gerek olmamasıdır. Yalnızca yapılandırmanın ayarlanması gerekir ve kullanılan günlük çerçevesine bağlı olarak bu, çalışma zamanında dinamik olarak da gerçekleşebilir. Ayrıca, bu tür bir filtreleme, bir test veya üretim sisteminde farklı bilgileri kaydetmek için de kullanılabilir.

Son bir kayıt konsepti


Bu blog gönderisinde gösterilen genel kurallara dayalı olarak, bir uygulamanın veya tüm sistem ortamının günlüğe kaydedilmesi için tanımlar tanımlamak zaten mümkündür. Günlük kaydı için kurallar oluştururken kendinize sormanız gereken önemli sorular şunları içerir:

  • Günlük dosyasını kim okuyacak?
  • Günlüklerden ne öğrenmek/çıkarmak istiyorsunuz?
  • Günlüklerden neyi çıkarmak İSTEMİYORSUNUZ?
  • Farklı ortamlarda (test/üretim) kayıtta farklılıklar olmalı mı?
Açıklandığı gibi, kayıt olurken dikkate alınması gereken çeşitli noktalar vardır. Genel olarak, kayıt yönetimi için bir konsept tanımlamak mantıklıdır. Burada, kaydı dahili olarak yönetmek için yönergeleri ve en iyi uygulamaları tanımlayabilir ve kaydedebilirsiniz. Böyle bir kavram, kitaplıklar veya sık kullanılan şablonlar gibi teknik yönleri de içerir. Java günlüğü dizisinin bir sonraki bölümünde bunlara daha yakından bakacağız.


(rm)



Haberin Sonu
 
Üst