NOTE: Apart from
(and even then it's questionable, I'm Scottish). These are machine translated in languages I don't read. If they're terrible please contact me.
You can see how this translation was done in this article.
Sunday, 27 October 2024
//Less than a minute
قطع الأشجار هو بطبيعة الحال جزء حاسم من التطبيقات على الرغم من أنني في كثير من الأحيان أرى أنه يساء فهمه أو إساءة استخدامه في تطبيقات ASP.net. هذا جزء من الوظيفة وجزء من بيان البيانات عن كيفية التسجيل الفعال في تطبيقات ASP.net.
هذا ليس دليلاً كاملاً لقطع الأشجار، هناك LDTات من تلك الموجودة هناك، بل أكثر حول اختيار استراتيجية فعالة لقطع الأشجار لتطبيقات ASP.NET الخاصة بك.
في قطع الأشجار الرئيسي يجب أن يكون مُستخدماً، سواء كان قطع الأشجار أثناء تطورك أو تسجيل الإنتاج، فإنه يجب أن يكون مفيداً لك/فريقك/مستخدميك.
غالبا ما ينظر إلى قطع الأشجار على أنه 'فقط تفعل ذلك عندما يكون هناك استثناءات' شيء. أعتقد أن هذا سوء فهم ما يجب أن يكون قطع الأشجار.
الطرح ليس فقط للاستثناءات
وعموماً، ينبغي أن تكون قادراً على إدارة جزء كبير من طلبك محلياً؛ وفي هذا السياق، ينبغي أن تكون قادراً عموماً على إدارة جزء كبير من طلبك محلياً. log.LogInformation
هو صديقك.
على مدى الـ 30 عاماً التي كتبت فيها الشفرة رأيت بعض الأمثلة على قطع الأشجار الجيد و المزيد من الأمثلة على قطع الأشجار الرديء.
مبادئ التسجيل الجيد:
تذكر; تسجيل ALWAYS يسحب أسفل أداء تطبيقك ؛ يجب عليك تسجيل ما تحتاج لتشخيص قضية ولكن لا مزيد في الإنتاج / حيث الأداء هو أمر حاسم (على سبيل المثال ، لا تجري اختبار أداء عند استخدام كامل تنقيح Logging).
في ASP.net لديك بالفعل بناء في نظام قطع الأشجار؛ Microsoft.Extensions.Logging
/ / / / هذا نظام جيّد لقطع الأشجار، لكنه ليس مرناً مثل (سيريلوج). Serilog هو نظام أكثر مرونة لقطع الأشجار يسمح لك بالدخول إلى مصارف متعددة (مخرجات) وإثراء سجلاتك بمعلومات إضافية.
هذا هو تسجيل الأشجار الذي يحدث عندما يبدأ تطبيقك. إنه أول شيء يحدث، وهو أول شيء يجب أن تراه عندما تقوم بتشغيل تطبيقك. في ASP.net خصوصاً عندما تستخدم التشكيل فإنه من الأهمية بمكان أن تفهم ما يحدث عندما يبدأ تطبيقك. إنه مصدر مشترك جداً للقضايا في تطبيقات شبكة ASP.NET.
على سبيل المثال في Serilog يمكنك القيام بذلك:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/boot-*.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
.CreateBootstrapLogger();
ملاحظة هذا محدود لأنه ليس لديك وصول إلى الإعدادات عند هذه النقطة لذا على سبيل المثال إلى استخدام AppInsights التي قد تحتاج إلى #if RELEASE
إلى set مفتاح مُناسِب.
ما يفعله هذا هو إعطاءك بيانات عن أي قضايا بدء التشغيل في تطبيقك؛ إنه يكتب لكل من وحدة التحكم والملف. ومن المهم أيضاً ضمان عدم حفظ كل ملفات السجل، يمكنك أن ترى هنا أننا نوفر فقط 7 أيام قيمة السجلات.
سوف تريد أيضاً أن تلف طريقة البدء (في هذا التطبيق سوف أستخدم طريقة جديدة) Program.cs
) في أي استثناءات تحدث هناك.
try
{
..all your startup code
}
catch (Exception ex)
{
if(args.Contains("migrate"))
{
Log.Information("Migration complete");
return;
}
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
لوغاريتم. log. locloseAndFloush () مهم لأنه يضمن أن جميع السجلات مكتوبة على القرص (تطبيقك ينهار بطريقة أخرى سوف يخرج قبل أن يفعل هذا).
هنا أيضاً أكشف ما إذا كان التطبيق يعمل في نمط هجرة وإذا كان الأمر كذلك أقوم بتسجيل ذلك والخروج.
Log.Fatal
هو الأكثر حدة المستوى اللوغاريتمي; يتم استخدامه عندما يكون تطبيقك على وشك الانهيار.
ليس كلّ المُستثنىات مُتَفَقَة - يجب أن تستخدم Log.Error
ولا يمكن الاستمرار في تجاوز تلك النقطة (إلا إذا كانت تعني التطبيق (وليس الطلب).
في ASP.net (وNet بشكل أعم) لديك عدد من مستويات اللوغارتم:
Log.Fatal
- هذا هو أكثر مستوى لوغاريتمي؛ يتم استخدامه عندما يكون تطبيقك على وشك الانهيار.Log.Error
- يُستخدم هذا عندما يحدث استثناء يعني أن التطبيق (وليس الطلب) لا يمكن أن يستمر بعد تلك النقطة.Log.Warning
- هذا يستخدم عندما يحدث شيء ما ليس خطأ ولكن يجب أن تكون على علم به (على سبيل المثال خدمة متدهورة / شيء ما ليس حقًّا حقًّا حقًّا وليس خطأً).Log.Information
- هذا مستخدم للحصول على معلومات عامة حول ما يحدث في طلبك.Log.Debug
- هذا يستخدم للمعلومات التي تكون مفيدة فقط عندما كنت تصحح تطبيقك (هو كل شيء في التنمية ولكن ينبغي إيقافه في الإنتاج).من أجل الإنتاج أنا بشكل عام أضع قطع الأشجار ليكون Log.Fatal
, Log.Error
وقد عقد مؤتمراً بشأن Log.Warning
فقط
على العكس من تسجيل بدء التشغيل هذا هو قطع الأشجار الذي يحدث عندما يكون تطبيقك جاري التنفيذ. هذا هو قطع الأشجار الذي يخبرك بما يحدث في طلبك في أي وقت معين.
على سبيل المثال إلى استخدام هذه في Serilog أنت تعمل هذا:
"Serilog": {
"Enrich": ["FromLogContext", "WithThreadId", "WithThreadName", "WithProcessId", "WithProcessName", "FromLogContext"],
"MinimumLevel": "Warning",
"WriteTo": [
{
"Name": "Seq",
"Args":
{
"serverUrl": "http://seq:5341",
"apiKey": ""
}
},
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/applog-.txt",
"rollingInterval": "Day"
}
}
],
"Properties": {
"ApplicationName": "mostlylucid"
}
},
كما ترون، أنا معجب كبير جداً بـ(سيريلوج)، إنها مكتبة كبيرة لقطع الأشجار ومرنة جداً. أحد الأشياء التي أحبها في ذلك هو القدرة على إغناء جذوعكم بمعلومات إضافية. هذا يمكن أن يكون مفيداً جداً في تشخيص القضايا في طلبك. في المثال أعلاه يمكنك أن ترى أنني أثرى جذوعي مع هويات الخيط، اسم الخيط، اسم العملية، اسم المعالجة. هذا يمكن أن يكون مفيداً جداً في تشخيص القضايا في طلبك.
قمت أيضاً بتحديد قطع الأشجار للذهاب إلى متعدد'syinks' (النواتج)؛ في هذه الحالة سأرسله إلى وحدة التحكم، إلى ملف وإلى Seq (خدمة قطع الأشجار).
وجود العديد من البواليع هو أمر مفيد في حالة فشل واحد، في هذه الحالة فخدمة قطع الأشجار المفضلة لدي هي Seq، لذلك أرسلها إلى هناك أولا. ثم إذا فشل ذلك سأرسله إلى وحدة التحكم والملف.
وأنا أيضاً تعيين خاصية التطبيقName في اللوغاريتمات، هذا يمكن أن يكون مفيداً إذا كان لديك تطبيقات متعددة تقوم بتدوينها إلى نفس الخدمة (والتي ستُستخدم في التطبيقات الموزعة، إلى جانب معرف الارتباط لربط السجلات معاً لطلب واحد).
على سبيل المثال إذا كان لديك واجهة واجهة JS و خلفية Net يمكنك وضع هوية الارتباط في الطرف الأمامي و تمريرها إلى الطرف الخلفي. هذا إلى الكل لـ a واحد طلب بوصة واحد مكان. أو إذا كنت تستخدم HttpClient في الطرف الخلفي يمكنك تمرير تعريف الارتباط في الترويسة إلى الخدمة الأخرى.
هناك تغطية كبيرة على كيفية القيام بذلك هنا: https://josef.codes/append-correlation-id-to-all-log-entries-in-asp-net-coor/ لكنّي سأغطيه في موقع مستقبلي.
قطع الأشجار المنظم هو طريقة لقطع الأشجار التي تجعل من الأسهل البحث عن وترشيح سجلاتك. في Serilog يمكنك أن تفعل هذا باستخدام Log.Information("This is a log message with {Property1} and {Property2}", property1, property2);
-الخلاصات. وهذا يجعل من الأسهل البحث عن السجلات مع خاصية معينة.
استخدام Serilug يمكنك أيضاً استخدام LogContext.PushProperty
لإضافة خواص إلى جذوعك التي لها صلة فقط بنطاق معين. هذا يمكن أن يكون مفيداً جداً في تشخيص القضايا في طلبك.
Serilog هو فائق المرونة من حيث أنه يسمح لك بإعداده في الرمز وكذلك من خلال التهيئة. على سبيل المثال إلى استخدام element فوقي أنت يعمل هذا:
builder.Host.UseSerilog((context, services, configuration) =>
{
configuration
.MinimumLevel.Warning()
.Enrich.FromLogContext()
.Enrich.WithThreadId()
.Enrich.WithThreadName()
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.WriteTo.Seq("http://seq:5341", apiKey: "")
.WriteTo.Console()
.WriteTo.File("logs/applog-.txt", rollingInterval: RollingInterval.Day)
.Enrich.WithProperty("ApplicationName", "mostlylucid");
});
هذا هو نفسه كتشكيل أعلى ولكن في الرمز. هذا مفيد إذا كنت ترغب في وضع تسجيلك في الرمز، الأمر يعود لك حقاً كيف تقوم به.
في ASP.net يمكنك استخدام المرشحات الإستثنائية لإلتقاط الإستثناءات وتسجيلها. هذه طريقة عظيمة لضمان تسجيل جميع الاستثناءات في طلبك. على أي حال أنه ليس بديلاً لأسلوب مستوى قطع الأشجار؛ يجب عليك أن تسجل في مستوى الطريقة بحيث يمكنك أن ترى ما يحدث في تطبيقك بالتفصيل؛ مرشح الإستثناء يظهر ما يحدث بمجرد أن يكون كامل كومة الطلب غير مكسوراً ويمكن أن يكون مربكاً جداً في كثير من الأحيان لمعرفة ما حدث.
تغيّر هذا في ASP.net الأساسية 8 وهناك a طن يمكنك القيام به مع هذه ميزات جديدة.
مرة أخرى على علة نفس المبادئ تطبق ، يجب عليك أن تسجل على مستوى الطريقة بحيث يمكنك أن ترى ما يحدث في تطبيقك بالتفصيل ؛ المفارز الإستثنائية / حالة معالجات فقط تظهر ما يحدث بمجرد أن يكون كامل كومة الطلب غير فك و يمكن أن تكون مربكة جداً في كثير من الأحيان لمعرفة ما حدث.
ينبغي أن يكون قطع الأشجار مناسباً للبيئة؛ في التنمية تقوم بتسجيل كل شيء حتى تتمكن من رؤية ما يحدث في كل نقطة في التطبيق الخاص بك ولكن في الاختبار تحتاج إلى قطع أقل (معلومات سجل السلوك هنا) وفي الإنتاج تحتاج إلى أقل من ذلك (التحذير وما فوق).
ومن المغري تسجيل كل شيء في الإنتاج لكنها فكرة سيئة. يجب عليك تسجيل كل ما تحتاجه لتشخيص مشكلة ولكن لا أكثر. في مورّدي سحابة يمكنك بسهولة الحصول على مشحون لكمية البيانات التي ترسلها إلى خدمة تسجيل الأشجار لذا يجب أن تكون حذراً حول ما تقوم بتسجيله وكم من الوقت تحتفظ بهذه السجلات له (التطبيق يُنظّر تخزن سجلات ل90 يوماً افتراضياً؛ هذا غالباً ما يكون لونغ TOO LONG وسوف يكلفك ما دام بيانات السجل مخزنة).
من أجل تطبيق "نشط" جداً، لن تحتاج إلى تسجيل طويل الأمد لتلك البيانات، سيكون لديك فكرة جيدة عما يحدث في التطبيق من الأيام القليلة الأخيرة من اللوغارتمات.
عندما تكون القضية المشتركة التي أراها في الإنتاج هي طلبات قطع الأشجار الفاشلة؛ في حين أنها يمكن أن تكون مثيرة للاهتمام (لا أحد يريد 404 / 401) هذه يمكن أن تكون كمية ضخمة من البيانات ويمكن أن تكون مكلفة جدا لتخزينها. يجب عليك فقط أن تُح_ تُنتوى أن تُثبّتوقد يكون هذا مهماً بالنسبة للرقم 404 حيث يمكن أن يشير إلى وجود رابط مكسور في طلبك؛ وبالنسبة للرقم 401 قد يكون ذلك مهماً لأنه يمكن أن يشير إلى نظام توثيق مكسور.
على أي حال كما ذكرت أعلاه هذه يتم التعامل معها بشكل أفضل في الرموز التي تحدث في الواقع في (في حالة 401)؛ قد يكون من الضروري أيضاً أن يتم تسجيل هذه أيضاً ك Warning
أو Error
في الشفرة التي في الواقع تولد 401.
لوضع طلب تسجيل في سيريلوج يمكنك القيام بذلك:
app.UseSerilogRequestLogging();
هذا سَيُسجّلُ كُلّ الطلبات إلى تطبيقِكَ، هو a طريقة عظيمة لرؤية الذي يحدث في تطبيقِكَ على مستوى عالٍ، لكن ثانيةً يَجِبُ أَنْ تَكُونَ حذر حول الذي تُسجّلُ وكم من الوقت تَحتفظُ بهذه اللوغاريتماتِ ل.
بالنسبة لاستطلاعات التطبيقات، قد ترغب في تسجيل مستوى استخدام المعلومات كما أنها سوف تعطيك ميزة Journey، هذه طريقة عظيمة لرؤية كيف يستخدم المستخدمون تطبيقاتك ويمكن أن تكون مفيدة جداً في تشخيص القضايا، ومع ذلك مرة أخرى هذه بسرعة رفع التكاليف لذا يجب أن تكون حذراً حول ما تقوم بتسجيله وكم من الوقت تحتفظ بهذه السجلات لـ.
إذاً هذا هو، عملية سريعة من خلال كيفية تسجيل في تطبيقات ASP.net. الكثير منه هو رد فعل على الجذوع التي لا طائل منها والتي أراها في العديد من تطبيقات الإنتاج. في التنمية تريد أن ترى كيف يعمل هذا التطبيقفي الإنتاج تريد أن ترى كيف يفشل التطبيق. فكثيراً ما يكون قطع الأشجار جزءاً لا طائل منه ومكلفاً من تطوير التطبيقات. وكما هو الحال مع كل شيء في تطوير البرمجيات قطع الأشجار يجب أن يركز على USER ؛ ما إذا كان أنت / المطورين الآخرين أثناء العمل على التطبيق في IDE الخاص بك/ محليا أو حل القضايا في الإنتاج بسرعة وكفاءة.