'How to log the level as a single letter in log4net?

Is there a way to change this configuration:

<appender name="appender" type="log4net.Appender.RollingFileAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] [%-5level] %logger - %message%newline" />
  </layout>
</appender>

... to log the log-level as a single letter like this:

DEBUG -> D
INFO  -> I
WARN  -> W
ERROR -> E
FATAL -> F

I tried %-1level but the number only controlls the number of characters to which to fill up with spaces. ([%-5level] means [INFO ] instead of [INFO]) So [%-1level] gave me [INFO] instead of the expected [I].

My ideas so far:

Variante 1

I could configure a separate appender for each level where the level letter is set fixed for each level, all logging to the same file:

<appender name="info-appender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logfile.log" />
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="INFO" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] [I] %logger - %message%newline" />
  </layout>
</appender>
<appender name="warn-appender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logfile.log" />
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="WARN" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] [W] %logger - %message%newline" />
  </layout>
</appender>
.
.
<root>
  <level value="ALL" />
  <appender-ref ref="debug-appender" />
  <appender-ref ref="info-appender" />
  <appender-ref ref="warn-appender" />
  <appender-ref ref="error-appender" />
  <appender-ref ref="fatal-appender" />
</root>

Variante 2

I guess one could extend the log4net.Appender.RollingFileAppender and override the render method or if possible some other internal method which renders the level. (have not checked if thats really possible)

Question:

Is there an easier way to achive this? (just with configuration)



Solution 1:[1]

See the document: https://logback.qos.ch/manual/layouts.html

You can do it easily by formatter:

%.-1level

Although, the usage of negative numbers is strange here.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Calarpo