Đừng sợ anh đau lòng log4net

“Giữa biển người mênh mông, ai vô tình gặp bạn, bạn bất ngờ gặp ai, ai bỏ lỡ bạn, bạn để ý đến ai, ai cùng bạn đi một đoạn đường, bạn theo ai đi hết một đời?
Dọc theo đường đời, bạn gặp gỡ rất nhiều người, có người ở cùng một trạm nghỉ chân, có người là khách qua đường, để lại trong đời bạn rất nhiều dấu phẩy, mỗi một việc trải qua một dấu phẩy, một đoạn tình cảm một dấu phẩy, một đoạn nỗ lực một dấu phẩy, …
Vô số dấu phẩy như vậy cũng chỉ vì chờ đợi dấu chấm tròn trĩnh cuối cùng…”

528204_490903667643386_2056631206_n

Thì ra trong chốn hồng trần cuộc đời chúng ta sẽ đi qua muôn vàn dấu phẩy chỉ để mong chờ có thể kết thúc bằng một dấu chấm.  Cuộc đời là vậy tràn ngập những dấu phẩy mang đầy ưu tư muộn phiền:

  • Đôi khi có rất nhiều điều tâm sự nhưng không biết phải nói thế nào, phải nói cùng ai
  • Có nhiều mơ ước nhưng không biết thực hiện như thế nào
  • Đôi khi chỉ vì một câu nói mà vô tình bi ai, vô tình đau đớn rồi vô tình đánh mất

Với những trầm luân của cuộc đời nhiều như vậy thì làm sao chúng ta có thể vượt qua những dấu phẩy mà đi đến được dấu chấm trọn vẹn khi mà chúng ta cứ liên tiếp gục ngã sau mỗi dấu phẩy. Sự đời như vậy thì cái triết lý nhân sinh này nó cũng được mang vào code như thế thôi :v Mỗi dòng code sẽ lại gặp được các dấu phẩy (error) suốt ngày thì đến bao giờ nó mới gặp được dấu chấm (chương trình ngon lành). Nếu cứ mỗi lần đi qua dấu phẩy mà chúng ta cứ chả biết gì, cứ lờ nhau như gió thoảng mây trôi thì sau ngàn năm, vạn năm nó không thể gặp được cái dấu chấm kết thúc cho nó. Thế làm thế nào đây 😦 Để có thể ít gặp những dấu phẩy của cuộc đời cho chương trình thì chúng ta cần lưu vết lại những lần gặp dấu phẩy để lần sau còn tránh không gặp nữa chứ :v Chính thế mình sẽ mang đến cho 1 công cụ số 1 trong giới lập trình .NET đó là LOG4NET

Log4Net là gì

Thực ra thì cái này chắc cũng chả cần giới thiệu nhiều vì nếu đã làm .NET thì hầu như mình thấy ai ai cũng dùng thằng này để làm 1 công việc đơn giản nhưng mang lại nhiều lợi ích đó là lưu log. Log4Net đơn giản, mạnh mẽ chuẩn soái ca, được kế thừa những phẩm chất tốt đẹp nhất từ người anh em cùng cha khác nội Log4J (thằng này số 1 lưu log bên JAVA, mấy anh em làm .NET thấy ngon quá nên port sang bên .NET)

Sử dụng thế nào đây?

Cái này chính là vấn đề mà mình muốn nói đến nhiều nhất vì thực ra anh em làm chỉ có cắm đầu sử dụng gọi hàm của nó ra mà chả cần biết quái gì đến chi tiết của nó (ở ngoài thì không biết chứ ở công ty mình thì đúng là chỉ có Log.Error()) Điều này làm mình đau lòng lắm 😦 Thực sự cứ làm mà chỉ có cắm đầu copy không suy nghĩ thì tương lai cho giới lập trình VN sẽ đi về đâu nếu cứ làm outsource mãi 😦


Bài viết này nói thật cũng chả có gì quá cao siêu về Log4NET nhưng điều mà mình muốn mang đến cho mọi người đó là làm thì phải thấu hiể để ứng dụng tốt hơn, lưu log không đơn thuần chỉ là gọi mỗi cái hàm nó ra rồi cấu hình lưu log thì cho lưu cả đống 😦 Mình đợt trước đi phỏng vấn bị hỏi về cái này thì không biết luô 😐 Nhục không tả được nên giờ quyết tâm học cái gì cũng phải ra ngô ra khoai lần sau còn chém lại :v

Đầu tiên thì chúng ta cần biết đến đó là Logging Level

Logging Level

Đến đây chắc nhiều anh em sẽ lộ ra cái chả hiểu gì về log4net =)) hồi xưa mình cũng vậy đấy :v nhưng giờ khác rồi nhé. Hiểu ngon lành cành đào luôn. Logging level nghĩa là mức độ log. QUá đơn giản đúng không :v Nghe là mức độ thì phải có nhiều mức rồi. Đúng. Có 7 mức đó được mình sắp xếp từ cao đến thấp nhé

  1. OFF: éo log gì cả
  2. FATAL: log lại các thông tin gây ra crash ứng dụng
  3. ERROR: log những thông tin lỗi nhưng vẫn cho ứng dụng chạy tiếp
  4. WARN: các thông tin mang tính chất cảnh báo nhưng không gây ra nguy hiểm gì được log ra
  5. INFO: log các thông tin trong quá trình ứng dụng chạy
  6. DEBUG: log các thông tin để có thể giúp cho việc debug ứng dụng
  7. ALL: log tất tần tất mọi thứ

Ở trong code thì chỉ có thể sử dụng 5 mức độ thôi trừ cái đầu với cái cuối ra :v. Các mức độ này có thể sử dụng tùy ý ở cả trong code lẫn trong file config.

Thế chia theo mức độ để làm gì nhỉ? Thường thì mình thấy mọi người cứ log thì để là ALL tuốt chả cần mức độ làm gì cho tốn công :v Ý tưởng khá là hay ho đấy chứ :3 Dùng như thế nó sai hết cả mục đích của log4net rồi đấy 😦 Thôi cứ đi tiếp rồi tí nói tiếp nhé :v

Cấu hình log4net

Với ứng dụng web thì cấu hình log4net ở file web.config còn ở desktop thì cấu hình cho file app.config. Mặc định thì anh em đồng đạo hay làm vậy vì trong web hay app config sẽ có 1 section riêng để cấu hình cho thằng log4net. Tuy vậy thì mình khuyên anh em nên cấu hình ra 1 file riêng cho log4net thì hay hơn vì bản thân mình thấy nếu cái quái gì mình cũng tống vào web hay app config thì nó to tổ bố ra, về sau muốn tìm cái gì để sửa cũng chết mệt 😐

its-a-big-big-world

Để giải thích cơ bản về cấu hình trong log4net mình xin mang đến 1 file cấu hình cơ bản của log4net. Đoạn cấu hình này sẽ nằm trong 1 file app.config hoặc web.config nhé :v

Đoạn đầu configSections để quy định dùng thẻ nào cấu hình cho log4net nhé. Đơn giản nên đi tiếp :v

Tiếp đến đó là cái mặc định phải có ROOT. Mọi logger sau này sẽ kế thừa lại toàn bộ thông tin cấu hình của thằng ROOT. Ở đây anh em có thể thấy mình cấu hình mức độ Log là INFO nghĩa là mọi message LOG ở mức độ DEBUG sẽ được bỏ qua :v. Đấy anh em hiểu về mức độ chưa :v Nếu để là WARN thì INFO và DEBUG sẽ được bỏ qua không log ra.

Ngó tiếp thì thấy cái gì mà APPENDER. Đại loại appender là thằng dùng để quy định mình sẽ log vào đâu, log cái của nợ gì, rồi chỗ lưu log bla bla. Đủ các thể loại luôn nhé. Appender thì cũng chia làm mấy loại như

  • Console appender: log ra cửa sổ command nếu bạn đang sử dụng ứng dụng console
  • File Appender: log ra nhiều file
  • Rolling File Appender: log vào 1 file với độ lớn cố định như kiểu log xong file 10MB thì chuyển qua file khác (thằng này là hay được sử dụng nhất này)

Với mỗi thằng appender khác nhau thì lại có mấy đoạn cấu hình khác nhau nhé :v Không phải cái nào làm cũng giống nhau đâu :v Mình sẽ chỉ tập trung vào thằng RollingFileAppender vì thằng này là phổ biến và tiện lợi nhất

Để thẩm thấu được thì anh em ngó lại bên trên file cấu hình sẽ thấy đoạn cấu hình cho log4net là mình sẽ lưu log ra file có tên demo.txt, độ lớn file là 10MB, cứ log được 5 file thì lại xóa đi. Còn cái staticLogFileName là để chắc chắn file log được log luôn có tên cố định là demo chứ không bị đổi thành demo1 hay demo2

Còn để quy định log có hình thù thế nào thì sẽ sử dụng LAYOUT để quy định nhé :v  Log4net có quy chuẩn mấy cái đơn giản đại loại kiểu

  • %date – ngày tháng log này
  • %level – mức độ log
  • %message – nội dung đoạn log mà anh em log ra
  • %newline – quy định chỗ xuống dòng
  • %timestamp – This is the number of milliseconds since the start of the application.
  • %thread – tên thread của ứng dụng
  • %line – dòng thứ mấy
  • %method – tên method lưu log

Mấy cái trên là mấy cái hay dùng nhứ. Nó còn đủ các loại nữa nữa cơ nào là location (thích hợp Debug mode: log tên method, vị trí dòng lỗi….), username (lấy thông tin WindowsIdentity), identity (láy thông tin từ Principal.Indentity.Name), cắt chuỗi bla bla. Mình giới thiệu mấy cái trên thôi vì anh em cũng phải lưu ý khi sử dụng những cái này nó sẽ ảnh hưởng đến hiệu năng của ứng dụng khá nhiều, không nên lạm dụng quá :v Cái gì quá cũng không tốt mà (trừ lắm tiền quá =)))

Đến đây chắc nhiều đồng dâm cũng thấy được là có mỗi mấy cái cấu hình mà mệt bà cố ra 😐 Cấu hình như thế hỏi sao toàn để ALL là đúng rồi :v  Đỡ phải suy nghĩ nhiều

Mà thế đã là hết đâu. Thằng log4net có còn cung cấp cho anh em cả tính năng là Filter trong appender nữa cơ. Với thằng Filter thì anh em có thể xác định được level log và có thể lọc các keyword trong những đoan mà mình lgo ra :v  Mấy cái này thì thực ra mình cũng chưa dùng nên thôi không dám chém gió qua mặt anh em trong thiên hạ :v

À tí nữa quên là có thể sử dụng log4net để log thẳng vào DB. Vi diệu lắm :v Log mọi loại DB luôn mới ghê. Đúng là soái ca của lòng em, không bao giờ làm em thất vọng. Anh em muốn log gì cứ xem theo đường dẫn

http://logging.apache.org/log4net/release/config-examples.html

guillermoochoa10_1

Chốt

Qua bài viết này mình muốn gửi gắm đến anh em nhiều điều về việc sử dụng tool cho đến nơi đến chốn :v Không nên sử dụng mà không hiểu rõ về nó 😦 Như thế mình sẽ tận dụng không hết sức mạnh của phần mềm, điều đó thật là lãng phí 😦 Tâm tư này được mình nói đến trong bài viết  Ngôn tình: Hóa ra em vẫn ở đây anh em tiện thì ghé lại

PS: Sau này mình sẽ tìm hiểu thêm về thằng FILTER để bổ sung thêm cho anh em nhé :v

THAM KHẢO

http://logging.apache.org/log4net/

http://tek.eten.vn/su-dung-log4net-trong-c

 

Advertisements

6 thoughts on “Đừng sợ anh đau lòng log4net

  1. mình chủ yếu làm bên Java thôi. Bên Java thì có thằng Redis làm khá tốt, ko biết bên .Net thế nào, tò mò thôi 😀

    Like

  2. ý mình đang hỏi nó có hỗ trợ cơ chế balancing không đó :D, đang làm trên hệ thống phân tán mà gom lại là sao 😀

    Like

    • mình thấy có thằng logtash kết hợp cùng elastic search để triển khai cho hệ thống phân tán. bạn xem thử xem

      Like

  3. Cho mình hỏi là nếu ứng dụng của mình được deploy trên nhiều instance của nhiều con server (ứng dụng bự) thì mình config nó ghi log như nào, cái này có hỗ trợ không. Trước mình làm hệ thống có 3, 4 instance mà nó ghi như sau:
    12:00:00 -> instance 1
    12:00:01 -> instance 2
    12:00:02 -> instance 3
    Hồi đó chỉ biết vào search log trace lỗi thôi chứ hiểu gì hết 😀

    Like

    • Nếu bạn log nhiều máy thì sao ko long vào db như link mình đưa ấy. Sử dụng ado.net để lưu log db. Ngoài ra bạn có thể để 1 server có share thư mục để nó log chung vào đó :3 cái này thì lưu ý phần quyền cho log4net

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s