私の物語:
行をファイルに記録する可能な限り単純なlog4jロガーと同じくらいシンプルなものを作りたいです。私はいくつかの機能を備えたいくつかの例を見つけましたが、実際に機能する基本的な一般的なものではなく、各行がどのように機能するかの説明もありません。
質問:
誰でも提供できますか?
前提条件:
- ファイルを配置する場所はすでに知っています。log4jを構成し、コンソールロギング用に機能させています。
- ここで、ファイルにログを記録し、プログラムの実行後にファイルシステムからファイルを見つけたいと思います。
- 既存の
log4j.properties
ファイルに追加する必要がある行は、望ましい出力です。
1つの汎用log4j.xmlファイルがあります。
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">
<appender name="default.console" class="org.Apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<param name="threshold" value="debug" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="default.file" class="org.Apache.log4j.FileAppender">
<param name="file" value="/log/mylogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="another.file" class="org.Apache.log4j.FileAppender">
<param name="file" value="/log/anotherlogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<logger name="com.yourcompany.SomeClass" additivity="false">
<level value="debug" />
<appender-ref ref="another.file" />
</logger>
<root>
<priority value="info" />
<appender-ref ref="default.console" />
<appender-ref ref="default.file" />
</root>
</log4j:configuration>
1つのコンソール、2つのファイルアペンダー、および1つのロガーが最初のファイルアペンダーではなく2番目のファイルアペンダーに接続します。
編集
古いプロジェクトの1つで、単純なlog4j.propertiesファイルを見つけました。
# For the general syntax of property based configuration files see
# the documentation of org.Apache.log4j.PropertyConfigurator.
# The root category uses two appenders: default.out and default.file.
# The first one gathers all log output, the latter only starting with
# the priority INFO.
# The root priority is DEBUG, so that all classes can be logged unless
# defined otherwise in more specific properties.
log4j.rootLogger=DEBUG, default.out, default.file
# System.out.println appender for all classes
log4j.appender.default.out=org.Apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=DEBUG
log4j.appender.default.out.layout=org.Apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n
log4j.appender.default.file=org.Apache.log4j.FileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=/log/mylogfile.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n
すべてのレイアウト引数の説明については、以下を参照してください。 log4j PatternLayout arguments
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/" debug="false">
<appender name="fileAppender" class="org.Apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="sample.log"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="fileAppender" />
</root>
</log4j:configuration>
Log4jは少しわかりにくいかもしれません。したがって、このファイルで何が起こっているのかを理解してみましょう。log4jには、アペンダーとロガーの2つの基本的な構造があります。
アペンダー物を追加する方法と場所を定義します。ファイル、コンソール、データベースなどに記録されますか?この場合、fileAppenderに向けられたログステートメントがlayoutタグで指定されたパターンを使用してファイルsample.log
に配置されるように指定しています。コンソールまたはデータベースのアペンダーを簡単に作成できます。コンソールアペンダーが画面上のレイアウトなどを指定し、データベースアペンダーが接続の詳細とテーブル名を持つ場合。
Loggersログイベントがバブルアップしたときに応答します。イベントが特定のロガーの興味を引くと、そのアペンダーを呼び出します。以下の例では、ルートロガーは1つしかありません。これは、デフォルトですべてのロギングイベントに応答します。ルートロガーに加えて、特定のパッケージからのイベントに応答するより具体的なロガーを指定できます。これらのロガーは、appender-ref
タグを使用して指定された独自のアペンダーを持つことができます。そうでなければ、ルートロガーからアペンダーを継承します。より具体的なロガーを使用すると、特定のパッケージのログレベルを微調整したり、特定のパッケージを他のアペンダーに転送したりできます。
したがって、このファイルが言っているのは:
最終的には、コードにlogger.debug("blah blah")
が含まれていると、無視されます。 logger.info("Blah blah");
は、sample.logに出力されます。
次のスニペットは、log4jタグを使用して上記のファイルに追加できます。このロガーは、アペンダーを<root>
から継承しますが、パッケージorg.springframework
からのすべてのロギングイベントをレベルinfo
以上で記録されたイベントに制限します。
<!-- Example Package level Logger -->
<logger name="org.springframework">
<level value="info"/>
</logger>
これは私がよく使うシンプルなものです:
# Set up logging to include a file record of the output
# Note: the file is always created, even if there is
# no actual output.
log4j.rootLogger=error, stdout, R
# Log format to standard out
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
# File based log output
log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=owls_conditions.log
log4j.appender.R.MaxFileSize=10000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
ログの形式は次のとおりです。
ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.Java:44)
http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
このような形式は、文字列%5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
によって定義されます。 log4j javadoc for PatternLayout
で変換文字の意味を読むことができます。
含まれているコメントは、それが何をするかを理解するのに役立つはずです。詳細なメモ:
owls_conditions.log
:必要に応じて変更します。これは私が大成功を収めて使用したlog4j.propertiesファイルです。
logDir=/var/log/myapp
log4j.rootLogger=INFO, stdout
#log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.File=${logDir}/myapp.log
log4j.appender.stdout.append=true
DailyRollingFileAppenderは、次のようなファイル名で毎日新しいファイルを作成します。
myapp.log.2017-01-27
myapp.log.2017-01-28
myapp.log.2017-01-29
myapp.log <-- today's log
ログファイルの各エントリは、次の形式になります。
01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1
01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar()
この投稿 で説明したように、-Dlog4j.configuration
を使用して上記のファイルの場所を設定します。
Java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
Javaコードでは、ロガーオブジェクトをインスタンス化するときに、各ソフトウェアコンポーネントの名前を必ず設定してください。また、ログファイルと標準出力の両方にログを記録するのが好きなので、この小さな関数を作成しました。
private static final Logger LOGGER = Logger.getLogger("Component1");
public static void log(org.Apache.log4j.Logger logger, String message) {
logger.info(message);
System.out.printf("%s\n", message);
}
public static String stackTraceToString(Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
}
そして、次のように呼び出します:
LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));