我的 logging.properties 自定义格式化程序不工作

My logging.properties custom formatter is not working

我实际上正在向我的项目添加 java 日志记录(不能使用其他框架)。我在 .war 上构建我的应用程序,并通过 Weblogic 部署它,记录器正在使用我的 logging.properties 配置,除了格式化程序我不知道为什么应用程序忽略它。

这是我的 class 我准备记录器的地方;

public class CtgLogger {
private static final String LOAD_ERROR = "Properties could not be loaded.";

private static final Map<String, Level> LEVEL_MAP;
private static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
static {

    final InputStream inputStream = CtgLogger.class.getResourceAsStream("/logging.properties");
    try {
        LogManager.getLogManager().readConfiguration(inputStream);
    } catch (Exception e) {
        Logger.getAnonymousLogger().severe(LOAD_ERROR);
        Logger.getAnonymousLogger().severe(e.getMessage());
    }
    // and I add the LEVEL_MAP to the logger...

这是我的属性...

handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.pattern=logsfolder/CTGLOG_%g.log
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.limit=3000
java.util.logging.FileHandler.count=6
#java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
#If I use the SimpleFormatter, apps goes well with it format. 
java.util.logging.FileHandler.formatter = com.package.my.log.JsonCustomFormatter
#If I use my custom formatter, the weblogic works with a XMLFormatter (default)

我知道 .properties 正在运行,因为记录器正在使用我设置的模式、限制和计数。

PD:如果我 运行 我的应用程序使用 JUnit,日志可以使用我的自定义格式化程序,但不能在 weblogic 中使用!不知道为什么!

Weblogic 将有多个 class 加载器。标准 LogManager can only see classes loaded via the system class loader. Check the Server Log 用于与找不到您的自定义 class 相关的错误。如果是这种情况,您必须将格式化程序移至系统 classloader。否则你必须使用代码从你的网络应用程序安装你的格式化程序,它是 child classloader.

中的 运行

还有bugs in the LogManager.readConfiguration and alternative methods to use in JDK9 and later.

使用 Eclipse 和 java 标准记录器可能会很痛苦。我发现了一些可以产生与 Log4J 类似的输出的东西:

Log4J 中的“%d{HH:mm:ss,SSS} %-5p %m (%F:%L) in %t%n”:您可以点击参考,您已发布日志

21:36:37,9 INFO process model event Digpro2021a/digpro.Digpro(Digpro.java:358) in processModelEvent
21:36:37,9 INFO start polling Digpro2021a/digpro.Digpro(Digpro.java:398) in processEventAutoreload
21:36:37,9 INFO reload now Digpro2021a/digpro.Digpro(Digpro.java:370) in processModelEvent


public class Digpro {

    protected static final Logger L = Logger.getLogger("Digpro");
//logger conf
  static {
    L.setLevel(Level.FINE);
    Handler handler = Logger.getLogger("").getHandlers()[0];
    handler.setLevel(Level.FINE); // Default console handler
    handler.setFormatter(new Formatter() {
        @Override
        public String format(LogRecord r) {
            Date d = new Date(r.getMillis());
            String srcClassLong = r.getSourceClassName();
            String[] aClass = srcClassLong.split("\$")[0].split("\.");
            String srcClass = aClass[aClass.length - 1];
            StackTraceElement elem = (new Throwable()).getStackTrace()[7];
            int line = elem.getLineNumber();
            String modulName = elem.getModuleName();
            return String.format("%tH:%tM:%tS,%tl %.7s %s %s/%s(%s.java:%d) in %s\n", d, d, d, d, // 
                    r.getLevel(), r.getMessage(), // LEVEL and message
                    modulName, srcClassLong, srcClass, line, r.getSourceMethodName()); //ref to click on
        }
    });
  }
...
  public static class TestDigpro extends Digpro {
    //TESTING: 

    @Test
    public void testLogFormat() {
        L.info("poll info");
        L.fine("got fine");
    }
  }
}

产品:

21:51:20,9 INFO poll info Digpro2021a/digpro.Digpro$TestDigpro(Digpro.java:723) in testLogFormat
21:51:20,9 FINE got fine Digpro2021a/digpro.Digpro$TestDigpro(Digpro.java:724) in testLogFormat