log4j 2.3
を console 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の場合、正しい方向を教えてください。
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()は機能せず、LogManager.getContext()。getLogger()を使用するとロガー階層が許可されません。正直なところ、プログラムによるアプローチはお勧めしません。Log4j2はそれにアレルギーを持っています。
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();
お役に立てれば
コンソールアペンダー用に必要な場合、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>
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");