Log4j

Apache Log4jは、Javaベースのロギングユーティリティである。Ceki Gülcüによって書かれたもので、Apache Software FoundationのApache Logging Servicesプロジェクトの一部である。Log4jはいくつかのJavaロギングフレームワークの一つである。 Gülcüはその後、Log4jの後継製品を提供する意図で、SLF4J（英語版）とLogbackプロジェクトを開始した。 Apache Log4jチームは、Log4j 1の後継となるバージョン2を作成した。Log4j 2は、Log4j 1.2、1.3、java.util.logging、Logbackの問題点に焦点を当てて開発され、これらのフレームワークに現れた問題に対処している。 さらに、Log4j 2はプラグイン・アーキテクチャを提供し、前バージョンよりも拡張性が高くなっている。Log4j 2は、1.xバージョンとの後方互換性はないが、「アダプター」が利用できる。 2015年8月5日、Apache Logging Services Project Management Committeeは、Log4j 1が寿命に達したため、Log4j 1のユーザーはApache Log4j 2へのアップグレードを推奨すると発表した。 Log4jは、6つのログレベルを標準提供する。この他に利用者が任意のログレベルを追加することも可能である。ログレベルが高い（情報量が少ない）ものから低い（情報量が多い）ものへと順に並べると下表の通り。 Log4jは、二つの方法で設定が可能である。一つはプロパティファイル、もう一つはXMLファイルである。両者とも、3つの主要なコンポーネント（ロガー、アペンダ、レイアウト）について定義することができる。ファイルにより設定を行うため、Log4jを使用しているアプリケーションを変更することなく、ロギングをon/offできるという利点がある。たとえば、問題が発生するまではロギングをoffで動作させておき、設定ファイルを変更することで簡単にロギングを再開する、という使い方ができる。 ロガー (Loggers) は論理的なログファイル名であり、Javaアプリケーションはこれらの名前を意識する。個々のロガーにて取得するログのレベル（FATAL、ERROR等々）はロガー毎に独立に設定できる。古いバージョンのLog4jでは、これらは「カテゴリ」と「優先度」と呼ばれていたが、現バージョンではそれぞれ「ロガー」と「レベル」と呼んでいる。 アペンダ (Appenders) は具体的な出力処理を行う。アペンダには様々な種類があり、それぞれ内容を表す名前が付いている。例えばFileAppender、ConsoleAppender、SocketAppender、SyslogAppender、NTEventLogAppenderなどがあり、SMTPAppenderというものさえある。任意のロガーには複数のアペンダを付与できるので、同じログ情報を例えばローカルのファイルと他のコンピュータ上のソケット（英語版）リスナに同時に出力する、などという使い方が可能。 レイアウト (Layouts) は一件ずつのログを整形するためにアペンダによって参照される。例えば行単位に出力するログを整形する方法としてPatternLayoutというものがあり、これはC言語のprintf関数によく似た書式指定子を使える。他にもHTMLLayoutやXMLLayoutなどがあり、これらはそれぞれHTMLやXMLの書式に整形したい場合に使える。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd"> <log4j:configuration> <!-- アペンダとは出力先のことであり、例えばコンソールやファイルを指す。 アペンダの名前は好きに決めてよい。--> <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> </appender> <!-- 'org.springframework'カテゴリのロガーは、infoレベル以上のメッセージのみロギングする。 もしロガーをクラス名で検索し（例：Logger.getLogger(AClass.class)）AClassが springframework.orgパッケージに属するなら、そのロガーはこのカテゴリに属する。--> <logger name="org.springframework"> <level value="info"/> </logger> <!-- springは原則としてinfo以上のログしか取らないが、PropertyEditorRegistrySupportクラスについては デバッグログも欲しい--> <logger name="org.springframework.beans.PropertyEditorRegistrySupport"> <level value="debug"/> </logger> <logger name="org.acegisecurity"> <level value="info"/> </logger> <root><!-- rootカテゴリ --> <!-- 別途定義が無い限り、デバッグレベル以上の全てのメッセージをロギングする。--> <!-- 別途定義が無い限り、全てのログは「stdout」アペンダにてロギングされる。 --> <level value="debug" /> <appender-ref ref="stdout" /> </root> </log4j:configuration> （訳注：この設定例中に出現する「カテゴリ」という用語と、「ロガー」の旧称としての「カテゴリ」との関係は不詳。） ApacheにはChainsaw（英語版）という別プロジェクトが存在しており、これはLog4jにて生成されたログファイルを利用する。ChainsawはJavaベースのGUIビューアであり、豊富な機能を持つ。ChainsawもLog4jに類似した設定ファイルを使用する。Log4j向けのビューアは他にもあるが（例：log2webオープンソースかつウェブベース）、Chainsawに比較して機能が少ない。 2021年12月9日、Log4j 2のリモートコード実行ゼロデイ脆弱性Log4Shell（CVE-2021-44228）が表面化した。影響を受けるサービスには、iCloud、Minecraft、Steamなどがある。この脆弱性の原因となる機能は、その数日前に正式にリリースされたバージョン2.15.0ではデフォルトで無効化されている。Apache Software Foundationは、CVSSの深刻度評価を最高点の10に指定した。12月14日時点では脆弱性を利用した攻撃が観測されている。 [脚注の使い方] ^ “Release 2.24.0” (6 9月 2024). 22 9月 2024閲覧。 ^ “Log4j – Changes - Apache Log4j 2”. apache.org. Apache Software Foundation. 2021年12月18日閲覧。 ^ “Logback Home”. Logback.qos.ch. 2014年7月24日閲覧。 ^ “Logback Home”. Logback.qos.ch. 2014年7月24日閲覧。 ^ Goers, Ralph (2019年12月15日). “Why was Log4j 2 created?” (英語). Ralph Goers. 2021年12月11日閲覧。 ^ “Log4j 2 Guide - Apache Log4j 2: News”. Logging.apache.org (2014年7月12日). 2014年7月24日閲覧。 ^ “Apache™ Logging Services™ Project Announces Log4j™ 1 End-Of-Life; Recommends Upgrade to Log4j 2”. blogs.apache.org (2015年8月5日). 2016年7月3日閲覧。 ^ a b 日本放送協会. ““ログソフト”に深刻なぜい弱性 IPA 早急な対策呼びかけ”. NHKニュース. 2021年12月14日閲覧。 ^ Goodin (December 9, 2021). “Zeroday in ubiquitous Log4j tool poses a grave threat to the Internet”. Ars Technica. December 10, 2021閲覧。 ^ “Worst Apache Log4j RCE Zero day Dropped on Internet”. Cyber Kendra (December 9, 2021). December 10, 2021閲覧。 ^ “Apache Log4j Security Vulnerabilities”. 2021年12月10日閲覧。 ^ Mott, Nathaniel (December 10, 2021). “Countless Servers Are Vulnerable to Apache Log4j Zero-Day Exploit”. PC Magazine. December 10, 2021閲覧。 ポータル FLOSS Log4j公式サイト （英語） Log4c - C言語用port Log4perl - Perl用port Log4net - .NET Framework用port log4php - PHP用port Log4js - JavaScript用port Log4js-node - Node.js用port Log4plsql - Oracle PL/SQL用port