You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by "Sergey (JIRA)" <ji...@apache.org> on 2008/11/30 16:29:44 UTC

[jira] Created: (LOG4NET-186) PatternLayout and globalRulesRegistry

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


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.


[jira] Commented: (LOG4NET-186) PatternLayout and globalRulesRegistry

Posted by "Ron Grabowski (JIRA)" <ji...@apache.org>.
    [ 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.