You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Remko Popma (JIRA)" <ji...@apache.org> on 2014/01/06 14:59:50 UTC

[jira] [Commented] (LOG4J2-486) RollingFile Appender - add custom info at the start of each logfile

    [ https://issues.apache.org/jira/browse/LOG4J2-486?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13862998#comment-13862998 ] 

Remko Popma commented on LOG4J2-486:
------------------------------------

About the config, please take a look at the manual page on plugins: http://logging.apache.org/log4j/2.x/manual/plugins.html

You need to declare the packages that contain your plugin code in the top-level {{<Configuration>}} element. For example:
{code}
<Configuration status="trace" packages="eeo.toolbox">
...
</Configuration>
{code}

Also, your custom elements are not named by their fully qualified java class name ({{eeo.toolbox.MyRolloverStrategy}} in this case), but instead by their plugin name. So, if your rollover strategy class looks like this:
{code}
@Plugin(name="HeaderFooterRolloverStrategy"  category="Core", printObject=true)
public class MyRolloverStrategy extends DefaultRolloverStrategy {
...
{code}

then in your configuration you would say
{code}
    ...
    <RollingFile ... >
      ...
      <HeaderFooterRolloverStrategy fileIndex="min" max="16"/>
    </RollingFile>
{code}

----
About writing to log files at the time of a rollover, first take a look at {{org.apache.logging.log4j.core.appender.rolling.RollingFileManager#rollover}}.
This shows how the {{RolloverStrategy}} will be used. A {{RolloverStrategy}} returns a {{RolloverDescription}}, which has a synchronous and an asynchronous {{Action}}. If a synchronous action exists it will be executed in the current thread, if an asynchronous action exists it will be executed in a new thread.

So here is where you would implement your custom behaviour. One way I can think of is to extend {{DefaultRolloverStrategy}}, and in the {{rollover}} method first call super, and wrap its result in a {{RolloverDescriptor}} of your own. The asynchronous action of this custom descriptor would simply return the asynchronous action of the original nested descriptor (zipping the old log file), but the synchronous action would be customized. For example, first execute the nested sync action (the file rename), and after that do your custom work to create the new file with your header info. 

> RollingFile Appender - add custom info at the start of each logfile
> -------------------------------------------------------------------
>
>                 Key: LOG4J2-486
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-486
>             Project: Log4j 2
>          Issue Type: Question
>          Components: Appenders
>    Affects Versions: 2.0-beta9
>         Environment: Java 1.7, Linux
>            Reporter: Joe Merten
>         Attachments: MyRolloverStrategy.java, log4j2.xml
>
>
> I post this question here because of a hint of Remko Popma.
> See also:
> * http://apache-logging.6191.n7.nabble.com/log4j2-getting-started-amp-rolling-files-tt8406.html#a42402
> * http://stackoverflow.com/questions/20819376/log4j2-rollingfile-appender-add-custom-info-at-the-start-of-each-logfile
> I want to add some custom info at the top of each logfile, like the version string of my application, the application uptime and the system uptime. And even writing some »bye, bye / eof« to the bottom of the just closed logfile would also be fine.
> Because there is no appropriate hook or callback to get notified when the RollingFileAppander is creating / has created a new file, so that I can put my things at first into these new logfile, I tried to extend DefaultRolloverStrategy. But currently, I stuck at some points.
> Seems that I have to deal with {{@Plugin}} and {{@PluginFactory}}. My try with the attached log4j2.xml and MyRolloverStrategy.java compiles without errors and warnings. But when I start the application, I get this error message:
> {{2014-01-05 23:22:05,876 ERROR RollingFile contains an invalid element or attribute "MyRolloverStrategy"}}
> And then the next step would be: "how to write to the logfiles within my rollover method?"
> log4j2.xml :
> {code}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration>
>   <Properties>
>     <Property name="projectPrefix">Tts</Property>
>     <Property name="rawPattern">%d %-5p [%t] %C{2} (%F:%L) - %m%n</Property>
>     <Property name="coloredPattern">%d %highlight{%-5p}{FATAL=bright red, ERROR=red, WARN=yellow, INFO=cyan, DEBUG=green, TRACE=bright blue} %style{[%t] %C{2} (%F:%L) -}{bright,black} %m%n</Property>
>     <Property name="coloredShortPattern">%d %highlight{%-5p}{FATAL=bright red, ERROR=red, WARN=yellow, INFO=cyan, DEBUG=green, TRACE=bright blue} %style{[%t] -}{bright,black} %m%n</Property>
>     <Property name="fileName">Log/${projectPrefix}.log</Property>
>     <Property name="filePattern">Log/${projectPrefix}-%i.log</Property>
>   </Properties>
>   <Appenders>
>     <Console name="Stdout" target="SYSTEM_OUT">
>       <PatternLayout pattern="${coloredPattern}"/>
>     </Console>
>     <RollingFile name="Logfile" fileName="${fileName}" filePattern="${filePattern}">
>       <PatternLayout pattern="${rawPattern}"/>
>       <Policies>
>         <SizeBasedTriggeringPolicy size="16 MB"/>
>       </Policies>
>       <eeo.toolbox.MyRolloverStrategy fileIndex="min" max="16"/>
>     </RollingFile>
>   </Appenders>
>   <Loggers>
>     <Root level="info">
>       <AppenderRef ref="Stdout"/>
>       <AppenderRef ref="Logfile"/>
>     </Root>
>   </Loggers>
> </Configuration>
> {code}



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org