Application Insights'ta Eksik Azure İşlev Günlükleri Sorunlarını Giderme
Azure İşlevleri ile çalışmak çoğu zaman iyi yağlanmış bir otomasyon motoru oluşturmak gibi hissettirir. Peki bazı önemli günlükler Application Insights çalışma alanınızdan kaybolduğunda ne olur? 🤔 Bu, yakın zamanda Zamanlayıcı Tetikleyici Azure İşlevi geliştirirken karşılaştığım bir zorluk. Azure Portal günlük konsolunda mükemmel şekilde çalışan Bilgi düzeyindeki günlüklerim, gizemli bir şekilde Günlükler çalışma alanında yoktu.
İlk başta her şeyin doğru yapılandırıldığını varsaydım. Sonuçta, İşlev Uygulamamın oluşturulması sırasında Application Insights'ı kurmuştum ve telemetri kurulumu, kullanıma hazır gibi görünüyordu. Bir geliştirici olarak, Bilgi günlükleri hiçbir yerde bulunamadığında Uyarı ve Hata günlüklerinin doğru şekilde göründüğünü görmekten daha kafa karıştırıcı bir şey olamaz. Nerede saklanıyorlardı?
Bu sorun bana bir web uygulamasında hata ayıklarken benzer bir anı hatırlattı. Hata kayıtları "Beni düzeltin!" diye bağırıyordu. Bu sırada ince Bilgi düzeyindeki kayıtlar radarın altına girdi. Bu biraz eksik bir yapboz parçasını aramaya benziyor; onun var olduğunu bilmek ama yığının içinde tam olarak görememek. 🧩 Azure'un host.json ve telemetri ayarları genellikle burada rol oynar.
Bu makalede, bu sorunun temel nedenini ve adım adım nasıl çözüleceğini açıklayacağım. Host.json yapılandırmalarından günlük düzeyi eşiklerini doğrulamaya kadar, çözüm boyunca size rehberlik edeceğim. Bilgi günlükleri eksik olanların Günlükler çalışma alanınıza geri dönmelerini sağlayalım.
Emretmek | Kullanım Örneği |
---|---|
ConfigureFunctionsWorkerDefaults() | Azure İşlevleri çalışan işlem hattını başlatır ve yapılandırır. Ara yazılımların ve hizmetlerin Azure İşlevleri'nin yürütülmesi için doğru şekilde ayarlanmasını sağlar. |
Configure<LoggerFilterOptions>() | Günlükleri Bilgi, Uyarı veya Hata gibi günlük düzeylerine göre filtrelemek için kullanılır. Bu, yalnızca istenen günlük seviyelerinin işlenmesini sağlar. |
services.AddApplicationInsightsTelemetryWorkerService() | Çalışan hizmetleri için Application Insights'ı kaydeder. HTTP ile tetiklenmeyen bağlamlarda özellikle Azure İşlevleri için telemetri toplama ve günlüğe kaydetme olanağı sağlar. |
options.MinLevel = LogLevel.Information | Minimum günlük düzeyi eşiğini ayarlar. Örneğin, 'Bilgi' Bilgi, Uyarı ve Hata düzeylerinin günlüklerinin yakalanmasını sağlar. |
ConfigureServices() | Özel hizmetler eklemek veya günlük kaydı, Application Insights veya DI kapsayıcısıyla ilgili bileşenler gibi bağımlılıkları yapılandırmak için bir yöntem sağlar. |
samplingSettings: { isEnabled: false } | Bilgi düzeyindeki günlükler dahil tüm günlüklerin filtrelenmeden yakalandığından emin olmak için telemetri örneklemeyi devre dışı bırakır. |
host.Run() | Azure İşlevleri çalışan işlemini çalıştırmak için yapılandırılmış ana bilgisayarı yürütür ve gelen olayları veya tetikleyicileri dinlemeye başlar. |
builder.SetMinimumLevel(LogLevel.Information) | Bilgi düzeyi ve üzerindeki ayrıntılı günlüklerin işlenmesini sağlamak amacıyla, günlükçü yapılandırması için minimum günlük düzeyini açıkça ayarlar. |
Assert.True(condition, message) | Bir koşulun doğru olduğunu doğrulamak için birim testinde kullanılır. Bu durumda Bilgi günlüklerinin başarıyla yakalandığını doğrular. |
LogInformation("Message") | Bilgilendirici bir mesajı günlüğe kaydeder. Azure İşlevlerinde kritik olmayan etkinliklerin hatalarını ayıklamak ve izlemek için çok önemlidir. |
Eksik Azure İşlev Günlüklerini Anlama ve Nasıl Çözüleceği
Daha önce sağlanan komut dosyaları, yaygın bir sorunu çözmeyi amaçlamaktadır. Bilgi düzeyindeki günlükler Azure İşlevi tarafından oluşturulan dosyalar, Azure Portal günlük konsolunda görünseler bile Günlükler çalışma alanında görünmez. Bu tutarsızlık genellikle host.json dosyasındaki hatalı yapılandırma, yetersiz telemetri ayarları veya Application Insights entegrasyonuyla ilgili sorunlardan kaynaklanır. Gibi komutları kullanarak YapılandırFunctionsWorkerDefaults() Ve AddApplicationInsightsTelemetryWorkerService(), Application Insights'ın günlükleri beklendiği gibi yakalamasını sağlıyoruz. Bu komut dosyaları, telemetri verilerinin toplanması ve yönetilmesi için güçlü bir temel oluşturur.
Öncelikle Program.cs'deki "HostBuilder", Azure İşlevi çalışan ortamını ayarlar. Yöntem YapılandırFunctionsWorkerDefaults() Azure İşlevleri için gerekli tüm ara yazılımın başlatılmasını sağlar. Ayrıca özel günlüğe kaydetme ve bağımlılık ekleme yapılandırmasına da olanak tanır. Daha sonra, AddApplicationInsightsTelemetryWorkerService() kullanarak Application Insights'ı açıkça kaydederiz. Bu adım, telemetri koleksiyonunun HTTP ile tetiklenmeyen Azure İşlevleri için doğru şekilde yapılandırılmasını sağlar. Örneğin, Zamanlayıcı Tetikleme İşlevinde hata ayıklamayı hayal edin: Application Insights olmadan, performansı izlemek ve sorunları belirlemek manuel ve zaman alıcı bir süreç haline gelir. 🔧
Host.json dosyası, hangi günlük düzeylerinin yakalandığını kontrol etmede önemli bir rol oynar. Hem varsayılan hem de Application Insights bölümlerinde "LogLevel"i Bilgi olarak ayarlayarak, Bilgi düzeyindeki günlüklerin işlenmesi gerektiğini açıkça tanımlıyoruz. Ancak samplingSettings özelliği bazen günlükleri filtreleyebilir ve bu da Günlükler çalışma alanında eksik girişlere yol açabilir. Örneklemeyi devre dışı bırakarak ("isEnabled": false`), Bilgi günlükleri dahil tüm telemetri verilerinin yakalanmasını sağlarız. Bu, küçük ayrıntıların bile temel nedeni ortaya çıkarabileceği üretim sorunlarını giderirken özellikle önemlidir. Bir keresinde küçük bir LogInformation mesajının yanlış yapılandırılmış bir zamanlayıcının ortaya çıkmasına yardımcı olduğu bir durumla karşılaştım. 🎯
Son olarak birim test komut dosyası, farklı düzeylerdeki (Bilgi, Uyarı ve Hata) günlüklerin doğru şekilde yayınlandığını ve yakalandığını doğrular. Kullanma Minimum Seviyeyi Ayarla()logger'ın tüm günlükleri istenen eşik değerinde veya üzerinde işlemesini sağlıyoruz. Örneğimizde Bilgi günlüklerinin açıkça yapılandırıldığında göründüğünü doğruladık. Bunun gibi birim testleri yazmak, günlüğe kaydetme davranışının ortamlar arasında tutarlı olmasını sağlayarak dağıtım sırasında sürprizlerin önlenmesini sağlar. Bu betikler birlikte, eksik Azure İşlev günlüklerinin sorunlarını gidermeye ve bulut uygulamalarınızdaki telemetri toplamayı iyileştirmeye yönelik kapsamlı bir çözüm sağlar.
Azure İşlev Günlüklerinin Günlük Çalışma Alanında Görünmesini Sağlama
Eksik Bilgi günlükleri sorununu gidermek ve Application Insights'ın doğru şekilde yapılandırılmasını sağlamak için bir C# arka uç çözümü burada verilmiştir.
// Solution 1: Proper Host Configuration and Log Filtering
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
public class Program
{
public static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.Configure<LoggerFilterOptions>(options =>
{
options.MinLevel = LogLevel.Information;
});
})
.Build();
host.Run();
}
}
Uygun Günlük Düzeyinde Kaydı Sağlamak için Yapılandırmanın İncelenmesi
Host.json ve Application Insights günlük düzeylerinin hizalanmasını sağlamak için yapılandırma dosyası kurulumu.
// host.json Configuration
{
"version": "2.0",
"logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Function": "Information"
},
"applicationInsights": {
"LogLevel": {
"Default": "Information"
},
"samplingSettings": {
"isEnabled": false
}
}
}
}
Alternatif: Azure İşlev Kodunda Belirli Günlük Düzeylerini Filtreleme
Farklı düzeylere yönelik günlükleri açıkça filtrelemek ve yayınlamak için C# betiği.
using Microsoft.Extensions.Logging;
public class MyFunction
{
private readonly ILogger _logger;
public MyFunction(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<MyFunction>();
}
public void Run()
{
_logger.LogInformation("Executing Information level log.");
_logger.LogWarning("This is a Warning level log.");
_logger.LogError("This is an Error level log.");
}
}
Günlük Düzeyinde Yapılandırma için Birim Testi
Bilgi düzeyindeki günlüklerin doğru şekilde yakalandığını doğrulamak için basit bir birim testi.
using Xunit;
using Microsoft.Extensions.Logging;
public class LogTests
{
[Fact]
public void VerifyInformationLogsAreCaptured()
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Information);
});
var logger = loggerFactory.CreateLogger("TestLogger");
logger.LogInformation("This is a test Information log.");
Assert.True(true, "Information log captured successfully.");
}
}
Telemetri Verilerini Keşfederek Eksik Azure İşlev Günlüklerini Çözme
Azure İşlev günlüklerinin Logs çalışma alanında görünmemesinin bir diğer kritik yönü, Application Insights tarafından kullanılan telemetri kanalı yapılandırmasını içerir. Varsayılan olarak Azure İşlevleri, günlükleri telemetri uç noktasına göndermeden önce arabelleğe alan Application Insights SDK'yı kullanır. Ancak bu ara belleğe alma, telemetri verilerinin örneklenmesi veya hatalı şekilde temizlenmesi nedeniyle Bilgi düzeyindeki günlükler gibi belirli günlük girişlerini geciktirebilir veya atlayabilir. Uygun telemetri kanalı davranışının sağlanması, tutarlı günlüklerin sürdürülmesi açısından çok önemlidir.
Çoğu zaman gözden kaçırılan bir faktör de örneklemeAyarları host.json'daki yapılandırma. Örnekleme etkinleştirildiğinde, veri hacmini ve maliyetleri azaltmak için günlüklerin yalnızca küçük bir kısmı Application Insights'a gönderilir. Ancak Bilgi günlükleri hata ayıklama için kritik öneme sahipse, ya örneklemeyi tamamen devre dışı bırakmanız ("isEnabled": false`) ya da gerekli tüm günlüklerin yakalandığından emin olmak için örnekleme mantığını ayarlamanız gerekir. Örneğin, örneklemeyi etkinleştirmenin kritik olmayan Bilgi günlüklerinde rastgele düşüşlere neden olduğu ve üretimde hata ayıklama sırasında hayal kırıklığına yol açtığı bir sorunla karşılaştım. 💻
Ek olarak, kullanarak Yıkama komutlar, arabelleğe alınmış tüm telemetrinin anında gönderilmesini sağlayarak veri kaybını önler. Azure İşlevlerinin HTTP istekleri veya Zamanlayıcı tetikleyicileri gibi yüksek yük tetikleyicileri altında çalıştığı senaryolarda, telemetri arabelleğe alma hızlı bir şekilde birikerek gecikmelere neden olabilir. Geliştiriciler, TelemetryClient.Flush()'u açıkça çağırarak veya telemetri uç noktası bağlantısını doğrulayarak günlük tutarsızlıklarını azaltabilir ve doğru bir izleme ortamı sağlayabilir. Sonuç olarak, örnekleme, ara belleğe alma ve temizleme işlemlerinin dengelenmesi, maliyetleri en aza indirirken optimum günlük görünürlüğü sağlar.
Azure İşlev Günlükleri Hakkında Sık Sorulan Sorular
- Bilgi günlüklerim neden Günlükler çalışma alanında eksik?
- Bilgi günlükleri şu nedenlerden dolayı görünmeyebilir: samplingSettings içinde host.json. Örneklemeyi şununla devre dışı bırak: "isEnabled": false tüm günlükleri yakalamak için.
- Host.json'daki LogLevel yapılandırması ne işe yarar?
- LogLevel yakalanan minimum günlük önem derecesini belirtir; örneğin "Default": "Information", bu seviyedeki veya üzerindeki günlüklerin işlenmesini sağlamak.
- Telemetri verilerinin Application Insights'a aktarıldığından nasıl emin olabilirim?
- Şunu kullanın: TelemetryClient.Flush() Arabelleğe alınmış tüm telemetrinin hemen gönderilmesini sağlamak için işlev kodunuzdaki yöntemi kullanın.
- Neden Uyarı ve Hata günlükleri görünüyor ancak Bilgi günlükleri görünmüyor?
- Bu sorun şu durumlarda ortaya çıkar: LogLevel yanlış yapılandırılmış veya samplingSettings Optimizasyon nedeniyle bilgi günlüklerinin düşmesi.
- Örnekleme mantığını belirli günlükleri içerecek şekilde ayarlayabilir miyim?
- Evet, özelleştirebilirsiniz excludedTypes mülkiyet altında samplingSettings gibi belirli telemetri türlerini hariç tutmak için Request veya Exception.
- AddApplicationInsightsTelemetryWorkerService()'in rolü nedir?
- AddApplicationInsightsTelemetryWorkerService() yöntem, Azure İşlevlerinde telemetri için Application Insights'ı kaydeder.
- Application Insights'ın doğru şekilde bağlandığını nasıl doğrularım?
- Application Insights ayarları altında İşlev Uygulamanızın yapılandırmasında Enstrümantasyon Anahtarı veya Bağlantı Dizesi'ni kontrol edin.
- Bilgi düzeyindeki mesajları programlı olarak günlüğe kaydedebilir miyim?
- Evet, kullanabilirsiniz _logger.LogInformation("Your message") Bilgi mesajlarını açıkça işlev kodunuza kaydetme yöntemi.
- Zamanlayıcı Tetikleme İşlevinde eksik günlüklerle ilgili sorunları nasıl giderebilirim?
- Doğrulayın host.json yapılandırmasını izleyin, telemetrinin bağlı olduğundan emin olun ve Flush() fonksiyonun sonunda.
- ConfigurationFunctionsWorkerDefaults() ne işe yarar?
- ConfigureFunctionsWorkerDefaults() yöntem, Azure İşlevleri ara yazılımını başlatır ve günlüğe kaydetmeyi ayarlar.
Azure İşlev Günlüklerinde Günlük Görünürlüğünü Sağlama
Temel Bilgiler ve Sonraki Adımlar
Azure İşlevlerinde uygun günlük görünürlüğünün sağlanması, host.json öğesinin dikkatli bir şekilde yapılandırılmasını ve doğru telemetri ayarlarını gerektirir. Gibi sorunlar örnekleme ve varsayılan günlük düzeyi eşikleri, veriler portal konsolunda görünse bile günlüklerin eksik olmasına yol açabilir. Örneklemeyi açıkça devre dışı bırakmak ve telemetri temizleme yöntemlerini çağırmak genellikle bu sorunu çözer.
Ek olarak, Application Insights'ın doğru şekilde bağlandığının doğrulanması ve her ikisinde de uygun günlük düzeylerinin sağlanması Program.cs ve yapılandırma dosyaları kritik öneme sahiptir. Bu ayarlamalarla Bilgi günlükleri, Günlükler çalışma alanında güvenilir bir şekilde görünecek ve Azure İşlevi davranışına ilişkin net bilgiler sağlayacak. 🛠️
Günlükler
- Application Insights Yapılandırmasına İlişkin Resmi Microsoft Belgeleri - Microsoft Learn
- Azure İşlev Günlüğüne İlişkin En İyi Uygulamalar - Azure İşlevlerini İzleme