Вопрос по logging, log4net, c# – Включать заголовок только один раз в начале файла

8

Можно ли включить информацию заголовка только в начало файла?

У меня есть следующий файл конфигурации:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="d:\temp\TTTest.log"/>
            <layout type="log4net.Layout.PatternLayout">
                <header value="[Header]&#13;&#10;" />
                <param name="ConversionPattern" value="%-25utcdate{dd/MM/yyyy HH:mm:ss.fff}%-20property{log4net:HostName}%-30logger%-30thread%-7level%message%newline"/>
            </layout>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
            <maximumFileSize value="5MB"/>
            <rollingStyle value="Size"/>
            <maxSizeRollBackups value="-1"/>
            <countDirection value="1"/>
        </appender>

Когда я запускаю свое приложение, например, дважды, я получаю информацию заголовка дважды, например,

 [Header] 
 The Log line
 [Header]
 The Log line 
 etc

Я стремлюсь достичь следующего:

 [Header] 
 The Log line
 The Log line 
 etc

Ваш Ответ

3   ответа
0

Вам нужен специальный appender, который наследуется от RollingFileAppender. Смотрите пост ниже.

Log4net - Как узнать, когда файл катится?

По сути, вам нужно предоставить свою собственную логику в пользовательском приложении, чтобы записать свой заголовок в каждый новый файл. Вы, вероятно, сделаете это в RollOverSize. Было бы неплохо получить копию исходного кода log4net для справки.

2

Создайте конкретную реализацию log4net.Layout.PatternLayout:

namespace MyApplication
{
    using log4net.Layout;

    public class MyConcretePatternLayout : PatternLayout
    {
        public override string Header => "My Header text here"
    }
}

Измените файл log4net.config, чтобы использовать этот новый макет пользовательского шаблона:

    <appender name="MyFileAppender" type="log4net.Appender.RollingFileAppender">
      ...
      <layout type="MyApplication.MyConcretePatternLayout">
        <conversionPattern...
      </layout>

    </appender>

Теперь, когда файл катится из-за ваших критериев, вы должны увидеть & quot; Текст моего заголовка здесь & quot; в верхней части каждого файла.

11

Я обнаружил, что для этого проще всего создать класс, который наследуется от RollingFileAppender и перезаписывает, например, метод WriteHeader:

using System.IO;
using System.Text;
using log4net.Core;
using log4net.Layout;
using log4net.Util;
using log4net.Appender;

namespace CsvLogging
{
    public class HeaderOnceAppender : RollingFileAppender 
    {
        protected override void WriteHeader()
        {
            try
            {
                if (LockingModel.AcquireLock().Length == 0)
                {
                    base.WriteHeader();
                }
            }
            finally
            {
                LockingModel.ReleaseLock();
            }
        }
    }
}

затем используйте этот класс как appender:

<appender name="CsvFileAppender" type="CsvLogging.HeaderOnceAppender">
Мне также нужно было добавить сборку для типа, так как log4net не знала, где искать & appt name = & quot; CsvFileAppender & quot; type = & quot; CvsLogging.HeaderOnceAppender, CvsLoggingAssembly & quot; & gt;

Похожие вопросы