プラグをlog4j2

背景:log4jのバージョン2.11.0、および非同期ログを開きます

log4j2コンテキスト・ロード

  1. Log4jContextFactoryコンテキストファクトリは、ログコンテキストを作成し、
  2. 非同期ログAsyncLoggerContextSelectorコンテキストセレクタは、コンテキストを取得します。locateContext位置決めコンテキスト、コンテキストマップからコンテキストを取得するためのクラスローダ対応するキー(AsyncContext +ハッシュコード(10進))に従って、コンテキストが存在しない場合、再帰的parentClassLoaderは、ログAsyncLoggerContextを作成します
  3. 外部コンテキスト提供setExternalContextがある場合
  4. コンテキストは、ステータスが初期化されますが、まだ、すなわち_INITIALIZEDを開始していない場合。コンテキストを開始します_
  5. loggerDisruptorを開始します。コールバック親(LoggerContext)メソッドを開始
  6. _Reconfigure設定コンテキストと、現在の状態は_INITIALIZED出発起動に更新状態である場合
  7. 対応するファクトリクラスが保留リストに追加された空でない場合、取得log4j.configurationFactory構成工場出荷時の設定

プラグインマネージャの設定をロードします

  1. 設定PluginManager工場ConfigurationFactoryを取得するためにConfigurationFactoryクラスプラグインマネージャを作成します。プラグインマネージャプラグインcollectPluginsコレクション
  2. レジストラPluginRegistry負荷を接続し、内蔵のプラグイン集loadFromMainClassLoader
  3. プラグインキャッシュのコレクションを取得し、直接のリターンがあります
  4. クラスローダーローダーファイルキャッシュのデシリアライズ
  5. PluginCacheプラグインのキャッシュ・インスタンスを作成します
  6. データファイルを読む:META-INF / ORG / apacheの/ログ/ log4jの/コア/設定/プラグイン/ Log4j2Plugins.dat
  7. データファイルのloadCacheFilesをロードするために、キャッシュにプラグイン、プラグインPluginCache.categoriesをキャッシュするキャッシュのPluginEntryタイプにデシリアライズデータ:configurationfactory、コア、コンバーター、検索、fileconverter、にTypeConverter
  8. 、カテゴリのリストを横断する、プラグインタイプのパッケージPluginEntryがPluginTypeタイプを設定し得るようによればpluginsByCategoryRef newPluginsByCategoryにキャッシュのセットを返します
  9. 内蔵プラグのセットが空である場合、記載org.apache.logging.log4j.coreウィジェットセット、走査経路プラグイン注釈パケットのクラスを構築したように、パケットのロードパス。またはプラグが空Plugin._EMPTYアノテーションは_aliasの名前を変更するために使用されている場合には、クラス(_Plugin、PluginAttributeまたはPluginBuilderAttribute_コレクションの代わりに)を、注釈付きPluginAliasesはそうaliasElementNameとしてをelementTypeを使用します
  10. :内蔵のプラグインnewPluginsにからcategoryLowerCase小文字の名前をマージするためによるとmergeByName
  11. 上記_OSGiバンドルが同じ負荷がある場合、プラグインをバンドルし、mergeByName_をマージ、クラスローダからプラグインをロードされ
  12. プラグインマネージャーによると、同様にロードされ、_loadFromPackageを合併して構成_PACKAGES
  13. パラメータがない場合は、パッケージを空にし、同じ負荷をマージ
  14. プラグインマネージャのプラグインプロパティにバインド新しいプラグインnewPlugins
  15. プラグインマネージャは、オーダー(順番に従って降順)に従って注釈順序に従ってConfigurationFactory対応するウィジェットのセットを取得し、ソート
  16. 反射ConfigurationFactory引数なしコンストラクタ呼び出しインスタンス化学プラントやコレクションに追加_ _factories
  17. デフォルトのファクトリ実装の_configFactoryインスタンスを返し_factory

コンフィギュレーションのための工場設定

  1. 外部コンテキストとそこconfigLocation設定がある場合、例えば、プロファイルコンフィギュレーションConfigurationSourceに基づいて取得される。XmlConfigurationFactory
  2. externalContextクラスローダは、工場出荷時のデフォルト設定のgetConfigurationを得るヌルコールバックCLのコンテキストの外側には存在しません
  3. configLocationが空の読み取りlog4j.configurationFile構成であれば設定は指定された設定ファイルに基づいていない場合は、空のsourceLocationは、コンフィギュレーションを取得します。
  4. パッケージは、そうでなければCompositeConfigurationタイプ、単一構成の複数として構成されている場合
  5. configLocationがまだ空の場合、プラグイン管理のコレクションから得られたConfigurationFactoryタイプを横断_factories_
  6. あなたは工場出荷時のサポートを設定する場合_ALL_TYPES _ =「*」タイプ、コールバックメソッドは、工場getConfigurationコンフィギュレーション設定を取得するには、構成がnullでない場合に返され、工場出荷時の設定の背面には、例えば、呼び出すために継続しない、スクリーンショットが自動的に呼び出されますコンフィギュレーションimage.png

カスタムログコンテキストの設定

  1. 設定の構成例の構成ログLoggerContext.setConfiguration返さコンテキスト
  2. 設定ファイルが空の場合、何もしないデフォルト設定を返します。デフォルトの設定DefaultConfigurationレベルのエラーコンソール標準出力パイプ
  3. コンフィギュレーション・ファイルContextPropertiesコンポーネントのプロパティgetComponentの取得、ローカルコンテキスト名とホスト名を設定image.png
  4. 設定設定開始を開始します
  5. 設定は、現在のコンテキストLoggerContextログにバインドされています
  6. 設定変更イベントfirePropertyChangeEventを送信:PropertyChangeEventを
  7. コールバックイベントリスナメソッドPropertyChangeListener.propertyChange

この時点で、ログのコンテキストがロードされました

ロガーとフィルタフィルタ

@Override
protected Logger newInstance(final LoggerContext ctx, final String name, final MessageFactory messageFactory) {
    return new AsyncLogger(ctx, name, messageFactory, loggerDisruptor);
}
  1. ログコンテキスト作成ロガーによると、
  2. 親クラスのコンストラクタを呼び出します
protected Logger(final LoggerContext context, final String name, final MessageFactory messageFactory) {
    super(name, messageFactory);
    this.context = context;
    privateConfig = new PrivateConfig(context.getConfiguration(), this);
}
  1. プロファイルとコンテキストがログ構成PrivateConfigを作成し、ログロガーに応じて現在のインスタンスを取得します
public PrivateConfig(final Configuration config, final Logger logger) {
    this.config = config;
    this.loggerConfig = config.getLoggerConfig(getName());
    this.loggerConfigLevel = this.loggerConfig.getLevel();
    this.intLevel = this.loggerConfigLevel.intLevel();
    this.logger = logger;
}
  1. 設定LoggerConfigロガーに従ってログの対応する名前から取得した構成
public LoggerConfig getLoggerConfig(final String loggerName) {
    LoggerConfig loggerConfig = loggerConfigs.get(loggerName);
    if (loggerConfig != null) {
        return loggerConfig;
    }
    String substr = loggerName;
    //按照"."符号一层层向上查找匹配的日志配置,如果不存在则返回默认root配置
    while ((substr = NameUtil.getSubName(substr)) != null) {
        loggerConfig = loggerConfigs.get(substr);
        if (loggerConfig != null) {
            return loggerConfig;
        }
    }
    return root;
}
//默认DefaultConfiguration配置对应的默认LoggerConfig配置
protected void setToDefault() {
    // LOG4J2-1176 facilitate memory leak investigation
    setName(DefaultConfiguration.DEFAULT_NAME + "@" + Integer.toHexString(hashCode()));
    final Layout<? extends Serializable> layout = PatternLayout.newBuilder()
            .withPattern(DefaultConfiguration.DEFAULT_PATTERN)
            .withConfiguration(this)
            .build();
    final Appender appender = ConsoleAppender.createDefaultAppenderForLayout(layout);
    appender.start();
    addAppender(appender);
    final LoggerConfig rootLoggerConfig = getRootLogger();
    //配置Appender、level(为空则代表记录所有事件)、filter(为空代表不存在过滤器)
    rootLoggerConfig.addAppender(appender, null, null);

    final Level defaultLevel = Level.ERROR;
    final String levelName = PropertiesUtil.getProperties().getStringProperty(DefaultConfiguration.DEFAULT_LEVEL,
            defaultLevel.name());
    final Level level = Level.valueOf(levelName);
    rootLoggerConfig.setLevel(level != null ? level : defaultLevel);
}
  1. 私たちは、カスタム設定CustomXmlConfigurationFactoryなどについて話をする前に
  2. 一般的なフィルタリング構成もThresholdFilter、LevelRangeFilterは、プラグイン管理を通じて注入しました
@Plugin(
    name = "CustomXmlConfigurationFactory",
    category = "ConfigurationFactory"
)
@Order(10)
public class CustomXmlConfigurationFactory extends ConfigurationFactory {
    private static final String[] SUFFIXES = new String[]{".xml", "*"};

    public CustomXmlConfigurationFactory() {
    }

    public String[] getSupportedTypes() {
        return SUFFIXES;
    }

    public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
        XmlConfiguration template = new XmlConfiguration(loggerContext, ConfigurationSource.fromResource("log4j2-template.xml", this.getClass().getClassLoader()));
        XmlConfiguration specific = new XmlConfiguration(loggerContext, source);
        return new CompositeConfiguration(Lists.newArrayList(new XmlConfiguration[]{template, specific}));
    }
}

XmlConfiguration

  1. LoggerContext弱参照を作成し、ルートノード、プラグインマネージャ(コアディレクトリ)、ContextPropertiesアセンブリマップは、初期状態を設定しました
  2. DOMツリーの構成をXML解析
  3. ロガー:StatusConfigurationは、DOM構成例をバインド個々のプロパティを設定するの作成
  4. スタートアップコンフィギュレーションの開始、コンフィグレーションを得た後、構成を開始LoggerContext
  5. 初期設定の初期化
  6. ScriptManagerを作成します。
  7. コアプラグインを取得します
  8. クラスのクラスレベルのプラグ、プラグイン初期化レベル、プラグインをロードするプラグインクラスのクラスローダの使用を取得します。
  9. すべての子要素は関連付けるDOMツリーのrootElement要素をルートノード:設定のセットアップ
  10. Node.object性結合の種類に応じた種類のリストを作成するために設定されている場合は、doConfigure構成は、構成createConfigurationを作成し、それ以外の場合、プラグインのインスタンスが対応するプロパティNode.objectに結合している構築するPluginBuilderビルダーを使用します
  11. 子ノードは、その後アペンダアペンダにバインドされている場合
  12. 鎖がフィルタに追加された場合、子ノードは、フィルタ型の構成、フィルタ・チェーンに追加された場合
  13. 子ノードはloggerConfigsをバインドするために、対応するロガーの設定を取得している場合
  14. スタートloggerConfigs
  15. アペンダを開始
  16. フィルタは、現在のコンフィギュレーション・バインディングをフィルタリング開始

概要

log4jのプラグインプラグインマネージャのプラグイン構成管理PluginManagerスキャンはサポートされているすべてのプラグインクラスの設定を読み込みます。注入および属性は、対応するプラグインPluginBuilderをインスタンス化します。多くの利点は、このような注入するためのサポートKVの方法として、公式SPIを相対的には、JDKがあります。注射プラグインタイプ。しかし、欠点は、達成することはやや複雑であり、貧しい可読性のプロファイルは、使用することも、より複雑です

おすすめ

転載: blog.csdn.net/u010597819/article/details/92429838