Log4j2 RollingFile Appender-在每个日志文件的开头添加自定义信息

Log4j2 RollingFile Appender-在每个日志文件的开头添加自定义信息,第1张

Log4j2 RollingFile Appender-在每个日志文件的开头添加自定义信息

好吧,有一个由像描述扩展DefaultRolloverStrategy这个问题的解决方案的工作在这里。但

  • 它需要大约150行代码(包括包装RolloverDescription和appender.rolling.helper.Action),并且
  • 有点气味,因为需要完全复制DefaultRolloverStrategy的工厂方法(使该解决方案不便于维护,例如,如果DefaultRolloverStrategy在将来的版本中获得更多配置参数)

要让log4j2调用我们的工厂方法,log4j2.xml的根标记必须归于我们的类的包,例如:

<Configuration packages="de.jme.toolbox.logging">...</Configuration>

在我们自己的RolloverStrategy中,我们必须处理

@Plugin
@PluginFactory
如这里所述。

最后,这里是我完整的log4j2.xml(您不需要所有这些属性-这就是我喜欢配置日志记录的方式):

<?xml version="1.0" encoding="UTF-8"?><Configuration packages="de.jme.toolbox.logging">  <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="1 MB"/>      </Policies>      <MyRolloverStrategy fileIndex="min" max="16"/>    </RollingFile>  </Appenders>  <Loggers>    <Root level="info">      <AppenderRef ref="Stdout"/>      <AppenderRef ref="Logfile"/>    </Root>  </Loggers></Configuration>

这里是MyRolloverStrategy.java:

package de.jme.toolbox.logging;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.zip.Deflater;import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;import org.apache.logging.log4j.core.appender.rolling.RolloverDescription;import org.apache.logging.log4j.core.appender.rolling.helper.Action;import org.apache.logging.log4j.core.config.Configuration;import org.apache.logging.log4j.core.config.plugins.PluginAttribute;import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;import org.apache.logging.log4j.core.config.plugins.PluginFactory;import org.apache.logging.log4j.core.helpers.Integers;import org.apache.logging.log4j.core.lookup.StrSubstitutor;import org.apache.logging.log4j.Logger;import org.apache.logging.log4j.status.StatusLogger;@org.apache.logging.log4j.core.config.plugins.Plugin(name="MyRolloverStrategy", category="Core", printObject=true)public class MyRolloverStrategy extends DefaultRolloverStrategy {    protected static final Logger logger = StatusLogger.getLogger();    // ==============================    // ↓↓↓ Some stuff copied from ↓↓↓    // https://svn.apache.org/repos/asf/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java r1556050    // Just changed »DefaultRolloverStrategy« to »MyRolloverStrategy«    private static final int MIN_WINDOW_SIZE = 1;    private static final int DEFAULT_WINDOW_SIZE = 7;    @PluginFactory    public static MyRolloverStrategy createStrategy( @PluginAttribute("max") final String max, @PluginAttribute("min") final String min, @PluginAttribute("fileIndex") final String fileIndex, @PluginAttribute("compressionLevel") final String compressionLevelStr, @PluginConfiguration final Configuration config) {        final boolean useMax = fileIndex == null ? true : fileIndex.equalsIgnoreCase("max");        int minIndex;        if (min != null) { minIndex = Integer.parseInt(min); if (minIndex < 1) {     LOGGER.error("Minimum window size too small. Limited to " + MIN_WINDOW_SIZE);     minIndex = MIN_WINDOW_SIZE; }        } else { minIndex = MIN_WINDOW_SIZE;        }        int maxIndex;        if (max != null) { maxIndex = Integer.parseInt(max); if (maxIndex < minIndex) {     maxIndex = minIndex < DEFAULT_WINDOW_SIZE ? DEFAULT_WINDOW_SIZE : minIndex;     LOGGER.error("Maximum window size must be greater than the minimum windows size. Set to " + maxIndex); }        } else { maxIndex = DEFAULT_WINDOW_SIZE;        }        final int compressionLevel = Integers.parseInt(compressionLevelStr, Deflater.DEFAULT_COMPRESSION);        return new MyRolloverStrategy(minIndex, maxIndex, useMax, compressionLevel, config.getStrSubstitutor());    }    // ↑↑↑ Some stuff copied from ↑↑↑    // ==============================    protected MyRolloverStrategy(int minIndex, int maxIndex, boolean useMax, int compressionLevel, StrSubstitutor subst) {        super(minIndex, maxIndex, useMax, compressionLevel, subst);    }    // Wrapper class only for setting a hook to execute()    static class MyAction implements Action {        final Action delegate;        final String fileName;        public MyAction(final Action delegate, final String fileName) { this.delegate = delegate; this.fileName = fileName;        }        @Override public void run() { delegate.run();        }        @Override public boolean execute() throws IOException { try {     BufferedWriter writer = null;     try {         writer = new BufferedWriter(new FileWriter(new File(fileName), true));         writer.write("****************************n");         writer.write("*** Bye, bye old logfile ***n");         writer.write("****************************n");     } finally {         if (writer != null)  writer.close();     } } catch (Throwable e) {     logger.error("Writing to bottom of old logfile "" + fileName + "" with", e); } boolean ret = delegate.execute(); try {     BufferedWriter writer = null;     try {         writer = new BufferedWriter(new FileWriter(new File(fileName), true));         writer.write("*************************n");         writer.write("*** Hello new logfile ***n");         writer.write("*************************n");     } finally {         if (writer != null)  writer.close();     } } catch (Throwable e) {     logger.error("Writing to top of new logfile "" + fileName + "" with", e); } return ret;        }        @Override public void close() { delegate.close();        }        @Override public boolean isComplete() { return delegate.isComplete();        }    }    // Wrapper class only for setting a hook to getSynchronous().execute()    static class MyRolloverDescription implements RolloverDescription {        final RolloverDescription delegate;        public MyRolloverDescription(final RolloverDescription delegate) { this.delegate = delegate;        }        @Override public String getActiveFileName() { return delegate.getActiveFileName();        }        @Override public boolean getAppend() { //return delegate.getAppend(); // As long as we already put some data to the top of the new logfile, subsequent writes should be performed with "append". return true;        }        // The synchronous action is for renaming, here we want to hook        @Override public Action getSynchronous() { Action delegateAction = delegate.getSynchronous(); if (delegateAction == null) return null; return new MyAction(delegateAction, delegate.getActiveFileName());        }        // The asynchronous action is for compressing, we don't need to hook here        @Override public Action getAsynchronous() { return delegate.getAsynchronous();        }    }    public RolloverDescription rollover(final RollingFileManager manager) {        RolloverDescription ret = super.rollover(manager);        return new MyRolloverDescription(ret);    }}

如果将实现我发布的功能请求,则在将来的log4j2版本中解决此要求可能会更容易。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5560936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存