有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何捕获“log4j:WARN找不到记录器的附加器”?

我想处理这个错误来设置另一个配置log4j。可能吗

我没有任何stacktrace,只有log的警告

log4j:WARN No appenders could be found for logger (agent.Test1Agent.JavaAgent). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

共 (2) 个答案

  1. # 1 楼答案

    因为log4j不会抛出任何异常,也不会在配置错误时以某种方式发出通知,所以无法正确执行您想要的操作。但这是可能的。
    见下面的PoC

    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    import org.apache.log4j.helpers.Loader;
    import org.apache.log4j.spi.Configurator;
    
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.URL;
    
    public class Log4jAlternativeConfig {
    
        private static class PrintStreamCallbackSupportDecorator extends PrintStream {
    
            public PrintStreamCallbackSupportDecorator(OutputStream out, Callback callback) {
                super(out);
                this.callback = callback;
            }
    
            public interface Callback {
                public void onPrintln(String x);
            }
    
            private Callback callback;
    
            @Override
            public void println(String x) {
                callback.onPrintln(x);
                super.println(x);
            }
        }
    
        public static void main(String[] args) {
    
            PrintStreamCallbackSupportDecorator.Callback callback = new PrintStreamCallbackSupportDecorator.Callback() {
                @Override
                public void onPrintln(String x) {
                    if (x.startsWith("log4j:WARN No appenders could be found for logger")) {
                        Configurator configurator = new PropertyConfigurator();
                        URL url = Loader.getResource("log4j_alternative.properties");
                        configurator.doConfigure(url, LogManager.getLoggerRepository());
                    }
                }
            };
    
            System.setErr(new PrintStreamCallbackSupportDecorator(System.err, callback));
    
            Logger log = LogManager.getLogger(Log4jAlternativeConfig.class);
    
            //causes "No appenders could be found for logger" warning
            log.error("test");
    
            //should be logged as configured in log4j_alternative.properties
            log.error("test 2");
        }
    }
    

    这个解决方案并不完美,但确实有效

  2. # 2 楼答案

    通过在类路径上提供默认配置文件,可以设置替代的log4j配置。由于log4j使用Thread.getContextClassLoader().getResource()来定位默认配置文件,并且不直接检查文件系统,因此它应该包含在jar中。因此,如果没有提供外部配置,它将返回默认配置。 有关详细信息,请参见http://logging.apache.org/log4j/1.2/faq.html#noconfig