NLog - Как добавить запятую после каждого документа JSON регистрации?

Используя NLog, как добавить запятую после каждого сообщения Json, подобного этому?

{ "time": "2022-10-12", "name": "Index", "level": "ERROR", "message": "Hello Logging" }

,  <-----

{ "time": "2022-10-12", "name": "Index", "level": "ERROR", "message": "Hello Logging" }

Вот nlog.config

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

<nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
      autoReload = "true"
      internalLogLevel = "Error"
      internalLogFile = "c:\\LogFiles\TasksInternalLog.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
            <add assembly = "NLog.Web.AspNetCore"/>
    </extensions>


    <variable name = "newDoc" value = ","/>
    
    <targets>
        <target xsi:type = "File" name = "tasksJsonFile" fileName = "c:\\logFiles\\json-${shortdate}.log">

            <layout xsi:type = "JsonLayout" includeAllProperties = "false">
                <attribute name = "time" layout = "${longdate}" />
                <attribute name = "name" layout = "${callsite}" />
                <attribute name = "level" layout = "${level:upperCase=true}"/>
                <attribute name = "message" layout = "${message}" />
                <!--<layout xsi:type = "TextLayout" includeAllProperties = "false" delimiter = "Comma" withHeader = "false">
                    ${newDoc}
                </layout>-->
            </layout>
            <layout xsi:type = "TextLayout" includeAllProperties = "false" delimiter = "Comma" withHeader = "false">
                
                ,
            </layout>

        </target>


    </targets>

    <rules>
        <logger name = "Microsoft.*" minlevel = "Info" final = "true" />
        <logger name = "*" minlevel = "Info" writeTo = "tasksJsonFile" />
        
    </rules>
</nlog>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать составной шаблон, чтобы включить макет json и простой текстовый макет с ,.

Взгляните на пример: https://github.com/NLog/NLog/wiki/CompoundLayout#from-xml

<target name='file' type='File' fileName='log.txt'>
  <layout type='CompoundLayout'>
    <layout type='SimpleLayout' text = "myAmazingText: " />
    <layout type='JsonLayout'>
      <attribute name='time' layout='${longdate}' />
      <attribute name='level' layout='${level:upperCase=true}'/>
    </layout>
  </layout>
</target>

поэтому для вашего случая это будет что-то вроде:

<target xsi:type = "File" name = "tasksJsonFile" fileName = "c:\\logFiles\\json-${shortdate}.log">
  <layout type='CompoundLayout'>
    <layout xsi:type = "JsonLayout" includeAllProperties = "false">
      <attribute name = "time" layout = "${longdate}" />
      <attribute name = "name" layout = "${callsite}" />
      <attribute name = "level" layout = "${level:upperCase=true}"/>
      <attribute name = "message" layout = "${message}" />
    </layout>
    <layout type='SimpleLayout' text = "," />
  </layout>
</target>

Не могли бы вы улучшить свой ответ, включив соответствующие части связанного контента на случай, если ссылка перестанет работать в будущем?

orhtej2 12.10.2022 10:50

точно скопировал образец

Can Bilgin 12.10.2022 10:52

Образец, похоже, не решает проблему, указанную в ОП.

orhtej2 12.10.2022 11:00

не уверен, что понимаю комментарий здесь, вы хотите, чтобы я создал полный xml и передал его пользователю, который задал вопрос. Я предлагаю ему взглянуть на образец, пример составного шаблона добавляет простой текст в начало json, он должен использовать аналогичную стратегию, чтобы добавить запятую после шаблона json... не могли бы вы уточнить?

Can Bilgin 12.10.2022 11:10

здесь добавлен дополнительный образец

Can Bilgin 12.10.2022 11:14

Мне не нужно делать что-либо еще в это время. Я попробовал это, и это сработало нормально. Спасибо

Costa 12.10.2022 13:45

Другие вопросы по теме

Power bi, как инициализировать учетные данные клиента службы в .net sdk
Как динамически определить в Blazor, что одна кнопка имеет другую форму?
Получение ошибки при попытке обновить сведения о пользователях с помощью EF Core
Как создать проект ASP.NET Core MVC в Visual Studio с предварительно установленными пакетами NuGet и папкой данных
Ошибка: невозможно вставить явное значение для столбца идентификации в таблице в BackgroundServices
Нет ошибки привязки, когда требуемое свойство отсутствует в минимальном API
Асинхронный метод не работает в соответствии со спецификацией, когда он вызывается из конструктора формы (.NET6 Win10 C#)
Как получить JWT в приложении Blazor Server с Microsoft Identity Platform (AAD), чтобы сделать внешний вызов управления API и авторизоваться с помощью jwt
Как использовать Apache Tika Server 2.5 в качестве API и вызывать это в .net6?
Фильтр действий не переопределяет действие контроллера?