web-dev-qa-db-ja.com

log4j 2.xを純粋にプログラムで構成する方法は?

log4j 2.3console appender で純粋にプログラムで構成するには(どのような形式の構成ファイルもありません)?

基本的に、この 1.xコード の2.xバージョンを探しています。

私のクラスでは、次に使用します

private static final Logger logger = LogManager.getLogger();
// 
    // some method
       logger.debug(someString);

構成なしで(予想どおり)直面しています

エラーStatusLogger log4j2構成ファイルが見つかりません。デフォルト設定の使用:エラーのみをコンソールに記録します。

構成ファイルの使用法は 適切に文書化されている のように見えますが、ベアボーンコードのみのケースの良い例は見つかりませんでした。

最も近いのは この記事 で、ダミーファイルがまだ使用されています。

ここに私の最高の(完全に失敗した)ショットがあります:

private static void configureLog4J() {
    PatternLayout layout = PatternLayout.createDefaultLayout();
    ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(layout);
    LoggerConfig loggerConfig = new LoggerConfig();
    loggerConfig.addAppender(appender, DEBUG, null);
}

私は何かを見逃しましたか?

それでもまだRTFMの場合、正しい方向を教えてください。

22
PM 77-1
package com;

import org.Apache.logging.log4j.Level;
import org.Apache.logging.log4j.LogManager;
import org.Apache.logging.log4j.Logger;
import org.Apache.logging.log4j.core.Appender;
import org.Apache.logging.log4j.core.LoggerContext;
import org.Apache.logging.log4j.core.appender.ConsoleAppender;
import org.Apache.logging.log4j.core.config.AppenderRef;
import org.Apache.logging.log4j.core.config.Configuration;
import org.Apache.logging.log4j.core.config.LoggerConfig;
import org.Apache.logging.log4j.core.layout.PatternLayout;

import Java.nio.charset.Charset;

public class MyLoggerTest  {

    public static void main(String[] args){
        LoggerContext context= (LoggerContext) LogManager.getContext();
        Configuration config= context.getConfiguration();

        PatternLayout layout= PatternLayout.createLayout("%m%n", null, null, Charset.defaultCharset(),false,false,null,null);
        Appender appender=ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null);
        appender.start();
        AppenderRef ref= AppenderRef.createAppenderRef("CONSOLE_APPENDER",null,null);
        AppenderRef[] refs = new AppenderRef[] {ref};
        LoggerConfig loggerConfig= LoggerConfig.createLogger("false", Level.INFO,"CONSOLE_LOGGER","com",refs,null,null,null);
        loggerConfig.addAppender(appender,null,null);

        config.addAppender(appender);
        config.addLogger("com", loggerConfig);
        context.updateLoggers(config);

        Logger logger=LogManager.getContext().getLogger("com");
        logger.info("HELLO_WORLD");


    }
}

これがあなたが探しているものかどうかわかりません。これにより、デフォルトの構成が作成され、コンソールロガーが追加されます。ただし、LogManager.getLogger()は機能せず、Lo​​gManager.getContext()。getLogger()を使用するとロガー階層が許可されません。正直なところ、プログラムによるアプローチはお勧めしません。Log4j2はそれにアレルギーを持っています。

17
alan7678

Log4j 2.8をプログラムで構成するための完全な例を次に示します。 RollingFile、JDBC、SMTPの3つのアペンダーがあります。

1つのクラスと2つのプロパティ設定ファイルがあり、1つはlog4j2 configurationFactoryとしてクラスを登録し、もう1つはログファイルディレクトリなどのプロパティを設定します。

クラス#1:MPLoggingConfiguration

package com.websitester.config;

import Java.io.Serializable;
import Java.nio.charset.Charset;
import Java.util.Zip.Deflater;

import org.Apache.logging.log4j.Level;
import org.Apache.logging.log4j.core.Appender;
import org.Apache.logging.log4j.core.Layout;
import org.Apache.logging.log4j.core.LoggerContext;
import org.Apache.logging.log4j.core.appender.RollingFileAppender;
import org.Apache.logging.log4j.core.appender.SmtpAppender;
import org.Apache.logging.log4j.core.appender.db.ColumnMapping;
import org.Apache.logging.log4j.core.appender.db.jdbc.ColumnConfig;
import org.Apache.logging.log4j.core.appender.db.jdbc.ConnectionSource;
import org.Apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource;
import org.Apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
import org.Apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
import org.Apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
import org.Apache.logging.log4j.core.appender.rolling.OnStartupTriggeringPolicy;
import org.Apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy;
import org.Apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
import org.Apache.logging.log4j.core.config.AppenderRef;
import org.Apache.logging.log4j.core.config.Configuration;
import org.Apache.logging.log4j.core.config.ConfigurationFactory;
import org.Apache.logging.log4j.core.config.ConfigurationSource;
import org.Apache.logging.log4j.core.config.DefaultConfiguration;
import org.Apache.logging.log4j.core.config.LoggerConfig;
import org.Apache.logging.log4j.core.config.Order;
import org.Apache.logging.log4j.core.config.Property;
import org.Apache.logging.log4j.core.config.plugins.Plugin;
import org.Apache.logging.log4j.core.layout.HtmlLayout;
import org.Apache.logging.log4j.core.layout.PatternLayout;

public class MPLoggingConfiguration {

    public static final String WEBSITESTER_LOGGER_NAME = "com.websitester";
    public static final String FILE_PATTERN_LAYOUT = "%n[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%l]%n\t%m%n%n";
    public static final String LOG_FILE_NAME = "awmonitor.log";
    public static final String LOG_FILE_NAME_PATTERN = "awmonitor-%i.log";  

    /**
     * Just to make JVM visit this class to initialize the static parts.
     */
    public static void configure() {
    }

    @Plugin(category = ConfigurationFactory.CATEGORY, name = "MPConfigurationFactory")
    @Order(15)
    public static class MPConfigurationFactory  extends ConfigurationFactory {
        public static final String[] SUFFIXES = new String[] {".json", "*"};

        @Override
        protected String[] getSupportedTypes() {
            return SUFFIXES;
        }

        @Override
        public Configuration getConfiguration(LoggerContext arg0, ConfigurationSource arg1) {
            return new Log4j2Configuration(arg1);
        }
    }

    private static class Log4j2Configuration extends DefaultConfiguration {

        public Log4j2Configuration(ConfigurationSource source) {
            super.doConfigure();
            setName("mp-log4j2");

            String logFilePath = "/log/weblogic/wl-moniport/";

            // LOGGERS
            //      com.websitester
            AppenderRef[] refs = new AppenderRef[] {};
            Property[] properties = new Property[] {};
            LoggerConfig websitesterLoggerConfig = LoggerConfig.createLogger(true, Level.INFO, WEBSITESTER_LOGGER_NAME, "true", refs, properties, this, null);
            addLogger(WEBSITESTER_LOGGER_NAME, websitesterLoggerConfig);


            // APPENDERS
            final Charset charset = Charset.forName("UTF-8");

            //      MP ROLLING FILE
            TriggeringPolicy mpFileCompositePolicy = CompositeTriggeringPolicy.createPolicy(
                    SizeBasedTriggeringPolicy.createPolicy("3 M"),
                    OnStartupTriggeringPolicy.createPolicy(1));
            final DefaultRolloverStrategy mpFileRolloverStrategy = DefaultRolloverStrategy.createStrategy("9", "1", "max", Deflater.NO_COMPRESSION + "", null, true, this);
            Layout<? extends Serializable> mpFileLayout = PatternLayout.newBuilder()
                    .withPattern(FILE_PATTERN_LAYOUT)
                    .withPatternSelector(null)
                    .withConfiguration(this)
                    .withRegexReplacement(null)
                    .withCharset(charset)
                    .withAlwaysWriteExceptions(isShutdownHookEnabled)
                    .withNoConsoleNoAnsi(isShutdownHookEnabled)
                    .withHeader(null)
                    .withFooter(null)
                    .build();
            Appender mpFileAppender = RollingFileAppender.newBuilder()
                    .withAdvertise(Boolean.parseBoolean(null))
                    .withAdvertiseUri(null)
                    .withAppend(true)
                    .withBufferedIo(true)
                    .withBufferSize(8192)
                    .setConfiguration(this)
                    .withFileName(logFilePath + LOG_FILE_NAME)
                    .withFilePattern(logFilePath + LOG_FILE_NAME_PATTERN)
                    .withFilter(null)
                    .withIgnoreExceptions(true)
                    .withImmediateFlush(true)
                    .withLayout(mpFileLayout)
                    .withCreateOnDemand(false)
                    .withLocking(false)
                    .withName("error_file_web")
                    .withPolicy(mpFileCompositePolicy)
                    .withStrategy(mpFileRolloverStrategy)
                    .build();
            mpFileAppender.start();
            addAppender(mpFileAppender);
            getLogger(WEBSITESTER_LOGGER_NAME).addAppender(mpFileAppender, Level.DEBUG, null);


            // JDBC
            if (System.getProperty("log4jjdbcjndiName") != null){
                ColumnConfig[] columnConfigs = new ColumnConfig[] {
                        ColumnConfig.newBuilder()
                        .setConfiguration(this)
                        .setName("DATED")
                        .setPattern(null)
                        .setLiteral(null)
                        .setEventTimestamp(true)
                        .setUnicode(false)
                        .setClob(false)
                        .build(),
                        ColumnConfig.newBuilder()
                        .setConfiguration(this)
                        .setName("LOGGER")
                        .setPattern("%logger")
                        .setLiteral(null)
                        .setEventTimestamp(false)
                        .setUnicode(false)
                        .setClob(false)
                        .build(),
                        ColumnConfig.newBuilder()
                        .setConfiguration(this)
                        .setName("LOG_LEVEL")
                        .setPattern("%level")
                        .setLiteral(null)
                        .setEventTimestamp(false)
                        .setUnicode(false)
                        .setClob(false)
                        .build(),
                        ColumnConfig.newBuilder()
                        .setConfiguration(this)
                        .setName("MESSAGE")
                        .setPattern("%message")
                        .setLiteral(null)
                        .setEventTimestamp(false)
                        .setUnicode(false)
                        .setClob(false)
                        .build(),
                        ColumnConfig.newBuilder()
                        .setConfiguration(this)
                        .setName("NODE")
                        .setPattern("" + System.getProperty("log4jmpserverid"))
                        .setLiteral(null)
                        .setEventTimestamp(false)
                        .setUnicode(false)
                        .setClob(false)
                        .build()
                };
                ConnectionSource dataSourceConnectionSource = DataSourceConnectionSource.createConnectionSource(System.getProperty("log4jjdbcjndiName"));
                if (dataSourceConnectionSource != null){
                    Appender jdbcAppender = JdbcAppender.newBuilder()
                            .setBufferSize(0)
                            .setColumnConfigs(columnConfigs)
                            .setColumnMappings(new ColumnMapping[]{})
                            .setConnectionSource(dataSourceConnectionSource)
                            .setTableName("MTDTLOGS")
                            .withName("databaseAppender")
                            .withIgnoreExceptions(true)
                            .withFilter(null)
                            .build();
                    jdbcAppender.start();
                    addAppender(jdbcAppender);
                    getLogger(WEBSITESTER_LOGGER_NAME).addAppender(jdbcAppender, Level.WARN, null);
                }
            };

            // SMTP
            if (System.getProperty("log4jemailSubject") != null){
                if (System.getProperty("log4jemailLevel").equalsIgnoreCase("error")) {
                    Layout<? extends Serializable> mpHtmlLayout = HtmlLayout.createLayout(false, "Monitor de Portales", null, null, "x-small", null);

                    Appender smtpAppender = SmtpAppender.createAppender(
                            this,
                            "SMTP",
                            System.getProperty("log4jemailTo"), 
                            System.getProperty("log4jemailcc"), 
                            System.getProperty("log4jemailbcc"), 
                            System.getProperty("log4jemailFrom"), 
                            System.getProperty("log4jemailreplyTo"), 
                            System.getProperty("log4jemailSubject"), 
                            System.getProperty("log4jemailProtocol"), 
                            System.getProperty("log4jemailHost"), 
                            System.getProperty("log4jemailPort"), 
                            System.getProperty("log4jemailUserName"), 
                            System.getProperty("log4jemailPassword"), 
                            "false", 
                            "50", 
                            mpHtmlLayout, 
                            null, 
                            "true");
                    smtpAppender.start();
                    addAppender(smtpAppender);
                    getLogger(WEBSITESTER_LOGGER_NAME).addAppender(smtpAppender, Level.ERROR, null);
                }
            }
        }
    }
}

構成ファイル:src/main/resources/log4j2.component.properties

log4j.configurationFactory=com.websitester.config.MPLoggingConfiguration$MPConfigurationFactory
log4j.configurationFile=log4j2websitester.json

構成ファイル:src/main/resources/log4j2websitester.json

{"logFilePath" : "/log/weblogic/wl-moniport/"}

私の場合、他のクラスのすべてのプロパティ(System.getPropertyを介してMPLoggingConfigurationでアクセス)を設定します。次に例を示します。

System.setProperty("log4jjdbcjndiName", "weblogic-monitor");

一部のプロパティを変更し、log4j2を再構成する場合、次の呼び出しを行う必要があります。

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();

お役に立てれば

11
Carlos Cuesta

コンソールアペンダー用に必要な場合、mavenを使用している場合、pom.xmlにこれらの2つの依存関係を置くだけで非常に簡単な方法があり、すべてがur consoleに出力されます。何も必要ありません... log4j.propertiesファイルはまったくありません。 slf4jはlog4jを拡張し、非常に多くの豊富な機能を備えています。

          <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-api</artifactId>
                 <version>1.7.5</version>
                 <scope>compile</scope>
          </dependency>

          <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-simple</artifactId>
                 <version>1.7.5</version>
          </dependency>
3
Bhupi

Log4jで独自のConfigurationFactoryをカスタマイズできます。 Plsは https://logging.Apache.org/log4j/2.x/manual/customconfig.html を参照します。それはあなたのニーズを満たすことができるようです。


そのために残念。この方法でニーズは満たされますか?私はただテストを行い、上記のエラーメッセージがまだ出力されていてもうまく動作します。

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final Configuration config = ctx.getConfiguration();
    Layout<? extends Serializable> layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null,
        null,true, true,null,null);

    Appender appender = FileAppender.createAppender("/tmp/log4jtest.txt", "false", "false", "File", "true",
        "false", "false", "4000", layout, null, "false", null, config);
    appender.start();
    config.addAppender(appender);
    AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
    AppenderRef[] refs = new AppenderRef[] {ref};
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "org.Apache.logging.log4j",
        "true", refs, null, config, null );
    loggerConfig.addAppender(appender, null, null);
    config.addLogger("simpleTestLogger", loggerConfig);
    ctx.updateLoggers();


    Logger l = ctx.getLogger("simpleTestLogger");
    l.info("message of info level shoud be output properly");
    l.error("error message");
3
Yiping Huang