CHIA SẺ KINH NGHIỆM LẬP TRÌNH – WIKI PAGE

LOG4NET là một thư viện mã nguồn mở cho phép chúng ta tạo ra một hoặc nhiều tập tin log, kiểu log cũng như nội dung log một cách linh hoạt và thuận tiện. Ngoài ra, Log4net còn có thể thay đổi trạng thái log lúc ứng dụng đang chạy mà không cần ngừng chương trình. Bên cạnh đó, khi sử dụng log4net sẽ không ảnh hưởng đáng kể đến efficiency của ứng dụng và điều quan trọng của một thư viện nguồn mở đó là chúng ta có thể tùy ý phát triển theo nhu cầu của cá nhân hoặc tập thể miễn là phù hợp giấy phép mã nguồn mở.

Để hiểu được tầm quan trọng của việc log, chúng ta có một tình huống như sau; Cty chúng tôi đang phát triển một ứng dụng và đã đến kỳ hạn phải triển khai cho người dùng, dĩ nhiên do dự án có độ trễ vì thế chúng tôi không thể đảm bảo rằng các tính năng cũng như toàn bộ hệ thống của chúng tôi hoạt động tốt, ngoài ra có một số lỗi mà chỉ khi được triển khai thực tế mới phát hiện. Vậy người dùng gặp lỗi khi sử dụng, mà vì khoản cách, vì bảo mật nên chúng tôi khổng thể tiếp cận khách hàng hoặc cài Visible trên máy của họ để DEBUG chưa kể nếu bạn chạy MultiThread thì rất khó Debug – chỉ mơ hồ biết thông tin về Bug thông qua một người không phải kỹ thuật viên thì phải mất khá lâu để cải thiện được tình hình. Thế thì việc tạo Log trong quá trình người dùng sử dụng thật sự là một giải pháp tốt – những con số biết nói. Tôi chỉ việc yêu cầu người dùng gửi cho chúng tôi file Log và họ sẽ sớm có bản vá lỗi cho vấn của họ.

Để sử dụng được Log4net các bạn cần chú ý đến các vấn đề sau đây:

* Tập tin cấu hình Log4net Măc định tập tin này chính là tập tin cấu hình của một ứng dụng dạng [myApp].exe.config hay Net.config cho Asp.NET bạn cũng có thể tạo một file cấu hình khác

  • Log ra những dạng nào: ConsoleAppender, FileAppender, RollingFileAppender, AdoNetAppender…
  • Các file log có thuộc tính gì: file, appendToFile, maximumFileSize, …
  • Các thông tin cho một dòng log: format, thread, date, degree, …

* Cách thức log Là cách để thực hiện việc nhận cấu hình và tiến hành tạo log

  • Các cấu hình log4net được lưu ở đâu
  • Log những gì và degree của log ra sao

I> Cấu trúc một file cấu hình log4net

Một tập tin cấu hình của log4net có cấu trúc đơn giản sẽ như dưới, trong đó phần quan trọng là các thẻ <appender> và thẻ <root>

<!- Đây là thư mục gốc của tập tin cấu hình của bạn -> <configuration> <!- Phần này nên giữ nguyên -> <configSections> <part title=”log4net” kind=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/> </configSections> <!- Nội dung cấu hình -> <log4net> <!- Stage 1 -> <!- Định nghĩa Các appender-> <appender> <!- Stage 2 -> <format> <!- Stage 3 -> <conversionPattern /> <!- Stage 4 -> </format> <filter> <!- Stage 3 -> </filter> </appender> <!- Sử dụng các appender-> <root> <!- Stage 2 -> <degree /> <!- Stage 3 -> <appender-ref /> <!- Stage 3 -> </root> </configuration>

Thẻ <appender>

Thẻ này quy định các thức thể hiện(lưu trữ) các dòng log, trong đó có 4 cách cơ bản thể hiện: ConsoleAppender, FileAppender, RollingFileAppender, AdoNetAppender, … Cách hay dùng nhất là RollingFileAppender. Hãy để ý thẻ <format>, xem bảng cuối bài để hiểu các thuộc tính.

Có Thể Bạn Quan Tâm :   Sản phẩm mồi – Chiến lược kinh doanh quan trọng trong bán lẻ

RollingFileAppender: Tạo ra tập tin log, khi tập tin này quá giới hạn thì nó sẽ bị đổi tên và tạo tập tin mới để log, vậy chúng ta sẽ có nhiều tập tin log.

<!-Log to file collection-> <appender title=”RollingFileAppender” kind=”log4net.Appender.RollingFileAppender”> <file worth=”mylogfile.txt” /> <pre> <appendToFile worth=”true” /> <rollingStyle worth=”Dimension” /> <maxSizeRollBackups worth=”5″ /> <maximumFileSize worth=”10MB” /> <staticLogFileName worth=”true” /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%date [%thread] %degree %logger – %messagepercentnewline” /> </format> </appender>

ConsoleAppender: log ra màng hình, chỉ hiển thị khi ứng dụng có của sổ Console

<!-Log to Console window-> <appender title=”ConsoleAppender” kind=”log4net.Appender.ConsoleAppender”> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%date{ABSOLUTE} [%thread] %degree %logger – %messagepercentnewline”/> </format> <filter kind=”log4net.Filter.StringMatchFilter”> <stringToMatch worth=”check” /> </filter> <filter kind=”log4net.Filter.DenyAllFilter” /> </appender>

FileAppender: tạo ra duy nhất một file log

<!-Log to file-> <appender title=”FileAppender” kind=”log4net.Appender.FileAppender”> <file worth=”mylogfile.log” /> <appendToFile worth=”true” /> <lockingModel kind=”log4net.Appender.FileAppender+MinimalLock” /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%date [%thread] %degree %logger – %messagepercentnewline” /> </format> <filter kind=”log4net.Filter.LevelRangeFilter”> <levelMin worth=”INFO” /> <levelMax worth=”FATAL” /> </filter> </appender>

AdoNetAppender: tạo ra các dòng log và lưu vào Database

<!-Log to Database-> <appender title=”AdoNetAppender” kind=”log4net.Appender.AdoNetAppender”> <bufferSize worth=”100″ /> <connectionType worth=”System.Information.SqlClient.SqlConnection, System.Information, Model=1.0.3300.0, Tradition=impartial, PublicKeyToken=b77a5c561934e089″ /> <connectionString worth=”information supply=[database server]; preliminary catalog=[database name];built-in safety=false; persist safety data=True;Consumer ID=[user];Password=[password]” /> <commandText worth=”INSERT INTO Log ([Date],[Thread],[Level],[Logger], [Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)” /> <parameter> <parameterName worth=”@log_date” /> <dbType worth=”DateTime” /> <format kind=”log4net.Structure.RawTimeStampLayout” /> </parameter> <parameter> <parameterName worth=”@thread” /> <dbType worth=”String” /> <dimension worth=”255″ /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%thread” /> </format> </parameter> <parameter> <parameterName worth=”@log_level” /> <dbType worth=”String” /> <dimension worth=”50″ /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%degree” /> </format> </parameter> <parameter> <parameterName worth=”@logger” /> <dbType worth=”String” /> <dimension worth=”255″ /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%logger” /> </format> </parameter> <parameter> <parameterName worth=”@message” /> <dbType worth=”String” /> <dimension worth=”4000″ /> <format kind=”log4net.Structure.PatternLayout”> <conversionPattern worth=”%message” /> </format> </parameter> <parameter> <parameterName worth=”@exception” /> <dbType worth=”String” /> <dimension worth=”2000″ /> <format kind=”log4net.Structure.ExceptionLayout” /> </parameter> </appender>

Trong đó ý nghĩa các thẻ con của thẻ appender như sau:

Structure

<!- Đây là thẻ mô tả cách hiển thị một dòng log -> <format kind=”log4net.Structure.PatternLayout”> <!- Thẻ này là định dạng của một dòng log, ý nghĩa các ký tự xin tham khảo bảng cuối trang-> <conversionPattern worth=”%date [%thread] %-5level %logger [%ndc] – %messagepercentnewline”/> </format>

Filter

<!- Thẻ này dùng để lọc log-> <!- Begin-> <!- Chỉ log nếu dòng log có chữ check, chú ý rằng StringMatchFilter luôn đi kèm DenyAllFilter-> <filter kind=”log4net.Filter.StringMatchFilter”> <stringToMatch worth=”check” /> </filter> <filter kind=”log4net.Filter.DenyAllFilter”/> <!- Finish-> <!- Chỉ log trong một giới hạn level-> <filter kind=”log4net.Filter.LevelRangeFilter”> <levelMin worth=”INFO” /> <levelMax worth=”FATAL” /> </filter> <!- Begin-> <!- Chỉ log degree ERROR, chú ý rằng LevelMatchFilterluôn đi kèm DenyAllFilter-> <filter kind=”log4net.Filter.LevelMatchFilter”> <levelToMatch worth=”ERROR”/> </filter> <filter kind=”log4net.Filter.DenyAllFilter”/> <!- Finish-> <!- Dùng chung với hai trường hợp kể trên-> <filter kind=”log4net.Filter.DenyAllFilter”/>

Xem chi tiết về filter tại bài config nâng cao

Stage

Chúng ta có bảy degree sau với mức cao nhất ở trên cùng của danh sách, khi bạn chọn một degree để log thì các degree từ đó trở lên đều được log: -> OFF – không có gì được log -> FATAL -> ERROR -> WARN -> INFO -> DEBUG -> ALL – mọi thứ sẽ được log

Thẻ <Root>

Là thẻ quyết định degree nào sẽ được log và các dạng log sẽ được sử dụng

<root> <degree worth=”INFO”/> <!- Chỉ log từ degree INFO trở lên-> <appender-ref ref=”FileAppender”/> <!- dùng FileAppender-> <appender-ref ref=”ConsoleAppender”/><!- dùng ConsoleAppender-> </root>

Có Thể Bạn Quan Tâm :   Bài 3 Hạng của ma trận

II> Cách thức log

Khi đã hoàn tất việc tạo file config, chúng ta tiến hành chọn thời điểm và nội dung log phù hợp trong Code-behind, chúng ta có 4 bước như sau

B1-> Tải thư viện log4net.dll và add vào Undertaking của bạn, nhớ Reference. Bạn có thể tải dll cả mã nguồn ở đây còn tôi thì tôi thích dùng Nuget với command sau

Set up-Package deal log4net

B2-> Hãy khai báo một biến static readonly toàn cục cho tất cả các class cần log, một ví dụ tổng quát bên dưới

class Program { //Coppy dòng code này cho tất cả các class personal static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static void Primary(string[] args) { } }

B3-> Chỉ ra tập tin cấu hình của log4net, tôi có hai cách làm việc này C1) Dán một trong hai dòng code sau vào dòng dưới cùng của tập tin AssemblyInfo.cs (tìm trong venture của bạn)

//Dùng dòng này nếu tập tin cấu hình năm ở một nơi nào đó hoặc không phải tập tin cấu hình của ứng dụng [assembly: log4net.Config.XmlConfigurator(ConfigFile = “UsingLog4Net.xml”, Watch = true)] //Dùng dòng code này nếu tập tin cấu hình log4net chính là tập tin cấu hình của ứng dụng [assembly: log4net.Config.XmlConfigurator(Watch = true)]

C2) Chỉ rõ tập tin cấu hình ở thân hàm mà bạn nghĩ hàm này sẽ được gọi đầu tiên khi ứng dụng được khởi động hoặc ít ra là trước khi tiến hành log bất kỳ thứ gì. Tôi nghĩ đó là hàm Primary cho một ứng dụng Console

class Program { personal static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static void Primary(string[] args) { //Chỉ được dùng một trong hai dòng code sau //Dòng này khi dùng một tập tin cấu hình bất kỳ XmlConfigurator.Configure(new FileInfo(“UsingLog4Net.xml”)); //Dòng này khi dùng tập tin cấu hình của ứng dụng XmlConfigurator.Configure(); Console.ReadLine(); } }

B4-> Công việc còn lại là log nơi nào bạn nghĩ là cần thiết, tùy thuộc vào ý đồ mà chọn degree phù hợp

class Program { personal static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static void Primary(string[] args) { XmlConfigurator.Configure(new FileInfo(“UsingLog4Net.xml”)); log.Data(“Utility began”); strive { int worth = int.Parse(“Tuân”); } catch (Exception e) { log.ErrorFormat(“Error: {0}”,e.Message); } Console.ReadLine(); } }

Trên đây là tất cả những gì cở bản nhất để tiến hành tạo log cho một ứng dụng C#, mời bạn đọc tải về ví dụ tại đây. Ngoài ra bạn cũng có thể tham khảo AppDomain Logging và log4Net and SQLite

Dưới đây là ý nghĩa các giá trị thông tin cho một dòng log được cấu hình trong format, tôi xin phép trích nguyên văn để các bạn dùng cho chính xác:

Conversion Patterns

As I discussed above, the conversion sample entry is used for the sample format to inform the appender how you can retailer the data. There are a lot of totally different key phrases that can be utilized in these patterns, in addition to string literals. Right here I’ll specify what I believe are essentially the most helpful and necessary ones. The complete checklist could be discovered within the log4net documentation.

  • %date – Outputs the date utilizing the native time zone data. This date could be formatted utilizing the curly braces and a format sample reminiscent of %date{MMMM dd, yyyy HH:mm:ss, fff} to output the worth of “January 01, 2011 14:15:43, 767”. Nevertheless, it’s urged that you just use one of many log4net date formatters (ABSOLUTE, DATE, or ISO8601) since they provide higher efficiency.
  • %utcdate – This is identical because the %date modifier, nevertheless it outputs in common time. The modifiers for date/time all work the identical manner.
  • %exception – If an exception is handed in, will probably be entered and a brand new line can be positioned after the exception. If no exception is handed in, this entry can be ignored and no new line can be put in. That is often positioned on the finish of a log entry, and often a brand new line is positioned earlier than the exception as effectively.
  • %degree – That is the extent you specified for the occasion (DEBUG, INFO, WARN, and many others.).
  • %message – That is the message you handed into the log occasion.
  • %newline – This can be a new line entry. Primarily based upon the platform you’re utilizing the appliance on, this can be translated into the suitable new line character(s). That is the popular technique to enter a brand new line and it has no efficiency issues in comparison with the platform-specific operators.
  • %timestamp – That is the variety of milliseconds for the reason that begin of the appliance.
  • %thread – This provides you with the title of the thread that the entry was made on (or the quantity if the thread is just not named).
Có Thể Bạn Quan Tâm :   VFX là gì? Định hướng hành trình trở thành Visual Effects (VFX) Artist chuyên nghiệp

Past these are just a few extra that may be very helpful however ought to be used with warning. They’ve detrimental efficiency implications and ought to be used with warning. The checklist consists of:

  • %id – That is the person title of the present person utilizing the Principal.Id.Identify technique.
  • %location – Particularly helpful if you’re working in Debug mode, this tells you the place the log technique was referred to as (line quantity, technique, and many others.). Nevertheless, the quantity of knowledge will lower as you use in Launch mode relying on what the system can entry from the compiled code.
  • %line – That is the road variety of the code entry (see the be aware above on the situation points).
  • %technique – That is the tactic that calls the log entry (see the be aware above on the situation points).
  • %username – This outputs the worth of the WindowsIdentity property.

You might discover that some config recordsdata have letters as a substitute of names. These have been depreciated in favor of entire phrase entries like I’ve specified above. Additionally, whereas I received’t cowl it in depth right here, be aware that every of those entries could be formatted to suit a sure width. Areas could be added (to both facet) and values could be truncated as a way to match within fixed-width columns. The fundamental syntax is to put a numeric worth or values between the % signal and the title. Listed here are the modifiers:

  • X – Specifies the minimal variety of characters. Something that has fewer characters could have areas positioned on the left of the worth to equal 20 characters together with the message. For instance, %10messagewill offer you ” hello“.
  • -X – Identical as above, solely the areas can be positioned on the appropriate. For instance, %-10message provides you with “hello “.
  • .X – Specifies the utmost variety of characters. The necessary factor to notice is that this can truncate the start of the string, not the top. For instance, %.10message will give me “rror entry” if the string handed in was “Error entry“.

You’ll be able to put all of this along with one thing like this: “%10.20message“, which might specify that if the message isn’t ten characters lengthy, put areas on the left to fill it out to 10 characters, but when the message is greater than 20 characters lengthy, lower off the start to make it solely 20 characters.

Back to top button