Giải quyết lỗi log4net không ghi được vào MDB trên Windows XP

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:

  1. Cấu hình trong App.config/Web.config:

    Thêm khóa log4net.Internal.Debug với giá trị true vào phần appSettings:

    
    <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 log4net của file cấu hình, hãy thêm thuộc tính debug="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>
            
  2. Thiết lập Trace Listener:

    Trong phần system.diagnostics của file cấu hình, thêm một TextWriterTraceListener để 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:\temp phả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:

  1. Tải mã nguồn của log4net (ví dụ: log4net-2.0.8-src.zip) từ trang chủ.
  2. 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).
  3. Nếu gặp lỗi thiếu tham chiếu (ví dụ: nunit.framework trong 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ộ.
  4. 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).
  5. Sử dụng phiên bản log4net.dll nà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.

Thẻ: Log4net Windows XP MDB AdoNetAppender TypeLoadException

Đăng vào ngày 29 tháng 7 lúc 20:57