Как я регистрирую пользовательский IObjectRenderer в log4net?

Вы можете использовать модификатор g в конце регулярного выражения для замены всех вхождений сопоставления с образцом.

Общий пример

{one:"1",two:"2",three:"3",one:"one",plz:"nope"}

Я хочу заменить все после one на "42". Без глобального модификатора я получаю такой результат:

$ sed -E 's/one:[^,]+/one:"42"/' foo.txt
{one:"42",two:"2",three:"3",one:"one",plz:"nope"}

Обратите внимание, что второй экземпляр one: не изменился. Теперь с модификатором g:

$ sed -E 's/one:[^,]+/one:"42"/g' foo.txt
{one:"42",two:"2",three:"3",one:"42",yas:"nope"}

, который заменяет все вхождения.

Ваш конкретный случай

Вставьте это в файл, который может называться replacer.sh:

#!/usr/bin/env bash

# declare `swap` to be an associative array
declare -A swap

swap[appVersion]='"1.4-beta"'
swap[buildNr]='"20190118.1"'
swap[production]="!"
swap[tracking]="!0"
swap[apiHost]='"\/api-2\/"'
swap[foo]='"bar"'

FILE=$1

for key in ${!swap[@]}; do sed -E -i 'bak' "s/${key}:[^,]+/${key}:${swap[${key}]}/g" $FILE; done

Измените ключи и значения в переменной swap так, чтобы вам было нужно. Дело имеет значение, и избежать каких-либо обратной косой черты в ценностях.

Если вам нужно заменить больше вещей, вы можете просто добавить больше пар ключ / значение. Цикл будет перебирать все ключи, применяя изменения по порядку.

sed может автоматически создавать файлы резервных копий с флагом -i; Я думаю, что они могут сорваться во время каждой итерации цикла - будьте осторожны.

Запустите программу так: $ ./replacer.sh filename.js

Надеюсь, это поможет!

9
задан Skami 7 August 2018 в 10:19
поделиться

1 ответ

Я ввел по абсолютному адресу вокруг с ним некоторые при записи вопроса и придумал это:

using System.IO;
using log4net;
using log4net.Config;
using log4net.ObjectRenderer;
using log4net.Util;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BasicConfigurator.Configure();

            ILog log = LogManager.GetLogger(typeof(Program));
            var repo = LogManager.GetRepository();
            repo.RendererMap.Put(typeof(Foo), new FooRenderer());

            var fooInstance = new Foo() { Name = "Test Foo" };
            log.Info(fooInstance);
        }
    }

    internal class Foo
    {
        public string Name { get; set; }
    }

    internal class FooRenderer : log4net.ObjectRenderer.IObjectRenderer
    {
        public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
        {
            if (obj == null)
            {
                writer.Write(SystemInfo.NullText);
            }

            var fooInstance = obj as Foo;
            if (fooInstance != null)
            {
                writer.Write("", fooInstance.Name);
            }
            else
            {
                writer.Write(SystemInfo.NullText);
            }
        }
    }
}

Я не уверен - ли это корректный способ сделать это, но я действительно знаю, что он работал.

10
ответ дан 4 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

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