[ 
https://issues.apache.org/jira/browse/LOG4NET-186?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12682357#action_12682357
 ] 

Ron Grabowski commented on LOG4NET-186:
---------------------------------------

I believe you're highlighting the verboseness of  reusing a converter across 
multiple parameters: 

<parameter>
 <parameterName value="@password" />
 <dbType value="String" />
 <layout type="log4net.Layout.PatternLayout">
  <converter>
   <name value="encrypt" />
   <type value="Company.Logging.EncryptConverter, Company.Logging" />
  </converter>
  <conversionPattern value="%encrypt{Password}" />
 </layout>
</parameter>
<parameter>
 <parameterName value="@creditCardNumber" />
 <dbType value="String" />
 <layout type="log4net.Layout.PatternLayout">
  <converter>
   <name value="encrypt" />
   <type value="Company.Logging.EncryptConverter, Company.Logging" />
  </converter>
  <conversionPattern value="%encrypt{CreditCardNumber}" />
 </layout>
</parameter>

Exposing s_globalRulesRegistry might help from a code perspective but it isn't 
going to help with the more typical XML configuration. Your idea of specifying 
the converter once and reusing it across all parameters makes sense. While 
we're at it, lets take out some of the verboseness of having to specify the 
PatternLayout:

<converter>
  <name value="encrypt" />
  <type value="Company.Logging.EncryptConverter, Company.Logging" />
</converter>
<patternLayoutParameter>
  <parameterName value="@password"/>
  <dbType value="String" />
  <conversionPattern value="%encrypt{Password}" />
</patternLayoutParameter>
<patternLayoutParameter>
  <parameterName value="@creditCardNumber"/>
  <dbType value="String" />
  <conversionPattern value="%encrypt{CreditCardNumber}" />
</patternLayoutParameter>

To support that syntax I've extending AdoNetAppender to capture the converter 
items:

    public class PatternLayoutAdoNetAppender : AdoNetAppender
    {
        private readonly List<ConverterInfo> converters = new 
List<ConverterInfo>();

        public void AddConverter(ConverterInfo converterInfo)
        {
            converters.Add(converterInfo);
        }
    }

I also extended AdoNetAppenderParameter with a class that accepts a 
conversionPattern:

        public class PatternLayoutAdoNetAppenderParameter : 
AdoNetAppenderParameter
        {
            private string conversionPattern;

            public string ConversionPattern
            {
                get { return conversionPattern; }
                set { conversionPattern = value; }
            }
        }

This last snippet of code wires up the <patternLayoutParameter /> nodes. It 
takes the conversionPattern value and converts it into a format that the 
AdoNetAppender understands: 

        public void 
AddPatternLayoutParameter(PatternLayoutAdoNetAppenderParameter parameter)
        {
            PatternLayout patternLayout = new 
PatternLayout(parameter.ConversionPattern);
            addConveters(patternLayout);
            patternLayout.ActivateOptions();

            parameter.Layout = new Layout2RawLayoutAdapter(patternLayout);
            m_parameters.Add(parameter);
        }

        private void addConveters(PatternLayout patternLayout)
        {
            foreach (ConverterInfo conveterInfo in converters)
            {
                patternLayout.AddConverter(conveterInfo);
            }
        }

You can also mix and match <patternLayoutParameter /> and <parameter /> nodes. 
I'll add the complete class with some test cases to the example appender area 
in /trunk.

> PatternLayout and globalRulesRegistry
> -------------------------------------
>
>                 Key: LOG4NET-186
>                 URL: https://issues.apache.org/jira/browse/LOG4NET-186
>             Project: Log4net
>          Issue Type: Improvement
>          Components: Core
>    Affects Versions: 1.2.10
>            Reporter: Sergey
>   Original Estimate: 0.17h
>  Remaining Estimate: 0.17h
>
> Hi, i have suggestion. 
> Make for private static field PatternLayout.s_globalRulesRegistry public 
> static accessor. Because if i want append custom PatternLayoutConverter, i 
> need add him to each PatternLayout for each Appender. 
> I am using AdoNetAppender, which creates PatternLayout for each parameter. 
> And i must append my PatternLayoutConverter to each param. I think, if i have 
> static property or method for adding PatternLayoutConvertor - its will be 
> more simple for use.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to