|
I/ Log4net là gì?
-
Log4net là một công cụ giúp người lập trình ghi lại những thông tin
trong lúc chạy ứng dụng. Nó chính là một phiên bản chuyển thể từ log4j
và vẫn tiếp tục được phát triển kể từ năm 2001. Trong trường hợp ứng
dụng của bạn có lỗi mà vẫn không tìm được nguyên nhân, log4net có thể
là vị cứu tinh để giúp bạn xác định nơi gây lỗi. Ngoài ra, Log4net còn
có thể thay đổi trạng thái log lúc chương trình 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 performance của ứng dụng, log4net còn được thiết kế với tính
flexibility rất cao, chúng ta có thể mở rộng và thêm thắt những thứ
mình muốn vào thư viện log4net, chẳng hạn như cách thức log, định dạng
log, …
(Các bạn có thể download source code sample ở đây)
II/ Tại sao lại sử dụng log4net – lợi ích của log4net
-
Như tôi nói ở trên, có những trường hợp nếu không có log4net bạn sẽ
không thể nào giải quyết được. Giả sử một ngày đẹp trời bạn kí được hợp
đồng béo bở làm phần mềm cho một khách hàng lớn và khó tính. Vì là một
công ty lớn nên security của họ rất cao. Khi deploy chương trình cho
người ta, bạn phải hẹn trước và phải qua nhiều cửa kiểm tra nghiêm
ngặt. Những máy chỉ được cài đặt chương trình bạn viết cho họ và không
được cài bất cứ cái gì khác. Như vậy khi sử dụng, nếu chương trình của
bạn có lỗi thì làm sao để tìm nguyên nhân? Cùng lắm thì bên khách hàng
sẽ chụp màn hình lỗi hoặc email đại khái cho bạn, và với những thông
tin chung chung như vậy sẽ rất khó để bạn khắc phục. Ngoài ra bạn không
thể cài VS.NET 2005 lên máy khách hàng hoặc tới tận nơi để debug. Nhưng
nếu có sử dụng log4net, thông tin về quá trình chạy sẽ được ghi lại
trên file hoặc thậm chí email cho bạn. Khi đó bạn sẽ dễ dàng tìm hiểu
giải quyết vấn đề trên, và nhanh hay chậm tùy thuộc vào bạn thêm những
đoạn log cụ thể và chính xác như thế nào trong code.
- Thêm một
ví dụ nữa mà tôi đã từng gặp phải, đó là một project liên quan đến
Webservice. Nhóm tôi phải làm một webservice để đọc thông tin trên
server và trả kết quả về phía chương trình desktop. Quá trình đọc và
tính toán dữ liệu trên server khá phức tạp và qua rất nhiều bước và hầu
như không thể debug được. (thực ra là có thể debug được bằng cách sử
dụng remote debugger, nhưng sau này tôi mới biết). Nhờ vào log4net, tôi
ghi lại những bước tính toán, giá trị các biến trong một lần gọi hàm
webservice và từ đó đã fix được khá nhiều bug khó. Dù bạn là một
người kĩ tính đến cỡ nào, bạn giỏi lập trình đến mức nào thì vẫn có thể
có những lúc chương trình tung những exception mà bạn không ngờ đến. Sử
dụng log4net có thể giúp bạn ghi lại những lần bị lỗi như vậy và từ đó
bạn sẽ có cách để fix bug. Hơn nữa cách sử dụng rất dễ và nhanh gọn lẹ
thì tại sao ta lại không sử dụng chứ nhị 
III/ Sử dụng như thế nào?
-
Trong bài viết này, tôi sẽ giới thiệu cách sử dụng log4net cho một
window application và sẽ nói đến cách config cho log4net ghi thông tin
log ra file bằng một file App.config.
Thực ra đối với web application thì cách sử dụng hoàn toàn tương tự.
Chỉ có một số trường hợp file log của bạn không sinh ra được vì không
đủ quyền. Như các bạn biết thì Web application chạy dưới 1 process bằng
quyền của user ASPNET trong Windows, dó đó nếu user này không đủ quyền
ghi file vào folder web của bạn thì file log tương ứng cũng có thể
không được tạo ra. Nếu bạn áp dụng log4net cho trang web của mình, và
thuê 1 host ở VN để đưa code lên nhưng file log không sinh ra, bạn có
thể gọi điện hỗ trợ dịch vụ và nhờ họ thêm permisson cho user ASPNET
quyền ghi file vào folder web của bạn.
1/ Bước 1: Hãy download version mới nhất của log4net từ website apache. và add reference vào project của bạn. Khi tôi viết bài này thì version mới nhất của log4net là 1.2.10.
 2/ Bước 2: Thêm dòng dưới đây vào file AssemblyInfo.cs (Trong folder Property của project)
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4netSample.exe.config", Watch = true)]
- Đây là bước mà tôi thường quên nhất . Thêm đoạn code này vào file assemblyInfo sẽ giúp log4net biết tìm những thông tin cấu hình của nó ở file App.config. Ở đây các bạn thấy là ConfigFile=Log4netSample.exe.config trong khi file config của chúng ta là App.config. Nguyên nhân là do file config của window application sẽ tự động build thành tên_assembly.config. Vì chương trình của tôi khi build ra sẽ là Log4netSample.exe nên tôi sẽ chọn giá trị là Log4netSample.exe.config cho config file. Đối với Web application bạn sẽ set là Web.config vì file config cho web app sẽ không bị đổi tên.
3/Bước 3: Nếu project của bạn chưa có file App.config thì bạn hãy thêm vào file App.config. Đây là file cấu hình cho ứng dụng của bạn. Sau đó bạn thêm những cấu hình dưới đây file file App.config.
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections>
<log4net debug="true">
< appender name=" RollingLogFileAppender" type=" log4net.Appender.RollingFileAppender"> < file value=" Log4netSampleLog.txt" /> < appendToFile value=" true" /> < rollingStyle value=" Size" /> < maxSizeRollBackups value=" 10" /> < maximumFileSize value=" 1MB" /> < staticLogFileName value=" true" /> < layout type=" log4net.Layout.PatternLayout"> <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> </ layout> </ appender> < root> <level value="DEBUG" /> <appender-ref ref="RollingLogFileAppender" /> </ root> </log4net>
Giải thích nội dung file cấu hình:
-Trong
file cấu hình này, tôi sử dụng RollingFileAppender. Có rất nhiều loại
Appender được xây dựng sẵn trong thư viện log4net. Mỗi loại sẽ có công
dụng ghi nội dung log vào một nơi khác nhau. Trong đó
RollingFileAppender là được sử dụng nhiều nhất và cũng dễ sử dụng nhất
:D. Tôi sẽ giải thích những gì tôi nghĩ là khó hiểu nhất 
<file value="Log4netSampleLog.txt">
- Thông
tin log của chúng ta sẽ được ghi vào file Log4netSampleLog.txt, file
này sẽ nằm ở thư mục chạy của ứng dụng, cùng cấp với file exe và file
.config của chúng ta. Nếu muốn nó lưu file vào chỗ khác chúng ta có thể
hardcode đường dẫn ở đây.
<maxsizerollbackups value="10" />
- Dữ
liệu log sẽ được ghi vào file, vì ta đang sử dụng là
RollingFileAppender, nên khi kích thước file vượt quá một mức nào đó
thì nó sẽ đổi tên file cũ và ghi vào file mới. Tổng số lượng file tối
đa sẽ là 10 và những file cũ nhất sẽ bị xóa nếu số lượng file vượt quá
10.
<maximumfilesize value="1MB">
- Kích thước file log tối đa sẽ là 1MB.
Layout:
- Đây
là phần khá thú vị, những text log mà chúng ta ghi ra sẽ kèm thêm một
số thông tin theo như phần định dạng trong layout như ngày tháng,
threadId, className, ... Các bạn có thể tùy biến phần layout này để
được log output dễ nhìn nhất.
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> <layout>
Level:
- Level
mặc định sẽ là Debug cho mọi nơi có sử dụng log trong chương trình của
bạn. Nghĩa là nếu bạn khai báo như hình, thì mọi chỗ bạn log đều được
ghi xuống file vì level DEBUG là level thấp nhất, nhưng nếu chỗ này bạn để là ERROR thì chỉ có những log với level cao hơn hoặc bằng ERROR mới được ghi xuống file. Khi deploy chương trình cho khách hàng, thường thì chúng ta sẽ để level default là ERROR, khi sử dụng có lỗi ta sẽ yêu cầu khách hàng sử lại thành DEBUG nếu cần thiết.
<root>
<level value="DEBUG" /> <appender-ref ref="RollingLogFileAppender" /> </root>
- Thông thường người ta sử dụng full name của class (kèm theo đầy đủ namespace) để dùng như loggerName.
Cách dùng này rất hợp lý vì chúng ta sẽ biết đoạn log của mình sinh ra
từ class nào. Nếu chúng ta không set trong file config, các logger sẽ
thừa hưởng level từ cấp trên nó và level cao nhât là root như trong
hình. Ví dụ bạn có 2 lớp như sau : MyApp.Service.A và MyApp.Service.A.B thì khi đó sẽ có 2 loggerName tương ứng với 2 name space trên và loggger thứ 2 sẽ thừa hưởng level như logger1. Bạn nên tham khảo thêm phần này ở Logger hierarchy.
Có khi chương trình của bạn có sử dụng một library nào đó mà library
này lại có sử dụng log4net, khi đó bạn sẽ có nhu cầu tắt log4net cho
library đó và đây chính là nơi bạn cần chỉnh sửa. (NHibernate là 1 ví dụ về library có sử dụng log4net)
4/Bước 4:
- a) bạn thêm namespace log4net cho những nơi nào cần sử dụng log4net. - b) Sau đó thêm đoạn code dưới đây trong lớp nào có sử dụng log4net
private static readonly ILog _logger = LogManager.GetLogger(typeof(TênLớpCủaBạn).Name);
Hoặc bạn có thể sử dụng cách sau đây nếu thích tổng quát
private static readonly ILog logger = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
5/Bước 5: Trong code của bạn, nơi nào cần log bạn sẽ thêm đoạn code sau đây:
_logger.Debug("Muahahaha");
Hoặc
_logger.Error("Muahahaha");
-
Thật ra để tăng tối đa tốc độ, nhóm tác giả khuyên chúng ta nên khai
báo một biến boolean để kiểm tra xem có cần log hay không, nếu có thì
mới gọi hàm log.
bool isLogEnabled = _logger.IsDebugEnabled;
- Và trong code:
if (isLogEnabled) { _logger.Debug("Muaahahaha");
}
-
Các bạn thấy tôi có sử dụng _logger.Debug và _logger.Error, như vậy
trong trường hợp nào thì sử dụng .Debug, trường hợp nào sử dụng .Error.
Theo tôi thì khi nào cần ghi lại những thông tin sẽ giúp chúng ta phát
hiện lỗi nếu có thì chúng ta dùng .Debug, những nơi chúng ta try catch
Exception thì chúng ta log Error và thông tin log sẽ là StrackTrace của
cái Exception đó.
try {
} catch(Exception ex) {
_logger.Errror(ex); _logger.Errror(ex.Message); }
-
Ngoài Debug và Error, logger còn có các level khác được xếp theo thứ tự
độ ưu tiên. Tùy vào bạn chính config như thế nào mà những đoạn log của
bạn có hiện ra hay không.
IV/ Log4net còn có thể làm gì?
-
Ngoài khả năng ghi những đoạn log vào file, log4net còn có thể ghi
những thông tin log đó vào database, ra console màn hình, email cho
chúng ta, thậm chí net send :D. Ngoài ra, với tính mở rất cao, log4net
còn cho phép người sử dụng kế thừa mở rộng và thêm thắt. Đối với cá
nhân tôi, sử dụng log4net với FileAppender là quá đủ, hiếm khi tôi cần
phải viết thêm. Nhưng ai mà biết được sau này sẽ gặp chuyện gì . Nếu các bạn muốn tìm hiểu thêm về log4net, hãy lên trang web http://logging.apache.org/log4net và nhớ chia sẽ với tôi những gì bạn biết được 
V/ Khi nào tôi nên dùng log4net?
Ngay sau khi đọc bài này 
-
Hi vọng sau khi đọc bài viết này bạn có thể áp dụng log4net nếu chưa
từng sử dụng. Bạn sẽ thấy rằng dùng log4net rất dễ và rất có ích khi ta
áp dụng ngay từ những dòng code đầu tiên. Một số người bạn của tôi
thường đợi đến lúc viết xong mới bắt đầu thêm log4net khi có yêu cầu,
tôi thấy như thế không nên. Theo tôi ta nên tập thói quen sử dụng
log4net đúng lúc đúng chỗ và tự giác
cũng giống như đánh răng và tắm rửa mỗi ngày vậy. Thực ra chúng ta có
thể không tắm vài ngày, không đánh răng cũng được nếu ở một mình vì
chẳng ảnh hưởng đến ai và chẳng ai biết, nhưng đến một lúc nào đó chúng
ta sẽ thấy được lợi ích của việc tự giác. 
Tài liệu tham khảo: http://logging.apache.org/log4net http://www.codeproject.com/KB/aspnet/log4net.aspxTheo
Internet or Some Document Số lượt đọc:
816
-
Cập nhật lần cuối:
14/06/2008 01:56:42 AM | Learn Regular Expression (Regex) syntax with C# and .NET 17/07/2008 10:32' AM Regular Expressions are a powerful pattern matching language that is part of
many modern programming languages. Regular Expressions allow you to apply a pattern
to an input string and return a list of the matches within the text. Regular
expressions also allow text to be replaced using replacement patterns. It is a
very powerful version of find and replace.
Bài đã đăng: Creating Excel XP spreadsheets by using .NET and XML 02/06/2008 04:09' PM Excel XP has a cool feature related to XML as
the product can easily read and write properly-structured XML
documents, run web queries against properly-structured XML data sources
and save entire workbooks as XML spreadsheets. This article
demonstrates one view to the utilization of this feature in .NET,
namely creating a basic spreadsheet that has formulas. Customize site map trong .net 2.0 01/01/1900 12:00' AM Sitemap, là 1 cái mới trong .net hỗ trợ cho dev khá nhiều trong việc build site của mình. Nhưng Site map datasource chỉ làm việc với cái file xml site map. Trong bài viết này sẽ customize lại 1 chút. Cho phép bạn build cái site map riêng của mình 1 cách linh động hơn.
C# - sắp xếp trong listview 02/04/2008 12:49' AM Chúng
ta đều biết rằng Listview có phương Sort để thực hiện việc sắp xếp, tuy
nhiên phương thức này chỉ cho phép sắp xếp theo text mặc định của Item.
Vậy muốn sắp xếp theo text của các cột bất kỳ hoặc theo các quy tắc
riêng của ta thì phải làm thế nào. Layout Manager trong C Sharp. 02/04/2008 12:47' AM Bất
cứ khi nào người lập trình ngồi xuống thiết kế một giao diện, anh ta sẽ
phải đối mặt với một số vấn đề liên quan đến việc thiết kế: yêu cầu
thẩm mỹ, khả năng mở rộng, có thể chuyển đổi kích thước và dễ chỉnh
sửa...
Cách sử dụng chú thích trong C#02/04/2008 12:06' AMTrước
khi có sự ra đời của Dot Net, trong các ngôn ngữ lập trình đều sử dụng
những "Chú Thích" như là một cách để làm rõ ràng cho các khối lệnh của
chương trình. Nhưng bây giờ, với sự ra đời của Dot Net Frameworks, thì
dựa vào những "Chú Thích", bạn có thể tạo ra những tài liệu ứng dụng mà
bạn đang phát triển.
Lập trình thao tác dữ liệu với MySQL Server04/03/2008 06:27' AM
Sử dụng MySQL là một lựa chọn thông minh cho doanh nghiệp để tiết kiệm
chi phí. Bài viết này tôi giới thiệu đến các bạn cách thức thực hiện
thao tác với MySQL từ C#.MySQL
là hệ cơ sở dữ liệu mã nguồn mở nổi tiếng nhất thế giới, đây là hệ cơ
sở dữ liệu với tốc độ truy cập cao, mạnh mẽ, dễ sử dụng. Được sử dụng
bởi nhiều hệ thống lớn như Yahoo, Google, Nokia, YouTube … Việc sử dụng
một hệ cơ sở dữ liệu mã mở, miễn phí giúp tiết kiệm chi phí cho doanh
nghiệp của bạn. Bạn có thể tải và sử dụng miễn phí hệ cơ sở dữ liệu này
thông qua địa chỉ www.mysql.com Khởi tạo ứng dụng Linux đầu tiên với Visual Studio .NET 2003 IDE 05/06/2005 08:12' PM Bài viết "Create your first Linux application with the Visual Studio .NET IDE in 10 minutes" của hãng Mainsoft giới thiệu tổng quan chung về công nghệ Grasshopper giúp cho các ứng dụng .NET có thể chạy trên Unix/Linux. |