私は、ログファイルを対応するにログインするためのタグ(好ましくテキスト)の必要性に基づいて、すべてのログを、このようなログファイルを作成する必要が前記の要件を持っています。
例えば、
私は、リンゴ、オレンジ、マンゴーやに関するログを持っています。
logger.info("Apples: They are red in color");
logger.info("Oranges: They are orange in color");
logger.info("Mangoes: They are yellowish in color");
私の要件ごとに、最初のログはにログインする必要がありApples.log、2番目Oranges.log及び第3 Mangoes.log
ログファイルには、動的に作成する必要があります。
示さ下には私ですlogback.xmlのファイル
<statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>
%d %-5p - %marker%m%n
</Pattern>
</encoder>
</appender>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>fruitName</key>
<defaultValue>Common_logs</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${instanceName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./Logs/${fruitName}/${instanceName}.log</fileNamePattern>
<maxHistory>50</maxHistory>
<cleanHistoryOnStart>false</cleanHistoryOnStart>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d %-5p - %m%n</pattern>
</encoder>
</appender>
</sift>
</appender>
<logger name="AssetInstanceService" level="info" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="SIFT" />
</logger>
<root level="info">
<appender-ref ref="SIFT" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
下記の私ですLogManager.javaのファイル
package Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
public class LogManager {
static String configFile = "./logback.xml";
private static Logger _logger = LoggerFactory.getLogger(LogManager.class);
private static boolean _isInitialized = false;
private LogManager() {
}
public static Logger Instance() {
if (_logger == null) {
_logger = LoggerFactory.getLogger(LogManager.class);
}
return _logger;
}
public static Logger Instance(String instanceName) {
if (!_isInitialized) {
if (!CommonMethods.CheckFileExist(configFile)) {
configFile = "../logback.xml";
if (!CommonMethods.CheckFileExist(configFile)) {
return null;
}
}
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
lc.reset();
configurator.setContext(lc);
try {
configurator.doConfigure(configFile);
MDC.put("fruitName", instanceName);
} catch (JoranException e) {
System.out.println(e);
}
_isInitialized = true;
}
if (_logger == null) {
_logger = LoggerFactory.getLogger(LogManager.class);
}
return _logger;
}
}
私は私のメインメソッドでロガーを初期化するようjarファイルが実行されたときにここに私のログが作成されます。
しかし、私の必要性は、ログ内のタグやIDに基づいて、異なる名前で作成した別のログファイルを持つことです。
SLF4JとLog4jの-APIを使用すると、あなたがやりたいマーカーを提供しています。SLF4Jではあなたがあなたのマーカーを作成します。
Marker apples = MarkerFactory.getMarker("Apples");
Marker oranges = MarkerFactory.getMarker("Oranges");
Marker mangos = MarkerFactory.getMarker("Mangos");
あなたができるので、また、マーカーは、親を持つことができます。
Marker fruit = MarkerFactory.getMarker("Fruit");
Marker apples = MarkerFactory.getMarker("Apples");
apples.add(fruit);
Marker oranges = MarkerFactory.getMarker("Oranges");
apples.add(fruit);
Marker mangos = MarkerFactory.getMarker("Mangos");
apples.add(fruit);
コンフィギュレーションでは、いずれかの特定のマーカーを確認することができたり、フルーツをされているすべてのマーカーをチェックしたい場合には、そのマーカーをチェックします。
あなたは、その後、あなたのアプリケーションにマーカーを使用します。
logger.info(apples, "They are red in color");
logger.info(oranges, "They are orange in color");
logger.info(mangoes, "They are yellowish in color");
最後に、あなたの設定で、あなたは何をするターボフィルターを使用することができます。
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>Apples</Marker>
<OnMatch>NEUTRAL</OnMatch>
<OnMismatch>DENY</OnMismatch>
</turboFilter>
グローバルレベルでのフィルターにまたはあなたがアペンダにフィルターに評価者のフィルタのいずれかを使用することができます。また、使用することができSiftingAppenderをカスタム弁別を書いた場合、動的にアペンダを作成します。
物事はLog4jのAPIで少し簡単です。親なしでマーカーを作成するには:
Marker apples = MarkerManager.getMarker("Apples");
Marker oranges = MarkerManager.getMarker("Oranges");
Marker mangos = MarkerManager.getMarker("Mangos");
または親を持ちます:
Marker fruit = MarkerManager.getMarker("Fruit");
Marker apples = MarkerManager.getMarker("Apples").setParents(fruit);
Marker oranges = MarkerManager.getMarker("Oranges").setParents(fruit);
Marker mangos = MarkerManager.getMarker("Mangos").setParents(fruit);
Log4jの中でそれらを使用するためのコードはまったく同じです。
logger.info(apples, "They are red in color");
logger.info(oranges, "They are orange in color");
logger.info(mangoes, "They are yellowish in color");
大きな違いは、コンフィギュレーションです。log4jはフィルタのみの一種類を有しており、それが(ターボフィルターなど)、グローバルレベルまたはロガー、アペンダ基準に、またはアペンダに使用することができます。あなたのケースでは、使用したいMarkerFilterを:
<MarkerFilter marker="Apples" onMatch="NEUTRAL" onMismatch="DENY"/>
各アペンダー参照または各アペンダのいずれかにそれを追加します。
SiftingAppender Log4jのと同様にも提供していRoutingAppenderを。これは、ルーティングを実行する方法を決定するためにルックアップを使用しています。箱から出してLog4jには、ログイベントからデータを取得するものを提供していませんが、1を書いたりするのは簡単だろうLog4jの1つを追加するか、イベントからのマーカーを取得するためのスクリプトを使用することができます。
あなたはあまりしていないが、MarkerFiltersを使用するいくつかのオーバーヘッドがあることを認識する必要があります。ここにlog4j-PERFモジュール私のMacBook Proの上で4つのスレッドを実行しているからベンチマークです。でもLogbackは、それぞれの比較はまだ唯一の平均で17ナノ秒を要する子マーカーを含むイベントに対する親のマーカーをチェックして、最悪の場合には
Benchmark Mode Cnt Score Error Units
MarkerFilterBenchmark.baseline avgt 10 2.412 ± 0.088 ns/op
MarkerFilterBenchmark.log4jParentMarker avgt 10 8.337 ± 0.186 ns/op
MarkerFilterBenchmark.log4jSimpleMarker avgt 10 8.043 ± 0.145 ns/op
MarkerFilterBenchmark.log4jTooFine avgt 10 2.825 ± 0.281 ns/op
MarkerFilterBenchmark.logbackParentMarker avgt 10 17.865 ± 0.533 ns/op
MarkerFilterBenchmark.logbackSimpleMarker avgt 10 10.471 ± 0.089 ns/op
MarkerFilterBenchmark.logbackTooFine avgt 10 4.255 ± 0.014 ns/op
最終的な思考。彼はSLF4Jを作成したときCeki Gulcuは、マーカーの概念を発明し、彼はそれは素晴らしいアイデアだったように、そのための信用に値します。