NLog 2.0 का उपयोग करके फायरबर्ड एंबेडेड डेटाबेस में C # एप्लिकेशन लॉग करना

C # में अपने पहले डेस्कटॉप एप्लिकेशन के साथ शुरुआत करना, मुझे लॉगिंग के बारे में आश्चर्य हुआ। इस विषय पर प्रस्तावों का अध्ययन, अच्छी समीक्षा और उपयोग के लिए शुल्क की कमी के बाद, मेरी पसंद NLog 2.0 पर गिर गई। साइट पर प्रलेखन, साथ ही स्थानीय लेखों को पढ़ने के बाद, मैंने डिबगिंग जानकारी के आउटपुट को आसानी से एक पाठ फ़ाइल में कॉन्फ़िगर किया। लेकिन पूछताछ करने वाला दिमाग अभी भी खड़ा नहीं है, और चूंकि मेरा आवेदन फायरबर्ड एंबेडेड डेटाबेस का उपयोग करता है, इसलिए मैंने इसमें लॉगिंग को कॉन्फ़िगर करने का निर्णय लिया। यहीं पर मुझे 5 घंटे की पहेली मिली। फायरबर्ड (चाहे एंबेडेड या एक बड़ी भूमिका नहीं निभाता है) के लिए NLog स्थापित करने पर व्यावहारिक रूप से कोई जानकारी नहीं है, और जो मौजूद है वह NLog के पुराने संस्करणों से संबंधित है और पहले से ही प्रासंगिकता खो चुका है। अपनी आस्तीन ऊपर उठाकर और केफिर के साथ स्टॉक करके, मैंने इस बाधा को दूर करना शुरू कर दिया, जो कि इस लेख के बारे में है।

मैं यह नोट करना चाहता हूं कि लेख परियोजना के लिए FireBird .Net प्रदाता के कनेक्शन को प्रभावित नहीं करता है, साथ ही साथ NLog की प्रारंभिक स्थापना भी।

NLog को कॉन्फ़िगर करना NLog.config फ़ाइल को ठीक से कॉन्फ़िगर करना है, जो एक XML फ़ाइल है। पहले जोड़े में, मैं एक समस्या में भाग गया कि लॉगिंग सिस्टम को चालू करने के बाद, परियोजना ने बस शुरू करना बंद कर दिया, आवेदन के मुख्य रूप को शुरू करने में विफल रहा। इसका कारण मेरा खराब कॉन्फ़िगर किया गया NLog था। अपने कार्य को सरल बनाने और अपनी नसों को बचाने के लिए, आपको कॉन्फ़िगरेशन फ़ाइल में दो लाइनें जोड़ने की आवश्यकता है:

throwExceptions="true"
internalLogFile="file.txt"

अगली बार जब आप एप्लिकेशन शुरू करते हैं, तो file.txt फ़ोल्डर में निष्पादन योग्य फ़ाइल के साथ बनाया जाएगा, जिसमें NLog सिस्टम का एक विस्तृत विस्तृत लॉग होता है और आपको कॉन्फ़िगरेशन त्रुटियों को पकड़ने की अनुमति देगा।
लॉग के "रिसीवर" का कॉन्फ़िगरेशन टैग "लक्ष्य" में है। 3 चीजों को पाने के लिए सबसे मुश्किल काम था:
1) DBMS प्रदाता का नाम इसके टोकन के साथ
2) DB कनेक्शन स्ट्रिंग
3) डेटाबेस और इसके मापदंडों के लिए अनुरोध

पहले बिंदु को Google की मदद से दूर किया गया था। लेकिन दूसरे और तीसरे पैराग्राफ के साथ यह अधिक कठिन था। मुझे अपने आवेदन से कनेक्शन स्ट्रिंग मिला, जो अन्य मैनुअल के आधार पर, पहले से ही फायरबर्ड डेटाबेस से जुड़ सकता है। मैंने गैर-वैज्ञानिक "प्रहार" पद्धति का उपयोग करते हुए अनुरोध और इसके मापदंडों को हल किया। नष्ट न होने के लिए, मैं तुरंत एक "रिसीवर" कॉन्फिगर लाऊंगा:
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >


* This source code was highlighted with Source Code Highlighter .
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >


* This source code was highlighted with Source Code Highlighter .
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >


* This source code was highlighted with Source Code Highlighter .


dbProvider , FireBird .NET प्रदाता का नाम है, जो इसके वर्तमान आधिकारिक संस्करण 2.6.5 से मेल खाता है। भविष्य के संस्करणों के लिए, आपको केवल अंकों को बदलने की जरूरत है, टोकन (PublicKeyToken = 3750abcc3150b00c) समान रहना चाहिए।

कनेक्शन स्ट्रिंग कनेक्शन स्ट्रिंग है। द्वारा और बड़े, जब यह बनता है, तो इसे समझना और अपने लिए कुछ बदलना मुश्किल नहीं होगा। इस उदाहरण में, कनेक्शन फायरबर्ड एंबेडेड सर्वर, FYT.FDB डेटाबेस पर कॉन्फ़िगर किया गया है, जो कि निष्पादन योग्य फ़ाइल के साथ निर्देशिका में निहित है। FireBird Classic या SuperServer के लिए आपको केवल "सर्वर प्रकार" और "क्लाइंट लाइब्रेरी" बदलने की आवश्यकता है।

कमांडटैक्स - डेटाबेस में डेटा डालने का अनुरोध। लकड़हारा द्वारा प्रेषित पैरामीटर "कुत्ते" द्वारा चिह्नित हैं, अर्थात। @। नीचे, "पैरामीटर" टैग में मौजूद विशेषताएँ बताती हैं कि अनुरोध में प्रत्येक पैरामीटर को क्या बदला जाना चाहिए। सभी उपलब्ध लेआउट विकल्पों की एक सूची NLog वेबसाइट पर देखी जा सकती है।

अंत में, मैं विन्यास फाइल NLog.config की पूरी सूची दूंगा:
<? xml version ="1.0" encoding ="utf-8" ? >
< nlog xmlns ="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions ="true"
internalLogFile ="file.txt">

< targets >
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >
</ targets >

< rules >
< logger name ="*" minlevel ="Debug" writeTo ="db" final ="true" />
</ rules >
</ nlog >


* This source code was highlighted with Source Code Highlighter .
<? xml version ="1.0" encoding ="utf-8" ? >
< nlog xmlns ="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions ="true"
internalLogFile ="file.txt">

< targets >
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >
</ targets >

< rules >
< logger name ="*" minlevel ="Debug" writeTo ="db" final ="true" />
</ rules >
</ nlog >


* This source code was highlighted with Source Code Highlighter .
<? xml version ="1.0" encoding ="utf-8" ? >
< nlog xmlns ="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions ="true"
internalLogFile ="file.txt">

< targets >
< target
xsi:type ="Database"
name ="db"
dbProvider ="FirebirdSql.Data.FirebirdClient.FbConnection, FirebirdSql.Data.FirebirdClient, Version=2.6.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c"
useTransactions ="true"
connectionString ="server type=Embedded;initial catalog=FYT.FDB;character set=WIN1251;dialect=3;client library=fbembed.dll;user id=SYSDBA;password=masterkey"
keepConnection ="true"
commandText ="INSERT INTO logs (DT, LOG_TEXT, LEVEL_ID, CLASS, STACK_TRACE) values (@DT, @LOG_TEXT, @LEVEL_ID, @CLASS, @STACK_TRACE);" >
< parameter layout ="${longdate}" name ="@DT" />
< parameter layout ="${level}" name ="@LEVEL" />
< parameter layout ="${message}" name ="@LOG_TEXT" />
< parameter layout ="${logger}" name ="@CLASS" />
< parameter layout ="${stacktrace}" name ="@STACK_TRACE" />
</ target >
</ targets >

< rules >
< logger name ="*" minlevel ="Debug" writeTo ="db" final ="true" />
</ rules >
</ nlog >


* This source code was highlighted with Source Code Highlighter .


आपका ध्यान के लिए धन्यवाद! मुझे आशा है कि मेरा लेख आपको फायरबर्ड डेटाबेस में लॉगिंग सिस्टम स्थापित करने में 5 घंटे खर्च नहीं करने में मदद करता है!

Source: https://habr.com/ru/post/In133763/


All Articles