2

I want to use an log4j-Appender multiple times, but with different filenames:

Appender:

<RollingFile name="MODULE" fileName="log/module-${ModuleName}.log" append="true" filePattern="log/module-${ModuleName}-%d{yyyy-MM-dd}_%i.log" >
    <PatternLayout pattern="%d{yyyy/MM/dd-HH:mm:ss} %-5p %C:%M:%L ~ %m%n"/>
    <Policies>
        <OnStartupTriggeringPolicy />
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="100MB"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

Loggers:

<Logger name="MOD1" level="debug">
    <Properties>
        <Property name="ModuleName">MOD1</Property>
    </Properties>
    <appender-ref ref="MODULE"/>
</Logger>
<Logger name="MOD2" level="error">
    <Properties>
        <Property name="ModuleName">MOD2</Property>
    </Properties>
    <appender-ref ref="MODULE"/>
</Logger>

But this don't work. How can I pass a Variable from the Logger to the Appender? Finally I want 2 Files

/log/module-MOD1.log <- Debug messages from MOD1
/log/module-MOD2.log <- Error messages from MOD2

Thanks for any help

Burner
  • 981
  • 19
  • 41
  • I solved my Problem, by coding an own Log4j Plugin. Its easy: https://stackoverflow.com/questions/31342950/log4j2-lookup-plugin-strlookup-to-resolve-threadname-for-routing-rollinglogf – Burner May 07 '20 at 13:04

1 Answers1

0

Just add another Appender and connect Logger and Appender each pair.

For example :

...
<RollingFile name="MODULE1" fileName="./log/module1-${ModuleName}.log" append="true" filePattern="./log/module1-${ModuleName}-%d{yyyy-MM-dd}_%i.log" >
    <PatternLayout pattern="%d{yyyy/MM/dd-HH:mm:ss} %-5p %C:%M:%L ~ %m%n"/>
    <Policies>
        <OnStartupTriggeringPolicy />
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="100MB"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

<RollingFile name="MODULE2" fileName="./log/module2-${ModuleName}.log" append="true" filePattern="./log/module2-${ModuleName}-%d{yyyy-MM-dd}_%i.log" >
    <PatternLayout pattern="%d{yyyy/MM/dd-HH:mm:ss} %-5p %C:%M:%L ~ %m%n"/>
    <Policies>
        <OnStartupTriggeringPolicy />
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        <SizeBasedTriggeringPolicy size="100MB"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>
...

...
<Logger name="com.foo.bar.ClassName1" level="debug">
    <Properties>
        <Property name="ModuleName">MOD1</Property>
    </Properties>
    <appender-ref ref="MODULE1"/>
</Logger>
<Logger name="com.foo.bar.ClassName2" level="error">
    <Properties>
        <Property name="ModuleName">MOD2</Property>
    </Properties>
    <appender-ref ref="MODULE2"/>
</Logger>
...

There was a same ask so I replied there too. so, please visit here.

Han
  • 263
  • 1
  • 8
  • Yes, it's a dirty Solution. I don't like this. I have much more Modules and I don't want to Copy & Paste all. And if I must change some settings in the appender, so I must do it on all. This is not good work. – Burner May 06 '20 at 11:33
  • @Burner Ah~ I understand what you want. then, How about 'RoutingAppender`? In my case, use it like this. `...` [Reference Link](https://stackoverflow.com/questions/61581068/unable-to-separate-log-file-on-log4j2/61586352#61586352) I answered this link too. – Han May 06 '20 at 23:15
  • Yes! But without Java-Code to set the Variable. I want to set the Variable in the logger. I read something that the variable ${event.logger} exists, to get the loggername. But this don't work. – Burner May 07 '20 at 10:01