Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在fly LOG4j2 2.6中创建新的滚动文件_Java_Logging_Log4j2 - Fatal编程技术网

Java 在fly LOG4j2 2.6中创建新的滚动文件

Java 在fly LOG4j2 2.6中创建新的滚动文件,java,logging,log4j2,Java,Logging,Log4j2,我正试图在我的应用程序中基于log4j2.xml文件的原理创建一个新的记录器配置。代码将自我解释: XML文件 <?xml version="1.0" encoding="UTF-8"?> <Configuration monitorInterval="5"> <Appenders> <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayo

我正试图在我的应用程序中基于log4j2.xml文件的原理创建一个新的记录器配置。代码将自我解释:

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %5p %c{1} - %m%n" />
        </Console>

        <RollingFile name="file" fileName="./log/application.log"
            filePattern="./log/devfix-%-d{yyyy-MM-dd}.log">
            <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>


        <Async name="ASYNC" bufferSize="2048">
            <AppenderRef ref="file" />
            <AppenderRef ref="STDOUT" />
        </Async>

        <JMS name="jmsQueue" destinationBindingName="logQueue"
            factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
            factoryBindingName="ConnectionFactory" providerURL="tcp://xxxx:xxxxx?jms.useAsyncSend=true">
            <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" />
        </JMS>

        <RollingFile name="fixfile" fileName="./log/fix.log"
            filePattern="./log/fix-%-d{yyyy-MM-dd-HH}.log">
            <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %c{1} - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="50MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>

    </Appenders>

    <Loggers>
        <Logger name="jmsLogger" additivity="false" level="OFF">
            <AppenderRef ref="jmsQueue" />
        </Logger>

        <Logger name="org.hibernate" level="WARN">
        </Logger>
        <Logger name="FIX_CONFIG" level="INFO" additivity="false">
            <AppenderRef ref="fixfile" />
        </Logger>
        <Root level="info">
            <AppenderRef ref="ASYNC" />
        </Root>

    </Loggers>
</Configuration>

在代码中,我使用了一个方法来创建一个新的rolligFileAppender

private static Logger getLogger(String platformName) throws IOException {

    /*Using a commun configuration to find the new Path for the plaform log file*/
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    RollingFileAppender fixAppender = (RollingFileAppender) config.getAppender("fixfile");
    if(null == fixAppender) {
        Logger logger = LogManager.getLogger(platformName);
        logger.error("Missing fixfile log4j appender in configuration");
        return logger;
    }
    String fileName = fixAppender.getFileName();
    if (null != fileName && fileName.toLowerCase().endsWith(".log"))
        try { // remove empty fix.log file created by defaults
            new File(fileName).delete();
        } catch (Exception e) {
        }

    /*construction of the new file name depending on the platform*/
    int slashIndex = null != fileName ? fileName.lastIndexOf("/") : -1;
    fileName = slashIndex >= 0 ? fileName.substring(0, slashIndex + 1) + platformName.toLowerCase() + ".log" : platformName.toLowerCase() + ".log";

    /*construction of the new file Pattern  depending on the platform*/
    String fileNamePattern = fixAppender.getFileName();
    int slashIndexPattern = null != fileNamePattern ? fileNamePattern.lastIndexOf("/") : -1;
     fileNamePattern = slashIndex >= 0 ? fileNamePattern.substring(0, slashIndexPattern + 1) + platformName.toLowerCase()+"-%-d{yyyy-MM-dd-HH}.log" : platformName.toLowerCase() + "-%-d{yyyy-MM-dd-HH}.log";

    ConfigurationBuilder< BuiltConfiguration > builder = ConfigurationBuilderFactory.newConfigurationBuilder();
    builder.setStatusLevel( Level.INFO);
    builder.setConfigurationName("RollingBuilder");


    // create a console appender
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
        ConsoleAppender.Target.SYSTEM_OUT);
    appenderBuilder.add(builder.newLayout("PatternLayout")
        .addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
    builder.add( appenderBuilder );



    // create a rolling file appender
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
        .addAttribute("pattern", " %-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n");
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
        .addComponent(builder.newComponent("TimeBasedTriggeringPolicy"));

      appenderBuilder = builder.newAppender("file2", "RollingFile")
        .addAttribute("fileName", fileName)
        .addAttribute("filePattern", fileNamePattern)
        .add(layoutBuilder)
        .addComponent(triggeringPolicy);
    builder.add(appenderBuilder);

    // create the new logger
    builder.add( builder.newLogger( platformName.toLowerCase(), Level.INFO )
        .add( builder.newAppenderRef( "file2" ) )
        .addAttribute( "additivity", false ) );

    builder.add( builder.newRootLogger( Level.INFO )
        .add( builder.newAppenderRef( "file2" ) ) );


    LoggerContext newctx = Configurator.initialize(builder.build());
    return newctx.getLogger(platformName.toLowerCase());

}
私有静态记录器getLogger(字符串平台名)引发IOException{
/*使用Common配置查找plaform日志文件的新路径*/
LoggerContext ctx=(LoggerContext)LogManager.getContext(false);
Configuration config=ctx.getConfiguration();
RollingFileAppender fixapper=(RollingFileAppender)config.getAppender(“fixfile”);
if(null==fixAppender){
Logger Logger=LogManager.getLogger(platformName);
logger.error(“配置中缺少修复文件log4j appender”);
返回记录器;
}
字符串fileName=fixapper.getFileName();
if(null!=fileName&&fileName.toLowerCase().endsWith(“.log”))
请尝试{//删除默认创建的空fix.log文件
新文件(文件名).delete();
}捕获(例外e){
}
/*根据平台构造新文件名*/
int slashIndex=null!=fileName?fileName.lastIndexOf(“/”)-1;
fileName=slashIndex>=0?fileName.substring(0,slashIndex+1)+platformName.toLowerCase()+“.log”:platformName.toLowerCase()+“.log”;
/*根据平台构建新的文件模式*/
字符串fileNamePattern=fixander.getFileName();
int slashindexpatern=null!=fileNamePattern?fileNamePattern.lastIndexOf(“/”)-1;
fileNamePattern=slashIndex>=0?fileNamePattern.substring(0,slashIndexPattern+1)+platformName.toLowerCase()+“-%-d{yyyyy-MM-dd HH}.log”:platformName.toLowerCase()+“-%-d{yyyy-MM-dd HH}.log”;
ConfigurationBuilderbuilder=ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.INFO);
builder.setConfigurationName(“RollingBuilder”);
//创建控制台附加程序
AppenderComponentBuilder appenderBuilder=builder.newAppender(“标准输出”、“控制台”).addAttribute(“目标”,
ConsolePender.Target.SYSTEM_OUT);
add(builder.newLayout(“PatternLayout”)
.addAttribute(“模式”,%d[%t]-5级别:%msg%n%throwable”);
builder.add(appenderBuilder);
//创建滚动文件追加器
LayoutComponentBuilder layoutBuilder=builder.newLayout(“PatternLayout”)
.addAttribute(“模式”,“%-d{yyyy-MM-dd HH:MM:ss.SSS}%5p%c{1}-%m%n”);
ComponentBuilder triggeringPolicy=builder.newComponent(“策略”)
.addComponent(builder.newComponent(“基于时间的触发策略”);
appenderBuilder=builder.newAppender(“文件2”,“滚动文件”)
.addAttribute(“文件名”,文件名)
.addAttribute(“文件模式”,文件名模式)
.add(布局生成器)
.addComponent(触发策略);
builder.add(appenderBuilder);
//创建新的记录器
builder.add(builder.newLogger(platformName.toLowerCase(),Level.INFO)
.add(builder.newAppenderRef(“文件2”))
.addAttribute(“可加性”,false));
builder.add(builder.newRootLogger(Level.INFO)
.add(builder.newAppenderRef(“文件2”));
LoggerContext newctx=Configurator.initialize(builder.build());
返回newctx.getLogger(platformName.toLowerCase());
}
问题是我无法创建这个新的记录器。例如,我使用平台名参数=“test”调用此函数。./log/test.log文件已正确创建,但我无法在其中记录任何内容

当我尝试进入调试时,最后一条语句LoggerContext newctx=Configurator.initialize(builder.build()),我注意到newctx指向我的log4j2.xml文件,因此用他的所有参数初始化,并忽略我的指令builder.build()

你知道为什么会这样吗

提前谢谢。

已解决

我没有使用正确的选项,我遵循了中的描述

以编程方式添加到当前配置

已解决

我没有使用正确的选项,我遵循了中的描述

以编程方式添加到当前配置