Log4Net Ghi nhật ký của hai cấp độ khác nhau vào hai trình phụ khác nhau cho cùng một trình ghi nhật ký


77

Chúng tôi có hai ứng dụng asp.net khác nhau có bật tính năng ghi nhật ký Log4net. Cả hai đều có cùng phiên bản Log4Net, 1.2.10.0.

Chúng tôi đã thêm trình log4net.Appender.AdoNetAppenderghi nhật ký vào cả hai và muốn ghi cấp Thông tin vào nó cho trình ghi gốc, nhưng cũng muốn ghi vào cấp Lỗi đối với trình ghi gốc vào trình duyệt tệp. Cấu hình của chúng tôi như sau;

<?xml version="1.0" encoding="utf-8"?>

<log4net>
    <appender name="filelogAppender" type="log4net.Appender.RollingFileAppender" >
        <file value="..\logs\app.debug.log" />
        <encoding value="utf-8" />
        <staticLogFileName value="true" />
        <datePattern value=".yyyyMMdd.'log'" />
        <rollingStyle value="Composite" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <appendToFile value="true" />
        <maximumFileSize value="1MB" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%3thread] %-5level %property{log4net:HostName} [%property{Revision}] %logger %message%n" />
        </layout>
    </appender>
    <!--    
        use [DB]
        GO
        CREATE TABLE [dbo].[Log] (
            [Id] [int] IDENTITY (1, 1) NOT NULL,
            [Date] [datetime] NOT NULL,
            [Application][varchar] (255) NOT NULL,
            [Thread] [varchar] (255) NOT NULL,
            [Level] [varchar] (50) NOT NULL,
            [Logger] [varchar] (255) NOT NULL,
            [Server][varchar](255) NOT NULL,
            [Revision][varchar](50) NOT NULL,
            [Message] [varchar] (4000) NOT NULL,
            [Exception] [varchar] (2000) NULL
        )
    -->
    <appender name="dbLogAppender" type="log4net.Appender.AdoNetAppender" xdt:Transform="InsertBefore(/log4net/root)">
        <bufferSize value="100" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="data source=sqlserver;initial catalog=DB;integrated security=false;persist security info=True;User ID=USER;Password=PASSWORD" />
        <commandText value="INSERT INTO Log ([Date],[Application],[Thread],[Level],[Logger],[Server],[Revision],[Message],[Exception]) VALUES (@log_date,'WebApp1', @thread, @log_level, @logger, @server, @revision, @message, @exception)" />
        <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
            <parameterName value="@thread" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%thread" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@log_level" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%level" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%logger" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@server" />
            <dbType value="String" />
            <size value="255" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{log4net:HostName}"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@revision" />
            <dbType value="String" />
            <size value="50" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{Revision}"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@exception" />
            <dbType value="String" />
            <size value="2000" />
            <layout type="log4net.Layout.ExceptionLayout" />
        </parameter>
    </appender>
    <root>
        <level value="Error"/>
        <appender-ref ref="filelogAppender"/>
    </root>
    <root>
        <level value="Info"/>
        <appender-ref ref="dbLogAppender"/>
    </root>
</log4net>  

Vấn đề mà chúng tôi đang thấy là đối với một ứng dụng, chúng tôi thấy các mục nhập trong DB, nhưng đối với ứng dụng khác thì không.

RevisionGlobalContexttài sản chúng tôi đặt Application_Start()trong cả hai ứng dụng. Và sự khác biệt duy nhất giữa hai cấu hình là chúng ta có một giá trị mã hóa cứng khác nhau Application.

Chúng ta có thể có hai trình ghi gốc như thế này không? Đây có thể là nguồn gốc của vấn đề mà chúng ta đang gặp trong một ứng dụng?

Câu trả lời:


123

Bạn sẽ có thể đặt thuộc thresholdtính của từng appender riêng biệt và bao gồm chúng trong cùng một gốc.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender">
  <threshold value="Error" />
</appender>
<appender name="dblogAppender" type="log4net.Appender.AdoNetAppender">
  <threshold value="Info" />
</appender>
<root>
  <appender-ref ref="filelogAppender" />
  <appender-ref ref="dblogAppender" />
</root>

tài liệu tham khảo


38

Bạn có thể chỉ định a LevelRangeFiltercho từng phần phụ và xác định từng phần tử trong thư mục gốc để đăng nhập ở các cấp độ khác nhau.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender" >
    <!--File Details/Layout Options-->
    <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO"/>
    </filter>
</appender>
<appender name="dbLogAppender" type="log4net.Appender.AdoNetAppender">
    <!--SQL Options-->      
    <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR"/>
    </filter>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="filelogAppender" /> <!--Prints info, warn, error, or fatal logs. -->
    <appender-ref ref="dbLogAppender" />   <!--Prints only error or fatal logs. -->
</root>

1
Một câu trả lời tuyệt vời! Và cung cấp tính linh hoạt mà tôi hoàn toàn không biết. Tôi nghĩ rằng tôi sẽ sử dụng câu trả lời @barry vì tôi không cần xác định phạm vi chỉ là một ngưỡng.
graney,

Vì một số lý do mà nút "ngưỡng" và "người đánh giá" không hoạt động đối với tôi, nhưng điều này đã làm được (tôi đã chỉ định levelMin và levelMax là cùng một giá trị).
Anssssss

Tôi chỉ gặp sự cố với thực tế là một khi levelMin được sử dụng trong appender, nó phải được chỉ định trong tất cả các appenders nếu không quá trình lọc không hoạt động bình thường trong trường hợp của tôi và chỉ cấp root mới được tính đến.
Honza P.

1

Hai <root>phần tử không được phép.

Từ tài liệu :

root     Optional element, maximum of one allowed. Defines the configuration of the root logger.

Tuy nhiên, bạn có thể có một trình ghi gốc như bạn làm, và sau đó có một trình ghi nhật ký riêng được chỉ định bởi một không gian tên.

<root>
    <level value="Error"/>
    <appender-ref ref="filelogAppender"/>
</root>
<logger name="MyCompany.MyApp.Namespace">
    <level value="Info"/>
    <appender-ref ref="dbLogAppender"/>
</logger>

1
Tuy nhiên, chúng tôi muốn đăng nhập gốc vào hai vị trí. Chúng tôi không muốn giới hạn việc ghi nhật ký một không gian tên cụ thể. Do đó, nỗ lực của chúng tôi trong việc sử dụng hai trình ghi gốc. [Điều kỳ lạ hoạt động trên một trong các ứng dụng] Nếu không, chúng tôi sẽ cần tạo rất nhiều trình ghi nhật ký cho mỗi vùng tên gốc có thể có additivityđược đặt thành false.
graney

0

Chỉ cần sử dụng Trình đánh giá, bạn không cần phải đưa ra ngưỡng trong tất cả các trình phụ.

<appender name="filelogAppender" type="log4net.Appender.RollingFileAppender">
        <evaluator type="log4net.Core.LevelEvaluator">
          <threshold value="ERROR" />
  </evaluator>
</appender>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.