java - 通过LogManger.getLogger()获取自定义logger

标签 java log4j log4j2

我想知道如何获取我的自定义记录器 通过log4j的LogManger.getLogger()方法。

我几乎确定我的项目不需要自定义记录器并使用默认的 log4j 记录器。

但是,如有必要,我想使用自定义记录器更改源代码中的所有记录器。

我可以通过更改设置文件或LoggerFactory源代码来做到这一点吗?

如果这篇文章重复,请添加链接以引导我到达那里。

谢谢。

最佳答案

推荐的方法是修改配置文件并将watch标志设置为true。如果您想继续使用源代码方法,请参阅下文。

这是一个非常复杂的过程,其中包括转换为 log4j.core.logger 类型以公开 Logger 接口(interface)隐藏的 protected 方法。我还应该声明,这涉及 core.logger 中 protected 方法,这些方法可能随时更改。

幸运的是,我刚刚解决了这个问题并有示例代码。

/**
 * Dynamically creates an instance of a Logger.
 * 
 * @param appenderName
 *            most often will be the name of the class this logger will
 *            belong to.
 * @param logFileName
 *            the file name to save the logs to
 * @return
 */
public static org.apache.logging.log4j.Logger createInstanceLogger(String appenderName,
        String logFileName) {
    //call getLogger() which will create and load a logger with a default configuration
    org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager
            .getLogger(String.format("DynamicLogger%s",
                    String.valueOf(DynamicLogManager.loggerCount++)));
    org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; // cast logger to core logger to access protected methods
    org.apache.logging.log4j.core.LoggerContext context = coreLogger.getContext();
    org.apache.logging.log4j.core.config.BaseConfiguration configuration = (org.apache.logging.log4j.core.config.BaseConfiguration) context
            .getConfiguration();

    TriggeringPolicy compositePolicy = CompositeTriggeringPolicy.createPolicy(
            SizeBasedTriggeringPolicy.createPolicy("5mb"),
            TimeBasedTriggeringPolicy.createPolicy("1", "true"));

    String fileName = String.format("%1$s/%2$s", appenderName, logFileName);
    String filePattern = String.format("%1$s/%2$s.%%d{yyyy-MM-dd}",
            appenderName, logFileName);

    Layout<String> layout = PatternLayout.createLayout(DynamicLogManager._conversionPattern,
            configuration, RegexReplacement.createRegexReplacement("a^", "."), //empty regex replacement
            "utf-8", "false");

    Filter f = ThresholdFilter.createFilter("trace", "accept", "accept");

    Appender a = RollingFileAppender.createAppender(fileName, //fileName
            filePattern, //filePattern
            "true", //append
            appenderName, //appender name
            "true", //bufferred io
            "true", //immediate flush
            compositePolicy, //policy
            null, //strategy default
            layout, //layout
            f, //filter none
            "true", //ignore exceptions
            "false", //advertise
            "null", //advertise uri
            configuration //configuration
            );

    a.start();

    coreLogger.addAppender(a);

    //this is where we would figure out how to configure the logger to listen on a configuration file
    coreLogger.setLevel(Level.ALL); //set the log level of the logger that we are returning to Level.ALL

    return coreLogger; //cast logger back to Logger interface

编辑您的评论:

看起来您只是想将记录器添加到 xml 配置中并从 java 代码中获取它,这很容易做到...

  <Loggers>
    <Logger name="com.foo.Bar" level="trace" additivity="false">
      <AppenderRef ref="whateverAppenderName"/>
    </Logger>
    <Root level="error">
      <AppenderRef ref="whateverOtherAppenderName"/>
    </Root>
  </Loggers>

然后在java代码中:

package com.foo;
class Bar{
private static final Logger log = LogManager.getLogger(); //qualified class name is com.foo.Bar
}

log4j中的登录也是分层的。这意味着,如果您定义一个名称为“com.foo”的记录器,如果它是最可访问的记录器,它将被该包的所有子项获取(这意味着,您没有该特定类的更具体的记录器名称)

阅读此... http://logging.apache.org/log4j/2.x/manual/configuration.html#XML

关于java - 通过LogManger.getLogger()获取自定义logger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22753019/

相关文章:

java - 扩展 Log4JLogger 并在运行时调用子类

java - Log4j 和 ${HOME} 变量 - HOME 未按预期扩展

java - 为什么 log4j-slf4j-impl 不是无锁的?

java - 使用适用于 32 位和 64 位 Windows 的 log4j2 配置进行 Windows 事件日志记录

java - 从与 jar 文件相同的目录加载 log4j2.xml 文件

java - SymmetricDS 客户端抛出 AuthenticationException

java - Java 中的 Image.GetScaledInstance() 不工作

java - 如何从 JPanel swing 更改 JFrame 标签

java - Log4j - 有时只需要换行

javascript - 计算每三周在网站上显示图像