Khi sử dụng thư viện log4net để ghi log vào cơ sở dữ liệu Access (.mdb), ứng dụng hoạt động bình thường trên Windows 7 nhưng lại gặp lỗi trên Windows XP. Cụ thể, file MDB được tạo ra nhưng không có dữ liệu được ghi vào.
Để chẩn đoán vấn đề, log4net cung cấp cơ chế gỡ lỗi nội bộ. Bạn có thể kích hoạt nó theo các cách sau:
-
Cấu hình trong App.config/Web.config:
Thêm khóa
log4net.Internal.Debugvới giá trịtruevào phầnappSettings:<configuration> <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration>Hoặc nếu bạn cấu hình log4net trực tiếp trong phần
log4netcủa file cấu hình, hãy thêm thuộc tínhdebug="true":<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net debug="true"> <appender name="AllRollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> ... </appender> </log4net> </configuration> -
Thiết lập Trace Listener:
Trong phần
system.diagnosticscủa file cấu hình, thêm mộtTextWriterTraceListenerđể ghi thông báo gỡ lỗi của log4net ra file:<system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\temp\log4net_debug.txt" /> </listeners> </trace> </system.diagnostics>Lưu ý: Thư mục
C:\tempphải tồn tại trước khi chạy chương trình.Nếu cấu hình trên không hoạt động trong trường hợp cấu hình log4net tùy chỉnh bằng code, bạn có thể thêm listener bằng code:
System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.Listeners.Add( new System.Diagnostics.TextWriterTraceListener("C:\\temp\\log4net_debug.txt"));
Sau khi kích hoạt tính năng gỡ lỗi, khi ứng dụng ghi log, file log4net_debug.txt sẽ hiển thị thông báo lỗi chi tiết. Trong trường hợp này, lỗi nhận được là:
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed in DoAppend
System.TypeLoadException: Could not load type 'System.Security.Claims.ClaimsIdentity' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
at log4net.Core.LoggingEvent.get_UserName()
at log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags)
at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent)
at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
Lỗi System.TypeLoadException: Could not load type 'System.Security.Claims.ClaimsIdentity' cho thấy rằng lớp System.Security.Claims.ClaimsIdentity, vốn có trong .NET Framework 4.5, không được tìm thấy. Windows XP chỉ hỗ trợ tối đa .NET Framework 4.0, do đó không thể tải loại này.
Các bản vá cho .NET Framework 4.0 hoặc các bản cập nhật hệ thống không giải quyết được vấn đề này. Nguyên nhân cốt lõi là do bạn đang sử dụng phiên bản log4net.dll được biên dịch cho .NET Framework 4.5 hoặc cao hơn trong môi trường .NET Framework 4.0.
Giải pháp:
- Tải mã nguồn của log4net (ví dụ:
log4net-2.0.8-src.zip) từ trang chủ. - Giải nén và mở file giải pháp (
.sln) tương ứng với phiên bản Visual Studio bạn đang sử dụng (ví dụ:log4net.vs2010.sln). - Nếu gặp lỗi thiếu tham chiếu (ví dụ:
nunit.frameworktrong project test), hãy gỡ bỏ project test đó khỏi giải pháp rồi biên dịch lại toàn bộ. - Sau khi biên dịch thành công, tìm đến thư mục chứa file DLL đã biên dịch lại (ví dụ:
...\build\bin\net\4.0\debug). - Sử dụng phiên bản
log4net.dllnày (được biên dịch cho .NET Framework 4.0) trong dự án của bạn.
Sau khi thay thế bằng DLL đã biên dịch lại cho .NET 4.0, vấn đề ghi log vào MDB trên Windows XP sẽ được giải quyết.